diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-06-17 00:23:38 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-06-18 00:05:33 +0200 |
commit | a89f23da8fddfa7adb28cb8d5fafdfbfe4e485b8 (patch) | |
tree | e46c729de613ef63f487e27a87d45b1be9a08c48 /asl/handle_pool/index_pool_tests.cpp | |
parent | 92f908ee1b1385c1c3e924e3349b55682238232e (diff) |
Add IndexPoolhandle_pool
Diffstat (limited to 'asl/handle_pool/index_pool_tests.cpp')
-rw-r--r-- | asl/handle_pool/index_pool_tests.cpp | 162 |
1 files changed, 158 insertions, 4 deletions
diff --git a/asl/handle_pool/index_pool_tests.cpp b/asl/handle_pool/index_pool_tests.cpp index 3156320..329fb4c 100644 --- a/asl/handle_pool/index_pool_tests.cpp +++ b/asl/handle_pool/index_pool_tests.cpp @@ -4,6 +4,7 @@ #include "asl/testing/testing.hpp" #include "asl/handle_pool/index_pool.hpp" +#include "asl/hashing/hash.hpp" enum Flags: uint8_t { kFlag0 = 0, @@ -19,6 +20,8 @@ static_assert(Cfg1::kValidMask == uint8_t{0x80}); static_assert(Cfg1::kIndexMask == uint8_t{0x0f}); static_assert(Cfg1::kGenMask == uint8_t{0x70}); static_assert(Cfg1::kGenShift == 4); +static_assert(Cfg1::kMaxGen == 7); +static_assert(Cfg1::kMaxIndex == 15); using Cfg2 = asl::index_pool_config<5, 5, Flags>; static_assert(Cfg2::kHasUser); @@ -31,6 +34,8 @@ static_assert(Cfg2::kGenMask == uint32_t{0x0000'03e0}); static_assert(Cfg2::kUserMask == uint32_t{0x0003'fc00}); static_assert(Cfg2::kGenShift == 5); static_assert(Cfg2::kUserShift == 10); +static_assert(Cfg2::kMaxGen == 31); +static_assert(Cfg2::kMaxIndex == 31); using Cfg3 = asl::index_pool_config<5, 6, Flags, 4>; static_assert(Cfg3::kHasUser); @@ -43,6 +48,8 @@ static_assert(Cfg3::kGenMask == uint16_t{0x07e0}); static_assert(Cfg3::kUserMask == uint16_t{0x7800}); static_assert(Cfg3::kGenShift == 5); static_assert(Cfg3::kUserShift == 11); +static_assert(Cfg3::kMaxGen == 63); +static_assert(Cfg3::kMaxIndex == 31); static_assert(asl::default_constructible<asl::index_pool_handle<5, 5, uint8_t>>); static_assert(asl::trivially_copy_constructible<asl::index_pool_handle<5, 5, uint8_t>>); @@ -51,16 +58,25 @@ static_assert(asl::trivially_copy_assignable<asl::index_pool_handle<5, 5, uint8_ static_assert(asl::trivially_move_assignable<asl::index_pool_handle<5, 5, uint8_t>>); static_assert(asl::trivially_destructible<asl::index_pool_handle<5, 5, uint8_t>>); +static_assert(asl::hashable<asl::index_pool_handle<5, 5, uint8_t>>); +static_assert(asl::has_niche<asl::index_pool_handle<5, 5, uint8_t>>); + ASL_TEST(default_is_invalid) { const asl::index_pool_handle<5, 5, uint8_t> idx; - ASL_TEST_EXPECT(!idx.is_valid()); + ASL_TEST_EXPECT(idx.is_null()); +} + +ASL_TEST(niche_is_invalid) +{ + const asl::index_pool_handle<5, 5, uint8_t> idx{asl::niche_t{}}; + ASL_TEST_EXPECT(idx.is_null()); } ASL_TEST(construct) { const asl::index_pool_handle<5, 5> idx(9, 11); - ASL_TEST_EXPECT(idx.is_valid()); + ASL_TEST_EXPECT(!idx.is_null()); ASL_TEST_EXPECT(idx.index() == 9); ASL_TEST_EXPECT(idx.gen() == 11); } @@ -68,14 +84,13 @@ ASL_TEST(construct) ASL_TEST(construct_user) { const asl::index_pool_handle<5, 5, Flags, 4> idx(9, 11, kFlag2); - ASL_TEST_EXPECT(idx.is_valid()); + ASL_TEST_EXPECT(!idx.is_null()); ASL_TEST_EXPECT(idx.index() == 9); ASL_TEST_EXPECT(idx.gen() == 11); ASL_TEST_EXPECT(idx.user() == kFlag2); static_assert(asl::same_as<Flags, decltype(idx.user())>); } - ASL_TEST(compare) // NOLINT { const asl::index_pool_handle<5, 5, Flags, 4> idx_default; @@ -108,3 +123,142 @@ ASL_TEST(compare) // NOLINT ASL_TEST_EXPECT(idx4 != idx5); } + +ASL_TEST(hashing) // NOLINT +{ + const asl::index_pool_handle<4, 4> idx0(asl::niche_t{}); + const asl::index_pool_handle<4, 4> idx1{}; + const asl::index_pool_handle<4, 4> idx2(1, 1); + const asl::index_pool_handle<4, 4> idx3(1, 1); + const asl::index_pool_handle<4, 4> idx4(2, 1); + const asl::index_pool_handle<4, 4> idx5(1, 2); + + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx1)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx2)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx3)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx2)); + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx3)); + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx2) == asl::hash_value(idx3)); + ASL_TEST_EXPECT(asl::hash_value(idx2) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx2) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx3) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx3) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx4) != asl::hash_value(idx5)); +} + +ASL_TEST(hashing_in_option) // NOLINT +{ + const asl::option<asl::index_pool_handle<4, 4>> idx0; + const asl::option<asl::index_pool_handle<4, 4>> idx1{asl::index_pool_handle<4, 4>()}; + const asl::option<asl::index_pool_handle<4, 4>> idx2{asl::index_pool_handle<4, 4>(1, 1)}; + const asl::option<asl::index_pool_handle<4, 4>> idx3{asl::index_pool_handle<4, 4>(1, 1)}; + const asl::option<asl::index_pool_handle<4, 4>> idx4{asl::index_pool_handle<4, 4>(2, 1)}; + const asl::option<asl::index_pool_handle<4, 4>> idx5{asl::index_pool_handle<4, 4>(1, 2)}; + + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx1)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx2)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx3)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx0) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx2)); + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx3)); + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx1) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx2) == asl::hash_value(idx3)); + ASL_TEST_EXPECT(asl::hash_value(idx2) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx2) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx3) != asl::hash_value(idx4)); + ASL_TEST_EXPECT(asl::hash_value(idx3) != asl::hash_value(idx5)); + + ASL_TEST_EXPECT(asl::hash_value(idx4) != asl::hash_value(idx5)); +} + +ASL_TEST(simple_pool) // NOLINT +{ + using Pool = asl::IndexPool<8, 8>; + Pool pool; + + auto a = pool.acquire_ensure({}); + auto b = pool.acquire_ensure({}); + + ASL_TEST_EXPECT(!a.is_null()); + ASL_TEST_EXPECT(!b.is_null()); + ASL_TEST_EXPECT(a.index() == 0); + ASL_TEST_EXPECT(b.index() == 1); + ASL_TEST_EXPECT(a.gen() == 0); + ASL_TEST_EXPECT(b.gen() == 0); + + ASL_TEST_EXPECT(a != b); + + ASL_TEST_EXPECT(pool.is_valid(a)); + ASL_TEST_EXPECT(pool.is_valid(b)); + + pool.release(a); + + ASL_TEST_EXPECT(!pool.is_valid(a)); + ASL_TEST_EXPECT(pool.is_valid(b)); + + auto c = pool.acquire_ensure({}); + + ASL_TEST_EXPECT(!c.is_null()); + ASL_TEST_EXPECT(c.index() == 0); + ASL_TEST_EXPECT(c.gen() == 1); + + ASL_TEST_EXPECT(a != c); + ASL_TEST_EXPECT(b != c); + + ASL_TEST_EXPECT(!pool.is_valid(a)); + ASL_TEST_EXPECT(pool.is_valid(b)); + ASL_TEST_EXPECT(pool.is_valid(c)); + + pool.release(b); + + ASL_TEST_EXPECT(!pool.is_valid(a)); + ASL_TEST_EXPECT(!pool.is_valid(b)); + ASL_TEST_EXPECT(pool.is_valid(c)); + + pool.release(c); + + ASL_TEST_EXPECT(!pool.is_valid(a)); + ASL_TEST_EXPECT(!pool.is_valid(b)); + ASL_TEST_EXPECT(!pool.is_valid(c)); +} + +ASL_TEST(pool_acquire_release_a_lot) +{ + using Pool = asl::IndexPool<3, 3>; + Pool pool; + + for (int i = 0; i < 80; ++i) + { + pool.release(pool.acquire_ensure({})); + } +} + +ASL_TEST(pool_acquire_past_capacity) +{ + using Pool = asl::IndexPool<3, 3>; + Pool pool; + + for (int i = 0; i < 8; ++i) + { + ASL_TEST_EXPECT(pool.acquire({}).has_value()); + } + + for (int i = 0; i < 8; ++i) + { + ASL_TEST_EXPECT(!pool.acquire({}).has_value()); + } +} + |