@@ -56,15 +56,17 @@ using inplace_vector_internal_size_type =
5656 If<Capacity <= std::numeric_limits<uint32_t >::max(), uint32_t ,
5757 uint64_t >>>;
5858
59+ template <typename T, std::size_t Capacity>
60+ using inplace_vector_array_type =
61+ If<!std::is_const_v<T>, std::array<T, Capacity>,
62+ const std::array<std::remove_const_t <T>, Capacity>>;
63+
5964// array based storage is used so that we can satisfy constexpr requirement
6065//
6166// Selecting this storage type implies: std::is_trivial_v<T> or Capacity = 0
6267template <typename T, std::size_t Capacity>
63- struct inplace_vector_array_based_storage {
64- using array_type = If<!std::is_const_v<T>, std::array<T, Capacity>,
65- const std::array<std::remove_const_t <T>, Capacity>>;
66-
67- array_type elems{};
68+ struct inplace_vector_type_based_storage {
69+ inplace_vector_array_type<T, Capacity> elems{};
6870
6971 constexpr T *begin () { return elems.data (); }
7072 constexpr const T *begin () const { return elems.data (); }
@@ -76,7 +78,7 @@ struct inplace_vector_array_based_storage {
7678// Selecting this storage type implies: !std::is_trivial_v<T> and Capacity != 0
7779template <typename T, std::size_t Capacity>
7880struct inplace_vector_bytes_based_storage {
79- alignas (T) std::byte elems[ Capacity * sizeof (T)] ;
81+ alignas (T) inplace_vector_array_type< std::byte, Capacity * sizeof (T)> elems ;
8082
8183 T *begin () { return std::launder (reinterpret_cast <const T *>(elems)); }
8284 const T *begin () const {
@@ -91,7 +93,7 @@ struct inplace_vector_destruct_base {
9193 using internal_size_type = inplace_vector_internal_size_type<Capacity>;
9294 using internal_storage_type =
9395 std::conditional_t <std::is_trivial_v<T> or Capacity == 0 ,
94- inplace_vector_array_based_storage <T, Capacity>,
96+ inplace_vector_type_based_storage <T, Capacity>,
9597 inplace_vector_bytes_based_storage<T, Capacity>>;
9698
9799 internal_storage_type elems;
0 commit comments