50template<
typename T,
typename TAllocator= HeapAllocator>
77 FieldMembers( TAllocator& pAllocator, T* pCustom,
size_t pAllocSize)
105 return reinterpret_cast<T&
>(
members->u);
134 :
members(other.members) { other.members=
nullptr; }
144 if (
this == &other || this->members == other.members)
154 if((
members= other.members) !=
nullptr)
177 other.members=
nullptr;
192 template<
typename... TArgs,
typename TRequires= TAllocator>
193 requires ( !std::default_initializable<TRequires> )
195 auto* mem= allocator().template Alloc<FieldMembers<T>>();
196 members =
reinterpret_cast<FieldMembers<void*>*
>(mem);
197 new (
members) FieldMembers<void*>(allocator, &mem->u,
sizeof(FieldMembers<T>));
198 new (&mem->u) T(std::forward<TArgs>(args)...);
215 template <
typename... TArgs,
typename TRequires= TAllocator>
216 requires( std::is_default_constructible_v<TRequires>
217 && !std::is_same_v<std::decay_t<TArgs>... ,
SharedPtr>
218 && (
sizeof...(TArgs) > 0) )
220 auto* mem= TAllocator()().
template Alloc<FieldMembers<T>>();
221 members =
reinterpret_cast<FieldMembers<void*>*
>(mem);
222 new (
members) FieldMembers<void*>(&mem->u,
sizeof(FieldMembers<T>));
223 new (&mem->u) T(std::forward<TArgs>(args)...);
236 template <
typename TDerived,
typename TRequires= TAllocator,
typename... TArgs>
237 requires std::is_default_constructible_v<TRequires>
242 auto* mem= TAllocator()().
template Alloc<FieldMembers<TDerived>>();
243 members =
reinterpret_cast<FieldMembers<void*>*
>(mem);
245 sizeof(FieldMembers<TDerived>) );
246 new (&mem->u) TDerived(std::forward<TArgs>(args)...);
260 template <
typename TDerived,
typename TRequires= TAllocator,
typename... TArgs>
261 requires( !std::is_default_constructible_v<TRequires> )
268 auto* mem= allocator().template Alloc<FieldMembers<TDerived>>();
269 members =
reinterpret_cast<FieldMembers<void*>*
>(mem);
270 new (
members) FieldMembers<void*>( allocator,
272 sizeof(FieldMembers<TDerived>) );
273 new (&mem->u) TDerived(std::forward<TArgs>(args)...);
287 template<
typename TStored= T>
288 static constexpr size_t SizeOfAllocation() noexcept {
return sizeof(FieldMembers<TStored>); }
294 return members->GetAllocator();
333 operator bool() const noexcept {
return members !=
nullptr; }
352template<
typename T,
typename TAllocator= lang::HeapAllocator>
T StoredType
Exposes the stored type specified with template parameter T.
void InsertDerived(TAllocator &allocator, TArgs &&... args)
bool operator==(std::nullptr_t) const noexcept
AllocatorType & GetAllocator() const
static constexpr size_t SizeOfAllocation() noexcept
bool Unique() const noexcept
SharedPtr(const SharedPtr &other) noexcept
lang::AllocatorInterface< TAllocator > AI() const noexcept
TAllocator AllocatorType
Exposes the allocator as given with template parameter TAllocator.
T & getR() const noexcept
SharedPtr & operator=(SharedPtr &&other) noexcept
FieldMembers< void * > * members
SharedPtr(TAllocator &allocator, TArgs &&... args)
void InsertDerived(TArgs &&... args)
SharedPtr & operator=(const SharedPtr &other) noexcept
SharedPtr(std::nullptr_t) noexcept
unsigned UseCount() const noexcept
SharedPtr(TArgs &&... args)
void operator=(std::nullptr_t)
Assignment of nullptr. Same as SetNulled.
bool IsNulled() const noexcept
bool operator!=(std::nullptr_t) const noexcept
SharedPtr() noexcept
Default Constructor. Leaves this object nulled.
T * getP() const noexcept
SharedPtr(SharedPtr &&other) noexcept
#define ALIB_ASSERT_ERROR(cond, domain,...)
ALIB_WARNINGS_RESTORE TTo * SafeCast(TFrom *derived)
containers::SharedPtr< T, TAllocator > SharedPtr
Type alias in namespace alib.
FieldMembers(TAllocator &pAllocator, T *pCustom, size_t pAllocSize)
size_t allocSize
The size of the allocated pair of these fields and the custom type.
std::atomic< unsigned > refCount
The reference counter used to implement the std::shared_ptr behavior.
T * custom
The duly cast pointer to the custom type behind us.
FieldMembers(T *pCustom, size_t pAllocSize)
U u
The instance, either derived or T.