61#ifndef LIB_UNINITIALISED_STORAGE_H
62#define LIB_UNINITIALISED_STORAGE_H
78 template<
typename T,
size_t cnt =1>
81 using _Arr = std::array<T,cnt>;
88 return * std::launder (
reinterpret_cast<_Arr*
> (&
buffer_));
94 return * std::launder (
reinterpret_cast<_Arr const*
> (&
buffer_));
105 template<
typename...Args>
109 return *
new(&
operator[](idx)) T{std::forward<Args>(args)...};
118 static constexpr size_t size() {
return cnt; }
142 buff_ = cnt? std::aligned_alloc (std::alignment_of<T>(), cnt *
sizeof(T))
188 operator bool()
const
203 return * std::launder (
reinterpret_cast<_Arr*
> (
buff_));
209 return * std::launder (
reinterpret_cast<_Arr const*
> (
buff_));
224 template<
typename...Args>
228 return *
new(&
operator[](idx)) T{std::forward<Args>(args)...};
Managed uninitialised Heap-allocated storage with array like access.
UninitialisedDynBlock()=default
UninitialisedDynBlock(UninitialisedDynBlock const &)=delete
T & createAt(size_t idx, Args &&...args)
_Arr const & array() const
T & operator[](size_t idx)
UninitialisedDynBlock(size_t cnt)
UninitialisedDynBlock & operator=(UninitialisedDynBlock &&)=delete
UninitialisedDynBlock(UninitialisedDynBlock &&rr)
void destroyAt(size_t idx)
friend void swap(UninitialisedDynBlock &u1, UninitialisedDynBlock &u2)
Block of raw uninitialised storage with array like access.
static constexpr size_t size()
T & createAt(size_t idx, Args &&...args)
std::array< T, cnt > _Arr
_Arr const & array() const
T & operator[](size_t idx)
void destroyAt(size_t idx)
std::byte buffer_[sizeof(_Arr)]
Implementation namespace for support and library code.