Cpp Utilities 1.2.3
Public Types | Public Member Functions | List of all members
Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock > Class Template Reference

Proxy class for operator[] in SafeSharedPtr, behave like array element of underlying array object, and provide RAII read-write lock for thread safety. More...

#include <SafeSharedPtr.hpp>

Public Types

using element_type = std::remove_extent_t< T >
 Element type of array T. More...
 
using pointer = element_type *
 Pointer type of element. More...
 
using const_pointer = const element_type *
 Const pointer type of element. More...
 
using reference = element_type &
 Reference type of element. More...
 
using const_reference = const element_type &
 Const eference type of element. More...
 

Public Member Functions

 ArrayHelper (const SafeSharedPtr &p, std::ptrdiff_t idx)
 Constructor a constant ArrayHelper to gain access to element of object managed by SafeSharedPtr. More...
 
 ArrayHelper (ArrayHelper &&other) noexcept
 Move constructor, transport ownership to another ArrayHelper, keep existing lock state. More...
 
 ~ArrayHelper ()
 Destructor, release Lock if exists. More...
 
ArrayHelperoperator= (ArrayHelper &&other)
 Move assigment, transport ownership to another ArrayHelper, keep existing lock state. More...
 
 operator reference ()
 Operator overload to act as element_type&. More...
 
 operator const_reference () const
 Operator overload to act as const element_type&. More...
 
template<typename X >
ArrayHelperoperator= (const X &other)
 Assign operator to assign from another value. More...
 

Detailed Description

template<typename T, typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock>
class Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >

Proxy class for operator[] in SafeSharedPtr, behave like array element of underlying array object, and provide RAII read-write lock for thread safety.

Template Parameters
LockLock type used for protect the object.
Note
Copy constructor and copy assignment are deleted to prevent multiply locks, use std::move with move constructor and move assignment to transport it's ownership, or simply use it like type T* or T&.
Because operator. cannot be overloaded, pPoints[0].x cannot compile, use Point(pPoints[0]).x instead. Sorry for that.
Warning
Behavior is undefined if T is not array type.
See also
SafeSharedPtr

Member Typedef Documentation

◆ element_type

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
using Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::element_type = std::remove_extent_t<T>

Element type of array T.

◆ pointer

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
using Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::pointer = element_type*

Pointer type of element.

◆ const_pointer

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
using Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::const_pointer = const element_type*

Const pointer type of element.

◆ reference

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
using Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::reference = element_type&

Reference type of element.

◆ const_reference

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
using Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::const_reference = const element_type&

Const eference type of element.

Constructor & Destructor Documentation

◆ ArrayHelper() [1/2]

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::ArrayHelper ( const SafeSharedPtr p,
std::ptrdiff_t  idx 
)
inline

Constructor a constant ArrayHelper to gain access to element of object managed by SafeSharedPtr.

Will construct Lock object to guard the pointer.

Parameters
pSafeSharedPtr to access from.
idxIndex for element in array to access from.

◆ ArrayHelper() [2/2]

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::ArrayHelper ( ArrayHelper< Lock > &&  other)
inlinenoexcept

Move constructor, transport ownership to another ArrayHelper, keep existing lock state.

Parameters
otherAnother ArrayHelper to move to.

◆ ~ArrayHelper()

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::~ArrayHelper ( )
inline

Destructor, release Lock if exists.

Member Function Documentation

◆ operator=() [1/2]

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
ArrayHelper & Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::operator= ( ArrayHelper< Lock > &&  other)
inline

Move assigment, transport ownership to another ArrayHelper, keep existing lock state.

Parameters
otherAnother ArrayHelper to move to.
Returns
*this with empty content.

◆ operator reference()

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::operator reference ( )
inline

Operator overload to act as element_type&.

Returns
element_type&.

◆ operator const_reference()

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::operator const_reference ( ) const
inline

Operator overload to act as const element_type&.

Returns
const element_type&.

◆ operator=() [2/2]

template<typename T , typename mutex_t = shared_mutex_t, typename read_lock_t = shared_lock_t, typename write_lock_t = unique_lock_t>
template<typename Lock >
template<typename X >
ArrayHelper & Memory::SafeSharedPtr< T, mutex_t, read_lock_t, write_lock_t >::ArrayHelper< Lock >::operator= ( const X &  other)
inline

Assign operator to assign from another value.

Template Parameters
XType of input, X& must be implicitly convertible to element_type&.
Parameters
otherInput value to be assigned from.

Used for situations like:

auto ptr = make_shared<int[10]>(0);
ptr[0] = 42;

The documentation for this class was generated from the following file: