diff --git a/include/libpmr/small_storage.h b/include/libpmr/small_storage.h index fd08cba..bc29f64 100644 --- a/include/libpmr/small_storage.h +++ b/include/libpmr/small_storage.h @@ -454,7 +454,7 @@ public: template class small_storage { - static_assert(N > sizeof(holder), "N must be greater than sizeof(holder)"); + static_assert(N >= sizeof(holder), "N must be greater than sizeof(holder)"); alignas(std::max_align_t) std::array<::LIBIMP::byte, N> storage_; @@ -467,11 +467,11 @@ public: } holder_base *get_holder() noexcept { - return static_cast(storage_.data()); + return reinterpret_cast(storage_.data()); } holder_base const *get_holder() const noexcept { - return static_cast(storage_.data()); + return reinterpret_cast(storage_.data()); } bool valid() const noexcept { diff --git a/test/pmr/test_pmr_small_storage.cpp b/test/pmr/test_pmr_small_storage.cpp index 6300f64..6e7b547 100644 --- a/test/pmr/test_pmr_small_storage.cpp +++ b/test/pmr/test_pmr_small_storage.cpp @@ -99,5 +99,21 @@ TEST(small_storage, holder_copy_move) { h12.destroy(alc); } -TEST(small_storage, construct) { +TEST(small_storage, sizeof) { + EXPECT_EQ(sizeof(pmr::holder_null), sizeof(void *)); + EXPECT_EQ(sizeof(pmr::holder), sizeof(void *) + imp::round_up(sizeof(int), alignof(void *))); + EXPECT_EQ(sizeof(pmr::holder), sizeof(void *) + sizeof(void *)); + EXPECT_EQ(sizeof(pmr::holder), sizeof(void *) + sizeof(void *) + sizeof(pmr::detail::holder_info)); + EXPECT_EQ(sizeof(pmr::holder), sizeof(void *) + sizeof(void *)); + + // pmr::small_storage<4> s1; + EXPECT_EQ(sizeof(pmr::small_storage<16>) , 16); + EXPECT_EQ(sizeof(pmr::small_storage<64>) , 64); + EXPECT_EQ(sizeof(pmr::small_storage<512>) , 512); + EXPECT_EQ(sizeof(pmr::small_storage<4096>), 4096); +} + +TEST(small_storage, construct) { + pmr::small_storage<64> ss; + SUCCEED(); }