#include #include #include "gtest/gtest.h" #include "libpmr/block_pool.h" TEST(block_pool, central_cache_allocator) { auto &a = pmr::central_cache_allocator(); ASSERT_FALSE(nullptr == a.allocate(1)); ASSERT_FALSE(nullptr == a.allocate(10)); ASSERT_FALSE(nullptr == a.allocate(100)); ASSERT_FALSE(nullptr == a.allocate(1000)); ASSERT_FALSE(nullptr == a.allocate(10000)); } TEST(block_pool, block) { pmr::block<1> b1; EXPECT_EQ(sizeof(b1), (std::max)(alignof(std::max_align_t), sizeof(void *))); pmr::block b2; EXPECT_EQ(sizeof(b2), (std::max)(alignof(std::max_align_t), sizeof(void *))); pmr::block b3; EXPECT_EQ(sizeof(b3), (std::max)(alignof(std::max_align_t), sizeof(void *) * 2)); } TEST(block_pool, central_cache_pool_ctor) { ASSERT_FALSE((std::is_default_constructible, 1>>::value)); ASSERT_FALSE((std::is_copy_constructible, 1>>::value)); ASSERT_FALSE((std::is_move_constructible, 1>>::value)); ASSERT_FALSE((std::is_copy_assignable, 1>>::value)); ASSERT_FALSE((std::is_move_assignable, 1>>::value)); { auto &pool = pmr::central_cache_pool, 1>::instance(); pmr::block<1> *b1 = pool.aqueire(); ASSERT_FALSE(nullptr == b1); ASSERT_TRUE (nullptr == b1->next); pool.release(b1); pmr::block<1> *b2 = pool.aqueire(); EXPECT_EQ(b1, b2); pmr::block<1> *b3 = pool.aqueire(); ASSERT_FALSE(nullptr == b3); ASSERT_TRUE (nullptr == b3->next); EXPECT_NE(b1, b3); } { auto &pool = pmr::central_cache_pool, 2>::instance(); pmr::block<1> *b1 = pool.aqueire(); ASSERT_FALSE(nullptr == b1); ASSERT_FALSE(nullptr == b1->next); ASSERT_TRUE (nullptr == b1->next->next); pool.release(b1); pmr::block<1> *b2 = pool.aqueire(); EXPECT_EQ(b1, b2); pmr::block<1> *b3 = pool.aqueire(); EXPECT_NE(b1, b3); pmr::block<1> *b4 = pool.aqueire(); ASSERT_FALSE(nullptr == b4); ASSERT_FALSE(nullptr == b4->next); ASSERT_TRUE (nullptr == b4->next->next); EXPECT_NE(b1, b4); } }