#include #include #include "gtest/gtest.h" #include "libpmr/small_storage.h" TEST(pmr_small_storage, holder_construct) { pmr::holder_null(); pmr::holder(); pmr::holder(); pmr::holder(); pmr::holder(); SUCCEED(); } TEST(pmr_small_storage, holder_copy_move_construct) { EXPECT_FALSE(std::is_copy_constructible::value); EXPECT_FALSE((std::is_copy_constructible>::value)); EXPECT_FALSE((std::is_copy_constructible>::value)); EXPECT_FALSE((std::is_copy_constructible>::value)); EXPECT_FALSE((std::is_copy_constructible>::value)); EXPECT_FALSE(std::is_copy_assignable::value); EXPECT_FALSE((std::is_copy_assignable>::value)); EXPECT_FALSE((std::is_copy_assignable>::value)); EXPECT_FALSE((std::is_copy_assignable>::value)); EXPECT_FALSE((std::is_copy_assignable>::value)); EXPECT_FALSE(std::is_move_constructible::value); EXPECT_FALSE((std::is_move_constructible>::value)); EXPECT_FALSE((std::is_move_constructible>::value)); EXPECT_FALSE((std::is_move_constructible>::value)); EXPECT_FALSE((std::is_move_constructible>::value)); EXPECT_FALSE(std::is_move_assignable::value); EXPECT_FALSE((std::is_move_assignable>::value)); EXPECT_FALSE((std::is_move_assignable>::value)); EXPECT_FALSE((std::is_move_assignable>::value)); EXPECT_FALSE((std::is_move_assignable>::value)); } namespace { struct foo { int i; foo(int i) : i(i) {} foo(foo const &rhs) : i(rhs.i) {} foo(foo &&rhs) : i(std::exchange(rhs.i, 0)) {} }; } // namespace TEST(pmr_small_storage, holder_copy_move_object_stack) { pmr::allocator alc; pmr::holder h1(alc, 1); pmr::holder h2, h3; h1.copy_to(alc, &h2); EXPECT_EQ(static_cast(h1.get())->i, 1); EXPECT_EQ(static_cast(h2.get())->i, 1); h1.move_to(alc, &h3); EXPECT_EQ(static_cast(h1.get())->i, 0); EXPECT_EQ(static_cast(h3.get())->i, 1); h1.destroy(alc); h2.destroy(alc); h3.destroy(alc); } TEST(pmr_small_storage, holder_copy_move_object_heap) { pmr::allocator alc; pmr::holder h4(alc, 1); pmr::holder h5, h6; h4.copy_to(alc, &h5); EXPECT_EQ(static_cast(h4.get())->i, 1); EXPECT_EQ(static_cast(h5.get())->i, 1); h4.move_to(alc, &h6); EXPECT_EQ(static_cast(h4.get())->i, 0); EXPECT_EQ(static_cast(h6.get())->i, 1); h4.destroy(alc); h5.destroy(alc); h6.destroy(alc); } TEST(pmr_small_storage, holder_copy_move_array_stack) { pmr::allocator alc; void *ph1 = std::malloc(pmr::holder::full_sizeof(10)); void *ph2 = std::malloc(pmr::holder::full_sizeof(10)); void *ph3 = std::malloc(pmr::holder::full_sizeof(10)); auto *h7 = ::new (ph1) pmr::holder(alc, ::LIBIMP::types{}, 10); auto *h8 = static_cast *>(ph2); auto *h9 = static_cast *>(ph3); h7->copy_to(alc, ph2); EXPECT_EQ(h7->count(), 10); EXPECT_EQ(h8->count(), 10); h7->move_to(alc, ph3); EXPECT_EQ(h7->count(), 0); EXPECT_EQ(h9->count(), 10); h7->destroy(alc); h8->destroy(alc); h9->destroy(alc); std::free(ph1); std::free(ph2); std::free(ph3); } TEST(pmr_small_storage, holder_copy_move_array_heap) { pmr::allocator alc; pmr::holder h10(alc, ::LIBIMP::types{}, 10); pmr::holder h11, h12; h10.copy_to(alc, &h11); EXPECT_EQ(h10.count(), 10); EXPECT_EQ(h11.count(), 10); h10.move_to(alc, &h12); EXPECT_EQ(h10.count(), 0); EXPECT_EQ(h12.count(), 10); h10.destroy(alc); h11.destroy(alc); h12.destroy(alc); } TEST(pmr_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), imp::round_up(sizeof(void *) + sizeof(pmr::detail::holder_data), alignof(std::max_align_t))); EXPECT_EQ(sizeof(pmr::holder), sizeof(void *) + sizeof(void *)); // pmr::small_storage<4> s1; EXPECT_GT(sizeof(pmr::small_storage<16>) , 16); EXPECT_GT(sizeof(pmr::small_storage<64>) , 64); EXPECT_GT(sizeof(pmr::small_storage<512>) , 512); EXPECT_GT(sizeof(pmr::small_storage<4096>), 4096); } TEST(pmr_small_storage, construct) { pmr::small_storage<64> ss; SUCCEED(); } TEST(pmr_small_storage, acquire) { pmr::small_storage<128> ss; pmr::allocator alc; ASSERT_FALSE(ss.valid()); int *p = ss.acquire(alc, 3); ASSERT_TRUE(ss.valid()); ASSERT_NE(p, nullptr); ASSERT_EQ(*p, 3); ASSERT_EQ(p, ss.as()); ASSERT_EQ(ss.count(), 1); ASSERT_EQ(ss.sizeof_heap(), 0); ASSERT_EQ(ss.sizeof_type(), sizeof(int)); p = ss.acquire(alc, 3); ASSERT_TRUE(ss.valid()); ASSERT_NE(p, nullptr); ASSERT_EQ(p, ss.as()); ASSERT_EQ(ss.count(), 3); ASSERT_EQ(ss.sizeof_heap(), 0); ASSERT_EQ(ss.sizeof_type(), sizeof(int)); p = ss.acquire(alc, 30); ASSERT_TRUE(ss.valid()); ASSERT_NE(p, nullptr); ASSERT_EQ(p, ss.as()); ASSERT_EQ(ss.count(), 30); ASSERT_EQ(ss.sizeof_heap(), sizeof(int) * 30 + sizeof(pmr::detail::holder_info)); ASSERT_EQ(ss.sizeof_type(), sizeof(int)); ss.release(alc); SUCCEED(); }