36 template <
typename F,
typename T >
37 static F
_copy_n( F first, std::size_t n, T* dest )
39 if constexpr ( std::is_trivially_copy_constructible_v< T > ) {
40 std::memcpy( dest, &*first, n *
sizeof( T ) );
43 static_cast< typename std::iterator_traits< F >::difference_type
>(
47 for ( std::size_t i = 0; i < n; ++i, ++first, ++dest )
48 ::
new ( dest ) T( *first );
53 template <
typename F,
typename T >
54 static F
_move_n( F first, std::size_t n, T* dest )
56 if constexpr ( std::is_trivially_move_constructible_v< T > ) {
57 std::memcpy( dest, &*first, n *
sizeof( T ) );
60 static_cast< typename std::iterator_traits< F >::difference_type
>(
64 for ( std::size_t i = 0; i < n; ++i, ++first, ++dest )
65 ::
new ( dest ) T( std::move( *first ) );
73 template <
typename T, std::
size_t N >
88 return reinterpret_cast< pointer >( data_ );
98 template <
typename... Args >
100 std::is_nothrow_constructible_v< T, Args... > )
102 return *std::construct_at(
data() + i, std::forward< Args >(
args )... );
107 std::is_nothrow_copy_constructible_v< T > )
114 std::is_nothrow_move_constructible_v< T > )
121 std::is_nothrow_destructible_v< T > )
124 std::destroy_at(
data() + i + j );
131 std::destroy_at(
data() + i );
137 return *(
data() + i );
143 return *(
data() + i );
147 alignas( T )
std::byte data_[
N *
sizeof( T )];
150 template <
typename T >
152 std::is_trivially_default_constructible_v< T > && std::is_trivially_destructible_v< T >;
154 template <
typename T, std::
size_t N >
158 static constexpr std::size_t capacity =
N;
180 template <
typename... Args >
182 std::is_nothrow_constructible_v< T, Args... > )
184 data_[i] = T{ std::forward< Args >(
args )... };
190 std::is_nothrow_copy_constructible_v< T > )
197 std::is_nothrow_move_constructible_v< T > )
MIT License.
Definition: impl.h:31
constexpr void delete_item(size_type const) noexcept
Deconstructs an item at position i.
Definition: static_storage.h:207
std::size_t size_type
Definition: static_storage.h:165
constexpr pointer data() noexcept
Returns pointer to first item of the storage.
Definition: static_storage.h:168
T const * const_pointer
Definition: static_storage.h:164
T & reference
Definition: static_storage.h:161
constexpr reference operator[](size_type const i) noexcept
Provides a reference to item at position i.
Definition: static_storage.h:212
concept trivial_for_static_storage
Definition: static_storage.h:151
constexpr auto move_n(size_type const i, size_type const n, auto iter) noexcept(std::is_nothrow_move_constructible_v< T >)
Moves n items from iterator iter to storage starting at position i
Definition: static_storage.h:196
Args const & args
Definition: min_max.h:83
T * pointer
Definition: static_storage.h:163
T value_type
Definition: static_storage.h:160
constexpr T & emplace_item(size_type const i, Args &&... args) noexcept(std::is_nothrow_constructible_v< T, Args... >)
Constructs an item at position i with arguments args...
Definition: static_storage.h:181
requires(!range_container< Container >) const expr std
Returns index of an element in tuple 't', for which call to predicate f(x) holds true,...
Definition: algorithm.h:127
T const & const_reference
Definition: static_storage.h:162
constexpr void delete_n(size_type const, size_type const) noexcept
Definition: static_storage.h:202
N
Definition: static_storage.h:157
physical_quantity< 0, 0, 0, 0, 0, 0, 0, 0, 1 > byte
Definition: physical_quantity.h:118
constexpr auto copy_n(size_type const i, size_type const n, auto iter) noexcept(std::is_nothrow_copy_constructible_v< T >)
Copies n items from iterator iter to storage starting at position i
Definition: static_storage.h:189
Definition: static_storage.h:35
static F _copy_n(F first, std::size_t n, T *dest)
Definition: static_storage.h:37
static F _move_n(F first, std::size_t n, T *dest)
Definition: static_storage.h:54
Continuous data container that can contain N of uninitialized elements.
Definition: static_storage.h:75
T const & const_reference
Definition: static_storage.h:80
constexpr reference operator[](size_type const i) noexcept
Provides a reference to item at position i.
Definition: static_storage.h:135
static constexpr std::size_t capacity
Definition: static_storage.h:76
T * pointer
Definition: static_storage.h:81
T const * const_pointer
Definition: static_storage.h:82
constexpr auto move_n(size_type const i, size_type const n, auto iter) noexcept(std::is_nothrow_move_constructible_v< T >)
Moves n items from iterator iter to storage starting at position i
Definition: static_storage.h:113
std::size_t size_type
Definition: static_storage.h:83
constexpr T & emplace_item(size_type const i, Args &&... args) noexcept(std::is_nothrow_constructible_v< T, Args... >)
Constructs an item at position i with arguments args...
Definition: static_storage.h:99
constexpr const_pointer data() const noexcept
Returns pointer to first item of the storage.
Definition: static_storage.h:92
constexpr pointer data() noexcept
Returns pointer to first item of the storage.
Definition: static_storage.h:86
constexpr void delete_n(size_type const i, size_type const n) noexcept(std::is_nothrow_destructible_v< T >)
Deconstructs n items starting at position i.
Definition: static_storage.h:120
constexpr const_reference operator[](size_type const i) const noexcept
Provides a reference to item at position i.
Definition: static_storage.h:141
T & reference
Definition: static_storage.h:79
constexpr auto copy_n(size_type const i, size_type const n, auto iter) noexcept(std::is_nothrow_copy_constructible_v< T >)
Copies n items from iterator iter to storage starting at position i
Definition: static_storage.h:106
T value_type
Definition: static_storage.h:78
constexpr void delete_item(size_type const i) noexcept(std::is_nothrow_destructible_v< T >)
Deconstructs an item at position i.
Definition: static_storage.h:129