diff --git a/include/beman/inplace_vector/inplace_vector.hpp b/include/beman/inplace_vector/inplace_vector.hpp index 500b3f8..4eecb38 100644 --- a/include/beman/inplace_vector/inplace_vector.hpp +++ b/include/beman/inplace_vector/inplace_vector.hpp @@ -112,10 +112,7 @@ template struct trivial { using size_type = smallest_size_t; private: - // If value_type is const, then const std::array of non-const elements: - using array_based_storage = - std::conditional_t, std::array, - const std::array, N>>; + using array_based_storage = std::array, N>; alignas(alignof(T)) array_based_storage storage_data_{}; size_type storage_size_ = 0; @@ -123,7 +120,7 @@ template struct trivial { constexpr const T *storage_data() const noexcept { return storage_data_.data(); } - constexpr T *storage_data() noexcept { return storage_data_.data(); } + constexpr auto storage_data() noexcept { return storage_data_.data(); } constexpr size_type storage_size() const noexcept { return storage_size_; } constexpr void unsafe_set_size(size_t new_size) noexcept { IV_EXPECT(size_type(new_size) <= N && "new_size out-of-bounds [0, N]"); @@ -161,9 +158,7 @@ template struct non_trivial { using size_type = smallest_size_t; private: - using byte_based_storage = std::conditional_t< - !std::is_const_v, raw_byte_based_storage, - const raw_byte_based_storage, N>>; + using byte_based_storage = raw_byte_based_storage, N>; byte_based_storage storage_data_{}; // BUGBUG: test SIMD types size_type storage_size_ = 0; @@ -171,7 +166,9 @@ template struct non_trivial { constexpr const T *storage_data() const noexcept { return storage_data_.storage_data(0); } - constexpr T *storage_data() noexcept { return storage_data_.storage_data(0); } + constexpr auto storage_data() noexcept { + return storage_data_.storage_data(0); + } constexpr size_type storage_size() const noexcept { return storage_size_; } constexpr void unsafe_set_size(size_t new_size) noexcept { IV_EXPECT(size_type(new_size) <= N && "new_size out-of-bounds [0, N)"); @@ -323,7 +320,7 @@ struct inplace_vector_base : private storage::storage_for { requires(std::constructible_from) { IV_EXPECT(size() < capacity() && "inplace_vector out-of-memory"); - std::construct_at(end(), std::forward(args)...); + std::construct_at(storage_data() + size(), std::forward(args)...); unsafe_set_size(size() + size_type(1)); return this->back(); }