From 828092a2e63bcc13fcea6031d433228d3c177852 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 31 May 2023 09:30:29 -0400 Subject: [PATCH 1/8] Add levelproperty to all the levels Signed-off-by: Adam Li --- include/xsparse/level_capabilities/co_iteration.hpp | 7 +++++++ include/xsparse/levels/compressed.hpp | 2 +- include/xsparse/levels/dense.hpp | 2 +- include/xsparse/levels/hashed.hpp | 2 +- include/xsparse/levels/offset.hpp | 2 +- include/xsparse/levels/range.hpp | 2 +- include/xsparse/levels/singleton.hpp | 2 +- test/CMakeLists.txt | 2 +- 8 files changed, 14 insertions(+), 7 deletions(-) diff --git a/include/xsparse/level_capabilities/co_iteration.hpp b/include/xsparse/level_capabilities/co_iteration.hpp index dc76ca7..92b4e72 100644 --- a/include/xsparse/level_capabilities/co_iteration.hpp +++ b/include/xsparse/level_capabilities/co_iteration.hpp @@ -30,6 +30,13 @@ namespace xsparse::level_capabilities } } + // Function to get the is_ordered properties of the levels as a tuple of booleans + constexpr auto ordered_levels() const noexcept { + return std::apply([](auto&... levels) { + return std::tuple{levels.is_ordered...}; + }, m_levelsTuple); + } + public: class coiteration_helper { diff --git a/include/xsparse/levels/compressed.hpp b/include/xsparse/levels/compressed.hpp index dedf4b9..74ec577 100644 --- a/include/xsparse/levels/compressed.hpp +++ b/include/xsparse/levels/compressed.hpp @@ -56,7 +56,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - + using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute public: compressed(IK size) : m_size(std::move(size)) diff --git a/include/xsparse/levels/dense.hpp b/include/xsparse/levels/dense.hpp index 700dee5..c2813c5 100644 --- a/include/xsparse/levels/dense.hpp +++ b/include/xsparse/levels/dense.hpp @@ -38,7 +38,7 @@ namespace xsparse LevelProperties>; using BaseTraits = util::base_traits, IK, PK, LevelProperties>; - + using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute public: dense(IK size) : m_size(std::move(size)) diff --git a/include/xsparse/levels/hashed.hpp b/include/xsparse/levels/hashed.hpp index 80ad069..b779e16 100644 --- a/include/xsparse/levels/hashed.hpp +++ b/include/xsparse/levels/hashed.hpp @@ -45,7 +45,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - + using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute public: class iteration_helper { diff --git a/include/xsparse/levels/offset.hpp b/include/xsparse/levels/offset.hpp index 260a6aa..4315aa0 100644 --- a/include/xsparse/levels/offset.hpp +++ b/include/xsparse/levels/offset.hpp @@ -54,7 +54,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - + using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute public: offset(IK size) : m_size(std::move(size)) diff --git a/include/xsparse/levels/range.hpp b/include/xsparse/levels/range.hpp index a540599..fc12022 100644 --- a/include/xsparse/levels/range.hpp +++ b/include/xsparse/levels/range.hpp @@ -53,7 +53,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - + using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute public: range(IK size_N, IK size_M) : m_size_N(std::move(size_N)) diff --git a/include/xsparse/levels/singleton.hpp b/include/xsparse/levels/singleton.hpp index 5ca4637..ef8f620 100644 --- a/include/xsparse/levels/singleton.hpp +++ b/include/xsparse/levels/singleton.hpp @@ -55,7 +55,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - + using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute public: singleton(IK size) : m_size(std::move(size)) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4d6d4f2..2d95565 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -15,7 +15,7 @@ include(../cmake/tools.cmake) include(../cmake/CPM.cmake) -CPMAddPackage("gh:onqtam/doctest#2.4.5") +CPMAddPackage("gh:doctest/doctest#v2.4.11") CPMAddPackage("gh:TheLartians/Format.cmake@1.7.0") if(TEST_INSTALLED_VERSION) From aa562767b80fef3a6d36d0ab1178be4202cf3bd9 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 31 May 2023 09:56:34 -0400 Subject: [PATCH 2/8] Try again Signed-off-by: Adam Li --- include/xsparse/level_capabilities/co_iteration.hpp | 8 ++++---- include/xsparse/levels/dense.hpp | 6 ++++++ test/source/dense_test.cpp | 3 +++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/xsparse/level_capabilities/co_iteration.hpp b/include/xsparse/level_capabilities/co_iteration.hpp index 92b4e72..27b5635 100644 --- a/include/xsparse/level_capabilities/co_iteration.hpp +++ b/include/xsparse/level_capabilities/co_iteration.hpp @@ -31,10 +31,10 @@ namespace xsparse::level_capabilities } // Function to get the is_ordered properties of the levels as a tuple of booleans - constexpr auto ordered_levels() const noexcept { - return std::apply([](auto&... levels) { - return std::tuple{levels.is_ordered...}; - }, m_levelsTuple); + constexpr auto ordered_levels() const noexcept + { + return std::apply([](auto&... levels) { return std::tuple{ levels.is_ordered... }; }, + m_levelsTuple); } public: diff --git a/include/xsparse/levels/dense.hpp b/include/xsparse/levels/dense.hpp index c2813c5..e3775fa 100644 --- a/include/xsparse/levels/dense.hpp +++ b/include/xsparse/levels/dense.hpp @@ -40,6 +40,12 @@ namespace xsparse = util::base_traits, IK, PK, LevelProperties>; using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute public: + // Function to access the LevelProperties object + const LevelProperties LevelProperty() const + { + return LevelProperties{}; + } + dense(IK size) : m_size(std::move(size)) { diff --git a/test/source/dense_test.cpp b/test/source/dense_test.cpp index 9b60dae..4981a4c 100644 --- a/test/source/dense_test.cpp +++ b/test/source/dense_test.cpp @@ -21,6 +21,9 @@ TEST_CASE("Dense-BaseCase") ++loop; } CHECK(loop == SIZE); + + // Check basic properties of all dense levels + CHECK(d.LevelProperty().is_full); } TEST_CASE("Dense-2D") From 29f4f7fd80e61c08431fcf5180fe8398066cc7b7 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 31 May 2023 11:58:34 -0400 Subject: [PATCH 3/8] Adding unit tests for level property Signed-off-by: Adam Li --- include/xsparse/levels/compressed.hpp | 8 ++++++- include/xsparse/levels/dense.hpp | 4 ++-- include/xsparse/levels/hashed.hpp | 8 ++++++- include/xsparse/levels/offset.hpp | 8 ++++++- include/xsparse/levels/range.hpp | 8 ++++++- include/xsparse/levels/singleton.hpp | 8 ++++++- test/source/compressed_test.cpp | 7 ++++++ test/source/dense_test.cpp | 4 ++++ test/source/hashed_test.cpp | 33 +++++++++++++++++++++++++++ test/source/range_test.cpp | 15 ++++++++++++ test/source/singleton_test.cpp | 25 ++++++++++++++++++++ 11 files changed, 121 insertions(+), 7 deletions(-) diff --git a/include/xsparse/levels/compressed.hpp b/include/xsparse/levels/compressed.hpp index 74ec577..0f54954 100644 --- a/include/xsparse/levels/compressed.hpp +++ b/include/xsparse/levels/compressed.hpp @@ -56,8 +56,14 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute + public: + // Function to access the LevelProperties object + constexpr LevelProperties LevelProperty() const + { + return LevelProperties{}; + } + compressed(IK size) : m_size(std::move(size)) , m_pos() diff --git a/include/xsparse/levels/dense.hpp b/include/xsparse/levels/dense.hpp index e3775fa..9ee08cf 100644 --- a/include/xsparse/levels/dense.hpp +++ b/include/xsparse/levels/dense.hpp @@ -38,10 +38,10 @@ namespace xsparse LevelProperties>; using BaseTraits = util::base_traits, IK, PK, LevelProperties>; - using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute + public: // Function to access the LevelProperties object - const LevelProperties LevelProperty() const + constexpr LevelProperties LevelProperty() const { return LevelProperties{}; } diff --git a/include/xsparse/levels/hashed.hpp b/include/xsparse/levels/hashed.hpp index b779e16..9630742 100644 --- a/include/xsparse/levels/hashed.hpp +++ b/include/xsparse/levels/hashed.hpp @@ -45,7 +45,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute + public: class iteration_helper { @@ -131,6 +131,12 @@ namespace xsparse return iteration_helper{ this->m_crd[pkm1] }; } + // Function to access the LevelProperties object + constexpr LevelProperties LevelProperty() const + { + return LevelProperties{}; + } + hashed(IK size) : m_size(std::move(size)) , m_crd() diff --git a/include/xsparse/levels/offset.hpp b/include/xsparse/levels/offset.hpp index 4315aa0..376ccae 100644 --- a/include/xsparse/levels/offset.hpp +++ b/include/xsparse/levels/offset.hpp @@ -54,7 +54,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute + public: offset(IK size) : m_size(std::move(size)) @@ -74,6 +74,12 @@ namespace xsparse { } + // Function to access the LevelProperties object + constexpr LevelProperties LevelProperty() const + { + return LevelProperties{}; + } + inline std::pair pos_bounds(typename BaseTraits::PKM1 pkm1) const noexcept { return { static_cast(pkm1), static_cast(pkm1 + 1) }; diff --git a/include/xsparse/levels/range.hpp b/include/xsparse/levels/range.hpp index fc12022..6aa707f 100644 --- a/include/xsparse/levels/range.hpp +++ b/include/xsparse/levels/range.hpp @@ -53,7 +53,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute + public: range(IK size_N, IK size_M) : m_size_N(std::move(size_N)) @@ -76,6 +76,12 @@ namespace xsparse { } + // Function to access the LevelProperties object + constexpr LevelProperties LevelProperty() const + { + return LevelProperties{}; + } + inline std::pair coord_bounds(typename BaseTraits::I i) const noexcept { static_assert(std::tuple_size_v >= 1, diff --git a/include/xsparse/levels/singleton.hpp b/include/xsparse/levels/singleton.hpp index ef8f620..fb47469 100644 --- a/include/xsparse/levels/singleton.hpp +++ b/include/xsparse/levels/singleton.hpp @@ -55,7 +55,7 @@ namespace xsparse PK, ContainerTraits, LevelProperties>; - using LevelProperty = LevelProperties; // Expose LevelProperties as a public attribute + public: singleton(IK size) : m_size(std::move(size)) @@ -75,6 +75,12 @@ namespace xsparse { } + // Function to access the LevelProperties object + constexpr LevelProperties LevelProperty() const + { + return LevelProperties{}; + } + inline std::pair pos_bounds(typename BaseTraits::PKM1 pkm1) const noexcept { return { static_cast(pkm1), static_cast(pkm1 + 1) }; diff --git a/test/source/compressed_test.cpp b/test/source/compressed_test.cpp index 4f1b16f..26bd7bb 100644 --- a/test/source/compressed_test.cpp +++ b/test/source/compressed_test.cpp @@ -31,6 +31,13 @@ TEST_CASE("Compressed-BaseCase") ++l; } CHECK(l == pos.back()); + + // Check basic properties of all compressed levels + CHECK(s.LevelProperty().is_full); + CHECK(s.LevelProperty().is_ordered); + CHECK(s.LevelProperty().is_unique); + CHECK(!s.LevelProperty().is_branchless); + CHECK(s.LevelProperty().is_compact); } TEST_CASE("Compressed-CSR") diff --git a/test/source/dense_test.cpp b/test/source/dense_test.cpp index 4981a4c..17ee078 100644 --- a/test/source/dense_test.cpp +++ b/test/source/dense_test.cpp @@ -24,6 +24,10 @@ TEST_CASE("Dense-BaseCase") // Check basic properties of all dense levels CHECK(d.LevelProperty().is_full); + CHECK(d.LevelProperty().is_ordered); + CHECK(d.LevelProperty().is_unique); + CHECK(!d.LevelProperty().is_branchless); + CHECK(d.LevelProperty().is_compact); } TEST_CASE("Dense-2D") diff --git a/test/source/hashed_test.cpp b/test/source/hashed_test.cpp index b7de1f5..9f77573 100644 --- a/test/source/hashed_test.cpp +++ b/test/source/hashed_test.cpp @@ -10,6 +10,39 @@ #include #include +TEST_CASE("Hashed-BaseCase") +{ + constexpr uintptr_t SIZE0 = 3; + constexpr uint8_t ZERO = 0; + + std::unordered_map const umap1{ { 5, 2 }, { 6, 1 }, { 4, 0 } }; + std::vector> const crd{ umap1 }; + + xsparse::levels::hashed< + std::tuple<>, + uintptr_t, + uintptr_t, + xsparse::util::container_traits, + xsparse::level_properties> + h{ SIZE0, crd }; + + // check iterating through a hashed level + uintptr_t l2 = 0; + for (auto const [i2, p2] : h.iter_helper(ZERO)) + { + CHECK(crd[0].at(i2) == p2); + ++l2; + } + CHECK(l2 == crd[0].size()); + + // Check basic properties of all hashed levels + CHECK(!h.LevelProperty().is_full); + CHECK(!h.LevelProperty().is_ordered); + CHECK(!h.LevelProperty().is_unique); + CHECK(!h.LevelProperty().is_branchless); + CHECK(!h.LevelProperty().is_compact); +} + TEST_CASE("Dense-Hashed") { constexpr uintptr_t SIZE0 = 3; diff --git a/test/source/range_test.cpp b/test/source/range_test.cpp index dc6b366..265759a 100644 --- a/test/source/range_test.cpp +++ b/test/source/range_test.cpp @@ -10,6 +10,7 @@ #include + TEST_CASE("Range-DIA") { constexpr uintptr_t SIZE = 4; @@ -47,4 +48,18 @@ TEST_CASE("Range-DIA") ++l1; } CHECK(l1 == SIZE); + + // Check basic properties of all range levels + CHECK(!r.LevelProperty().is_full); + CHECK(r.LevelProperty().is_ordered); + CHECK(r.LevelProperty().is_unique); + CHECK(!r.LevelProperty().is_branchless); + CHECK(!r.LevelProperty().is_compact); + + // Check basic properties of all offset levels + CHECK(!o.LevelProperty().is_full); + CHECK(o.LevelProperty().is_ordered); + CHECK(o.LevelProperty().is_unique); + CHECK(o.LevelProperty().is_branchless); + CHECK(!o.LevelProperty().is_compact); } diff --git a/test/source/singleton_test.cpp b/test/source/singleton_test.cpp index 33ce06e..662818d 100644 --- a/test/source/singleton_test.cpp +++ b/test/source/singleton_test.cpp @@ -12,6 +12,31 @@ #include #include + +TEST_CASE("Singleton-BaseCase") +{ + constexpr uintptr_t SIZE = 20; + constexpr uint8_t ZERO = 0; + std::vector const crd1{ 0, 1, 0, 1, 0, 3, 4 }; + + xsparse::levels::singleton, uintptr_t, uintptr_t> s{ SIZE, crd1 }; + + uintptr_t l2 = 0; + for (auto const [i2, p2] : s.iter_helper(std::make_tuple(), ZERO)) + { + CHECK(l2 == p2); + CHECK(crd1[l2] == i2); + ++l2; + } + + // Check basic properties of all singleton levels + CHECK(s.LevelProperty().is_full); + CHECK(s.LevelProperty().is_ordered); + CHECK(s.LevelProperty().is_unique); + CHECK(s.LevelProperty().is_branchless); + CHECK(s.LevelProperty().is_compact); +} + TEST_CASE("Singleton-COO") { constexpr uintptr_t SIZE = 100; From 3e0afc4049f9f945e483b71d8e0ebf794406c11e Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 31 May 2023 12:01:03 -0400 Subject: [PATCH 4/8] Clean diff Signed-off-by: Adam Li --- include/xsparse/level_capabilities/co_iteration.hpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/include/xsparse/level_capabilities/co_iteration.hpp b/include/xsparse/level_capabilities/co_iteration.hpp index 27b5635..dc76ca7 100644 --- a/include/xsparse/level_capabilities/co_iteration.hpp +++ b/include/xsparse/level_capabilities/co_iteration.hpp @@ -30,13 +30,6 @@ namespace xsparse::level_capabilities } } - // Function to get the is_ordered properties of the levels as a tuple of booleans - constexpr auto ordered_levels() const noexcept - { - return std::apply([](auto&... levels) { return std::tuple{ levels.is_ordered... }; }, - m_levelsTuple); - } - public: class coiteration_helper { From b63b67cd827fda84ef0eb0728257d6c5f255808f Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 31 May 2023 14:18:31 -0400 Subject: [PATCH 5/8] Only check strict property requirements Signed-off-by: Adam Li --- test/source/compressed_test.cpp | 8 ++++---- test/source/dense_test.cpp | 4 +--- test/source/hashed_test.cpp | 6 +++--- test/source/range_test.cpp | 10 +++++----- test/source/singleton_test.cpp | 8 ++++---- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/test/source/compressed_test.cpp b/test/source/compressed_test.cpp index 26bd7bb..2a8fedd 100644 --- a/test/source/compressed_test.cpp +++ b/test/source/compressed_test.cpp @@ -32,10 +32,10 @@ TEST_CASE("Compressed-BaseCase") } CHECK(l == pos.back()); - // Check basic properties of all compressed levels - CHECK(s.LevelProperty().is_full); - CHECK(s.LevelProperty().is_ordered); - CHECK(s.LevelProperty().is_unique); + // Check basic strict properties of all compressed levels + // CHECK(s.LevelProperty().is_full); + // CHECK(s.LevelProperty().is_ordered); + // CHECK(s.LevelProperty().is_unique); CHECK(!s.LevelProperty().is_branchless); CHECK(s.LevelProperty().is_compact); } diff --git a/test/source/dense_test.cpp b/test/source/dense_test.cpp index 17ee078..88e42a9 100644 --- a/test/source/dense_test.cpp +++ b/test/source/dense_test.cpp @@ -22,10 +22,8 @@ TEST_CASE("Dense-BaseCase") } CHECK(loop == SIZE); - // Check basic properties of all dense levels + // Check basic strict properties of all dense levels CHECK(d.LevelProperty().is_full); - CHECK(d.LevelProperty().is_ordered); - CHECK(d.LevelProperty().is_unique); CHECK(!d.LevelProperty().is_branchless); CHECK(d.LevelProperty().is_compact); } diff --git a/test/source/hashed_test.cpp b/test/source/hashed_test.cpp index 9f77573..e23baed 100644 --- a/test/source/hashed_test.cpp +++ b/test/source/hashed_test.cpp @@ -35,10 +35,10 @@ TEST_CASE("Hashed-BaseCase") } CHECK(l2 == crd[0].size()); - // Check basic properties of all hashed levels - CHECK(!h.LevelProperty().is_full); + // Check basic stric properties of all hashed levels + // CHECK(!h.LevelProperty().is_full); CHECK(!h.LevelProperty().is_ordered); - CHECK(!h.LevelProperty().is_unique); + // CHECK(!h.LevelProperty().is_unique); CHECK(!h.LevelProperty().is_branchless); CHECK(!h.LevelProperty().is_compact); } diff --git a/test/source/range_test.cpp b/test/source/range_test.cpp index 265759a..0bfbbf5 100644 --- a/test/source/range_test.cpp +++ b/test/source/range_test.cpp @@ -49,17 +49,17 @@ TEST_CASE("Range-DIA") } CHECK(l1 == SIZE); - // Check basic properties of all range levels + // Check basic stric properties of all range levels CHECK(!r.LevelProperty().is_full); - CHECK(r.LevelProperty().is_ordered); - CHECK(r.LevelProperty().is_unique); + // CHECK(r.LevelProperty().is_ordered); + // CHECK(r.LevelProperty().is_unique); CHECK(!r.LevelProperty().is_branchless); CHECK(!r.LevelProperty().is_compact); // Check basic properties of all offset levels CHECK(!o.LevelProperty().is_full); - CHECK(o.LevelProperty().is_ordered); - CHECK(o.LevelProperty().is_unique); + // CHECK(o.LevelProperty().is_ordered); + // CHECK(o.LevelProperty().is_unique); CHECK(o.LevelProperty().is_branchless); CHECK(!o.LevelProperty().is_compact); } diff --git a/test/source/singleton_test.cpp b/test/source/singleton_test.cpp index 662818d..77187dd 100644 --- a/test/source/singleton_test.cpp +++ b/test/source/singleton_test.cpp @@ -29,10 +29,10 @@ TEST_CASE("Singleton-BaseCase") ++l2; } - // Check basic properties of all singleton levels - CHECK(s.LevelProperty().is_full); - CHECK(s.LevelProperty().is_ordered); - CHECK(s.LevelProperty().is_unique); + // Check basic stric properties of all singleton levels + // CHECK(s.LevelProperty().is_full); + // CHECK(s.LevelProperty().is_ordered); + // CHECK(s.LevelProperty().is_unique); CHECK(s.LevelProperty().is_branchless); CHECK(s.LevelProperty().is_compact); } From 2ac6d71451ea7a9212d2d33cdd87bb1717b236f9 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 31 May 2023 17:06:16 -0400 Subject: [PATCH 6/8] Fixed unit-tests for dense ordered Signed-off-by: Adam Li --- include/xsparse/levels/dense.hpp | 1 + test/source/dense_test.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/xsparse/levels/dense.hpp b/include/xsparse/levels/dense.hpp index 9ee08cf..e205718 100644 --- a/include/xsparse/levels/dense.hpp +++ b/include/xsparse/levels/dense.hpp @@ -28,6 +28,7 @@ namespace xsparse static_assert(LevelProperties::is_full); static_assert(!LevelProperties::is_branchless); static_assert(LevelProperties::is_compact); + static_assert(LevelProperties::is_ordered); public: using LevelCapabilities diff --git a/test/source/dense_test.cpp b/test/source/dense_test.cpp index 88e42a9..5ad9f87 100644 --- a/test/source/dense_test.cpp +++ b/test/source/dense_test.cpp @@ -37,7 +37,7 @@ TEST_CASE("Dense-2D") xsparse::levels::dense, uintptr_t, uintptr_t, - xsparse::level_properties> + xsparse::level_properties> d1{ SIZE1 }; xsparse::levels::dense, uintptr_t, uintptr_t> d2{ SIZE2 }; @@ -70,7 +70,7 @@ TEST_CASE("Dense-2D-Size") xsparse::levels::dense, uintptr_t, uintptr_t, - xsparse::level_properties> + xsparse::level_properties> d2{ SIZE2 }; uintptr_t l1 = 0; From 5e7227791e7159753ace1c8e3740a4d4a19da4b1 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Thu, 1 Jun 2023 11:13:34 -0400 Subject: [PATCH 7/8] Level to lower-case Signed-off-by: Adam Li --- include/xsparse/levels/compressed.hpp | 2 +- include/xsparse/levels/dense.hpp | 2 +- include/xsparse/levels/hashed.hpp | 2 +- include/xsparse/levels/offset.hpp | 2 +- include/xsparse/levels/range.hpp | 2 +- include/xsparse/levels/singleton.hpp | 2 +- test/source/compressed_test.cpp | 10 +++++----- test/source/dense_test.cpp | 6 +++--- test/source/hashed_test.cpp | 10 +++++----- test/source/range_test.cpp | 20 ++++++++++---------- test/source/singleton_test.cpp | 10 +++++----- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/include/xsparse/levels/compressed.hpp b/include/xsparse/levels/compressed.hpp index 0f54954..435e8b4 100644 --- a/include/xsparse/levels/compressed.hpp +++ b/include/xsparse/levels/compressed.hpp @@ -59,7 +59,7 @@ namespace xsparse public: // Function to access the LevelProperties object - constexpr LevelProperties LevelProperty() const + constexpr LevelProperties level_property() const { return LevelProperties{}; } diff --git a/include/xsparse/levels/dense.hpp b/include/xsparse/levels/dense.hpp index e205718..9a78cd6 100644 --- a/include/xsparse/levels/dense.hpp +++ b/include/xsparse/levels/dense.hpp @@ -42,7 +42,7 @@ namespace xsparse public: // Function to access the LevelProperties object - constexpr LevelProperties LevelProperty() const + constexpr LevelProperties level_property() const { return LevelProperties{}; } diff --git a/include/xsparse/levels/hashed.hpp b/include/xsparse/levels/hashed.hpp index 9630742..f80cbe0 100644 --- a/include/xsparse/levels/hashed.hpp +++ b/include/xsparse/levels/hashed.hpp @@ -132,7 +132,7 @@ namespace xsparse } // Function to access the LevelProperties object - constexpr LevelProperties LevelProperty() const + constexpr LevelProperties level_property() const { return LevelProperties{}; } diff --git a/include/xsparse/levels/offset.hpp b/include/xsparse/levels/offset.hpp index 376ccae..cac6379 100644 --- a/include/xsparse/levels/offset.hpp +++ b/include/xsparse/levels/offset.hpp @@ -75,7 +75,7 @@ namespace xsparse } // Function to access the LevelProperties object - constexpr LevelProperties LevelProperty() const + constexpr LevelProperties level_property() const { return LevelProperties{}; } diff --git a/include/xsparse/levels/range.hpp b/include/xsparse/levels/range.hpp index 6aa707f..39b9181 100644 --- a/include/xsparse/levels/range.hpp +++ b/include/xsparse/levels/range.hpp @@ -77,7 +77,7 @@ namespace xsparse } // Function to access the LevelProperties object - constexpr LevelProperties LevelProperty() const + constexpr LevelProperties level_property() const { return LevelProperties{}; } diff --git a/include/xsparse/levels/singleton.hpp b/include/xsparse/levels/singleton.hpp index fb47469..e8c1287 100644 --- a/include/xsparse/levels/singleton.hpp +++ b/include/xsparse/levels/singleton.hpp @@ -76,7 +76,7 @@ namespace xsparse } // Function to access the LevelProperties object - constexpr LevelProperties LevelProperty() const + constexpr LevelProperties level_property() const { return LevelProperties{}; } diff --git a/test/source/compressed_test.cpp b/test/source/compressed_test.cpp index 2a8fedd..a394c25 100644 --- a/test/source/compressed_test.cpp +++ b/test/source/compressed_test.cpp @@ -33,11 +33,11 @@ TEST_CASE("Compressed-BaseCase") CHECK(l == pos.back()); // Check basic strict properties of all compressed levels - // CHECK(s.LevelProperty().is_full); - // CHECK(s.LevelProperty().is_ordered); - // CHECK(s.LevelProperty().is_unique); - CHECK(!s.LevelProperty().is_branchless); - CHECK(s.LevelProperty().is_compact); + // CHECK(s.level_property().is_full); + // CHECK(s.level_property().is_ordered); + // CHECK(s.level_property().is_unique); + CHECK(!s.level_property().is_branchless); + CHECK(s.level_property().is_compact); } TEST_CASE("Compressed-CSR") diff --git a/test/source/dense_test.cpp b/test/source/dense_test.cpp index 5ad9f87..461880a 100644 --- a/test/source/dense_test.cpp +++ b/test/source/dense_test.cpp @@ -23,9 +23,9 @@ TEST_CASE("Dense-BaseCase") CHECK(loop == SIZE); // Check basic strict properties of all dense levels - CHECK(d.LevelProperty().is_full); - CHECK(!d.LevelProperty().is_branchless); - CHECK(d.LevelProperty().is_compact); + CHECK(d.level_property().is_full); + CHECK(!d.level_property().is_branchless); + CHECK(d.level_property().is_compact); } TEST_CASE("Dense-2D") diff --git a/test/source/hashed_test.cpp b/test/source/hashed_test.cpp index e23baed..f232fe4 100644 --- a/test/source/hashed_test.cpp +++ b/test/source/hashed_test.cpp @@ -36,11 +36,11 @@ TEST_CASE("Hashed-BaseCase") CHECK(l2 == crd[0].size()); // Check basic stric properties of all hashed levels - // CHECK(!h.LevelProperty().is_full); - CHECK(!h.LevelProperty().is_ordered); - // CHECK(!h.LevelProperty().is_unique); - CHECK(!h.LevelProperty().is_branchless); - CHECK(!h.LevelProperty().is_compact); + // CHECK(!h.level_property().is_full); + CHECK(!h.level_property().is_ordered); + // CHECK(!h.level_property().is_unique); + CHECK(!h.level_property().is_branchless); + CHECK(!h.level_property().is_compact); } TEST_CASE("Dense-Hashed") diff --git a/test/source/range_test.cpp b/test/source/range_test.cpp index 0bfbbf5..80aa8a4 100644 --- a/test/source/range_test.cpp +++ b/test/source/range_test.cpp @@ -50,16 +50,16 @@ TEST_CASE("Range-DIA") CHECK(l1 == SIZE); // Check basic stric properties of all range levels - CHECK(!r.LevelProperty().is_full); - // CHECK(r.LevelProperty().is_ordered); - // CHECK(r.LevelProperty().is_unique); - CHECK(!r.LevelProperty().is_branchless); - CHECK(!r.LevelProperty().is_compact); + CHECK(!r.level_property().is_full); + // CHECK(r.level_property().is_ordered); + // CHECK(r.level_property().is_unique); + CHECK(!r.level_property().is_branchless); + CHECK(!r.level_property().is_compact); // Check basic properties of all offset levels - CHECK(!o.LevelProperty().is_full); - // CHECK(o.LevelProperty().is_ordered); - // CHECK(o.LevelProperty().is_unique); - CHECK(o.LevelProperty().is_branchless); - CHECK(!o.LevelProperty().is_compact); + CHECK(!o.level_property().is_full); + // CHECK(o.level_property().is_ordered); + // CHECK(o.level_property().is_unique); + CHECK(o.level_property().is_branchless); + CHECK(!o.level_property().is_compact); } diff --git a/test/source/singleton_test.cpp b/test/source/singleton_test.cpp index 77187dd..92ac1b1 100644 --- a/test/source/singleton_test.cpp +++ b/test/source/singleton_test.cpp @@ -30,11 +30,11 @@ TEST_CASE("Singleton-BaseCase") } // Check basic stric properties of all singleton levels - // CHECK(s.LevelProperty().is_full); - // CHECK(s.LevelProperty().is_ordered); - // CHECK(s.LevelProperty().is_unique); - CHECK(s.LevelProperty().is_branchless); - CHECK(s.LevelProperty().is_compact); + // CHECK(s.level_property().is_full); + // CHECK(s.level_property().is_ordered); + // CHECK(s.level_property().is_unique); + CHECK(s.level_property().is_branchless); + CHECK(s.level_property().is_compact); } TEST_CASE("Singleton-COO") From 6a73b7397ba70bc8e2fc24b41e8d4cf3e0f17426 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 5 Jun 2023 13:38:33 -0400 Subject: [PATCH 8/8] Fix new design Signed-off-by: Adam Li --- include/xsparse/levels/compressed.hpp | 27 ++++++++++------------- include/xsparse/levels/dense.hpp | 31 +++++++++++---------------- include/xsparse/levels/hashed.hpp | 25 +++++++++------------ include/xsparse/levels/offset.hpp | 29 +++++++++++-------------- include/xsparse/levels/range.hpp | 29 +++++++++++-------------- include/xsparse/levels/singleton.hpp | 27 ++++++++++------------- test/source/compressed_test.cpp | 7 ++---- test/source/dense_test.cpp | 6 +++--- test/source/hashed_test.cpp | 8 +++---- test/source/range_test.cpp | 16 ++++++-------- test/source/singleton_test.cpp | 7 ++---- 11 files changed, 85 insertions(+), 127 deletions(-) diff --git a/include/xsparse/levels/compressed.hpp b/include/xsparse/levels/compressed.hpp index 435e8b4..1475e47 100644 --- a/include/xsparse/levels/compressed.hpp +++ b/include/xsparse/levels/compressed.hpp @@ -20,25 +20,25 @@ namespace xsparse class PK, class ContainerTraits = util::container_traits, - class LevelProperties = level_properties> + class _LevelProperties = level_properties> class compressed; template - class compressed, IK, PK, ContainerTraits, LevelProperties> + class _LevelProperties> + class compressed, IK, PK, ContainerTraits, _LevelProperties> : public level_capabilities::coordinate_position_iterate, IK, PK, ContainerTraits, - LevelProperties> + _LevelProperties> { - static_assert(!LevelProperties::is_branchless); - static_assert(LevelProperties::is_compact); + static_assert(!_LevelProperties::is_branchless); + static_assert(_LevelProperties::is_compact); using PosContainer = typename ContainerTraits::template Vec; using CrdContainer = typename ContainerTraits::template Vec; @@ -48,22 +48,17 @@ namespace xsparse IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; using LevelCapabilities = level_capabilities::coordinate_position_iterate, IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; + using LevelProperties = _LevelProperties; public: - // Function to access the LevelProperties object - constexpr LevelProperties level_property() const - { - return LevelProperties{}; - } - compressed(IK size) : m_size(std::move(size)) , m_pos() @@ -138,9 +133,9 @@ namespace xsparse class IK, class PK, class ContainerTraits, - class LevelProperties> + class _LevelProperties> struct util::coordinate_position_trait< - levels::compressed, IK, PK, ContainerTraits, LevelProperties>> + levels::compressed, IK, PK, ContainerTraits, _LevelProperties>> { using Coordinate = IK; using Position = PK; diff --git a/include/xsparse/levels/dense.hpp b/include/xsparse/levels/dense.hpp index 9a78cd6..175cdde 100644 --- a/include/xsparse/levels/dense.hpp +++ b/include/xsparse/levels/dense.hpp @@ -13,22 +13,22 @@ namespace xsparse template > + class _LevelProperties = level_properties> class dense; - template - class dense, IK, PK, LevelProperties> + template + class dense, IK, PK, _LevelProperties> : public level_capabilities::coordinate_value_iterate, IK, PK, - LevelProperties> + _LevelProperties> { - static_assert(LevelProperties::is_full); - static_assert(!LevelProperties::is_branchless); - static_assert(LevelProperties::is_compact); - static_assert(LevelProperties::is_ordered); + static_assert(_LevelProperties::is_full); + static_assert(!_LevelProperties::is_branchless); + static_assert(_LevelProperties::is_compact); + static_assert(_LevelProperties::is_ordered); public: using LevelCapabilities @@ -36,17 +36,12 @@ namespace xsparse std::tuple, IK, PK, - LevelProperties>; + _LevelProperties>; using BaseTraits - = util::base_traits, IK, PK, LevelProperties>; + = util::base_traits, IK, PK, _LevelProperties>; + using LevelProperties = _LevelProperties; public: - // Function to access the LevelProperties object - constexpr LevelProperties level_property() const - { - return LevelProperties{}; - } - dense(IK size) : m_size(std::move(size)) { @@ -80,9 +75,9 @@ namespace xsparse }; } - template + template struct util::coordinate_position_trait< - levels::dense, IK, PK, LevelProperties>> + levels::dense, IK, PK, _LevelProperties>> { using Coordinate = IK; using Position = PK; diff --git a/include/xsparse/levels/hashed.hpp b/include/xsparse/levels/hashed.hpp index f80cbe0..58ecc5a 100644 --- a/include/xsparse/levels/hashed.hpp +++ b/include/xsparse/levels/hashed.hpp @@ -22,19 +22,19 @@ namespace xsparse class PK, class ContainerTraits = util::container_traits, - class LevelProperties = level_properties> + class _LevelProperties = level_properties> class hashed; template - class hashed, IK, PK, ContainerTraits, LevelProperties> + class _LevelProperties> + class hashed, IK, PK, ContainerTraits, _LevelProperties> { - static_assert(!LevelProperties::is_ordered); - static_assert(!LevelProperties::is_branchless); - static_assert(!LevelProperties::is_compact); + static_assert(!_LevelProperties::is_ordered); + static_assert(!_LevelProperties::is_branchless); + static_assert(!_LevelProperties::is_compact); using CrdContainer = typename ContainerTraits::template Vec< typename ContainerTraits::template Map>; @@ -44,7 +44,8 @@ namespace xsparse IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; + using LevelProperties = _LevelProperties; public: class iteration_helper @@ -131,12 +132,6 @@ namespace xsparse return iteration_helper{ this->m_crd[pkm1] }; } - // Function to access the LevelProperties object - constexpr LevelProperties level_property() const - { - return LevelProperties{}; - } - hashed(IK size) : m_size(std::move(size)) , m_crd() @@ -186,9 +181,9 @@ namespace xsparse class IK, class PK, class ContainerTraits, - class LevelProperties> + class _LevelProperties> struct util::coordinate_position_trait< - levels::hashed, IK, PK, ContainerTraits, LevelProperties>> + levels::hashed, IK, PK, ContainerTraits, _LevelProperties>> { using Coordinate = IK; using Position = PK; diff --git a/include/xsparse/levels/offset.hpp b/include/xsparse/levels/offset.hpp index cac6379..dcbba46 100644 --- a/include/xsparse/levels/offset.hpp +++ b/include/xsparse/levels/offset.hpp @@ -18,26 +18,26 @@ namespace xsparse class PK, class ContainerTraits = util::container_traits, - class LevelProperties = level_properties> + class _LevelProperties = level_properties> class offset; template - class offset, IK, PK, ContainerTraits, LevelProperties> + class _LevelProperties> + class offset, IK, PK, ContainerTraits, _LevelProperties> : public level_capabilities::coordinate_position_iterate, IK, PK, ContainerTraits, - LevelProperties> + _LevelProperties> { - static_assert(!LevelProperties::is_full); - static_assert(LevelProperties::is_branchless); - static_assert(!LevelProperties::is_compact); + static_assert(!_LevelProperties::is_full); + static_assert(_LevelProperties::is_branchless); + static_assert(!_LevelProperties::is_compact); using OffsetContainer = typename ContainerTraits::template Vec; public: @@ -46,14 +46,15 @@ namespace xsparse IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; using LevelCapabilities = level_capabilities::coordinate_position_iterate, IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; + using LevelProperties = _LevelProperties; public: offset(IK size) @@ -74,12 +75,6 @@ namespace xsparse { } - // Function to access the LevelProperties object - constexpr LevelProperties level_property() const - { - return LevelProperties{}; - } - inline std::pair pos_bounds(typename BaseTraits::PKM1 pkm1) const noexcept { return { static_cast(pkm1), static_cast(pkm1 + 1) }; @@ -107,9 +102,9 @@ namespace xsparse class IK, class PK, class ContainerTraits, - class LevelProperties> + class _LevelProperties> struct util::coordinate_position_trait< - levels::offset, IK, PK, ContainerTraits, LevelProperties>> + levels::offset, IK, PK, ContainerTraits, _LevelProperties>> { using Coordinate = IK; using Position = PK; diff --git a/include/xsparse/levels/range.hpp b/include/xsparse/levels/range.hpp index 39b9181..94552e4 100644 --- a/include/xsparse/levels/range.hpp +++ b/include/xsparse/levels/range.hpp @@ -18,25 +18,25 @@ namespace xsparse class PK, class ContainerTraits = util::container_traits, - class LevelProperties = level_properties> + class _LevelProperties = level_properties> class range; template - class range, IK, PK, ContainerTraits, LevelProperties> + class _LevelProperties> + class range, IK, PK, ContainerTraits, _LevelProperties> : public level_capabilities::coordinate_value_iterate, IK, PK, ContainerTraits, - LevelProperties> + _LevelProperties> { - static_assert(!LevelProperties::is_full); - static_assert(!LevelProperties::is_branchless); - static_assert(!LevelProperties::is_compact); + static_assert(!_LevelProperties::is_full); + static_assert(!_LevelProperties::is_branchless); + static_assert(!_LevelProperties::is_compact); using OffsetContainer = typename ContainerTraits::template Vec; public: @@ -45,14 +45,15 @@ namespace xsparse IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; using LevelCapabilities = level_capabilities::coordinate_value_iterate, IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; + using LevelProperties = _LevelProperties; public: range(IK size_N, IK size_M) @@ -76,12 +77,6 @@ namespace xsparse { } - // Function to access the LevelProperties object - constexpr LevelProperties level_property() const - { - return LevelProperties{}; - } - inline std::pair coord_bounds(typename BaseTraits::I i) const noexcept { static_assert(std::tuple_size_v >= 1, @@ -107,9 +102,9 @@ namespace xsparse class IK, class PK, class ContainerTraits, - class LevelProperties> + class _LevelProperties> struct util::coordinate_position_trait< - levels::range, IK, PK, ContainerTraits, LevelProperties>> + levels::range, IK, PK, ContainerTraits, _LevelProperties>> { using Coordinate = IK; using Position = PK; diff --git a/include/xsparse/levels/singleton.hpp b/include/xsparse/levels/singleton.hpp index e8c1287..e1ded1b 100644 --- a/include/xsparse/levels/singleton.hpp +++ b/include/xsparse/levels/singleton.hpp @@ -20,25 +20,25 @@ namespace xsparse class PK, class ContainerTraits = util::container_traits, - class LevelProperties = level_properties> + class _LevelProperties = level_properties> class singleton; template - class singleton, IK, PK, ContainerTraits, LevelProperties> + class _LevelProperties> + class singleton, IK, PK, ContainerTraits, _LevelProperties> : public level_capabilities::coordinate_position_iterate, IK, PK, ContainerTraits, - LevelProperties> + _LevelProperties> { - static_assert(LevelProperties::is_branchless); - static_assert(LevelProperties::is_compact); + static_assert(_LevelProperties::is_branchless); + static_assert(_LevelProperties::is_compact); using CrdContainer = typename ContainerTraits::template Vec; public: @@ -47,14 +47,15 @@ namespace xsparse IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; using LevelCapabilities = level_capabilities::coordinate_position_iterate, IK, PK, ContainerTraits, - LevelProperties>; + _LevelProperties>; + using LevelProperties = _LevelProperties; public: singleton(IK size) @@ -75,12 +76,6 @@ namespace xsparse { } - // Function to access the LevelProperties object - constexpr LevelProperties level_property() const - { - return LevelProperties{}; - } - inline std::pair pos_bounds(typename BaseTraits::PKM1 pkm1) const noexcept { return { static_cast(pkm1), static_cast(pkm1 + 1) }; @@ -113,9 +108,9 @@ namespace xsparse class IK, class PK, class ContainerTraits, - class LevelProperties> + class _LevelProperties> struct util::coordinate_position_trait< - levels::singleton, IK, PK, ContainerTraits, LevelProperties>> + levels::singleton, IK, PK, ContainerTraits, _LevelProperties>> { using Coordinate = IK; using Position = PK; diff --git a/test/source/compressed_test.cpp b/test/source/compressed_test.cpp index a394c25..717b72c 100644 --- a/test/source/compressed_test.cpp +++ b/test/source/compressed_test.cpp @@ -33,11 +33,8 @@ TEST_CASE("Compressed-BaseCase") CHECK(l == pos.back()); // Check basic strict properties of all compressed levels - // CHECK(s.level_property().is_full); - // CHECK(s.level_property().is_ordered); - // CHECK(s.level_property().is_unique); - CHECK(!s.level_property().is_branchless); - CHECK(s.level_property().is_compact); + CHECK(!decltype(s)::LevelProperties::is_branchless); + CHECK(decltype(s)::LevelProperties::is_compact); } TEST_CASE("Compressed-CSR") diff --git a/test/source/dense_test.cpp b/test/source/dense_test.cpp index 461880a..2e40f04 100644 --- a/test/source/dense_test.cpp +++ b/test/source/dense_test.cpp @@ -23,9 +23,9 @@ TEST_CASE("Dense-BaseCase") CHECK(loop == SIZE); // Check basic strict properties of all dense levels - CHECK(d.level_property().is_full); - CHECK(!d.level_property().is_branchless); - CHECK(d.level_property().is_compact); + CHECK(decltype(d)::LevelProperties::is_full); + CHECK(!decltype(d)::LevelProperties::is_branchless); + CHECK(decltype(d)::LevelProperties::is_compact); } TEST_CASE("Dense-2D") diff --git a/test/source/hashed_test.cpp b/test/source/hashed_test.cpp index f232fe4..c882c16 100644 --- a/test/source/hashed_test.cpp +++ b/test/source/hashed_test.cpp @@ -36,11 +36,9 @@ TEST_CASE("Hashed-BaseCase") CHECK(l2 == crd[0].size()); // Check basic stric properties of all hashed levels - // CHECK(!h.level_property().is_full); - CHECK(!h.level_property().is_ordered); - // CHECK(!h.level_property().is_unique); - CHECK(!h.level_property().is_branchless); - CHECK(!h.level_property().is_compact); + CHECK(!decltype(h)::LevelProperties::is_ordered); + CHECK(!decltype(h)::LevelProperties::is_branchless); + CHECK(!decltype(h)::LevelProperties::is_compact); } TEST_CASE("Dense-Hashed") diff --git a/test/source/range_test.cpp b/test/source/range_test.cpp index 80aa8a4..c002178 100644 --- a/test/source/range_test.cpp +++ b/test/source/range_test.cpp @@ -50,16 +50,12 @@ TEST_CASE("Range-DIA") CHECK(l1 == SIZE); // Check basic stric properties of all range levels - CHECK(!r.level_property().is_full); - // CHECK(r.level_property().is_ordered); - // CHECK(r.level_property().is_unique); - CHECK(!r.level_property().is_branchless); - CHECK(!r.level_property().is_compact); + CHECK(!decltype(r)::LevelProperties::is_full); + CHECK(!decltype(r)::LevelProperties::is_branchless); + CHECK(!decltype(r)::LevelProperties::is_compact); // Check basic properties of all offset levels - CHECK(!o.level_property().is_full); - // CHECK(o.level_property().is_ordered); - // CHECK(o.level_property().is_unique); - CHECK(o.level_property().is_branchless); - CHECK(!o.level_property().is_compact); + CHECK(!decltype(o)::LevelProperties::is_full); + CHECK(decltype(o)::LevelProperties::is_branchless); + CHECK(!decltype(o)::LevelProperties::is_compact); } diff --git a/test/source/singleton_test.cpp b/test/source/singleton_test.cpp index 92ac1b1..4eb4b17 100644 --- a/test/source/singleton_test.cpp +++ b/test/source/singleton_test.cpp @@ -30,11 +30,8 @@ TEST_CASE("Singleton-BaseCase") } // Check basic stric properties of all singleton levels - // CHECK(s.level_property().is_full); - // CHECK(s.level_property().is_ordered); - // CHECK(s.level_property().is_unique); - CHECK(s.level_property().is_branchless); - CHECK(s.level_property().is_compact); + CHECK(decltype(s)::LevelProperties::is_branchless); + CHECK(decltype(s)::LevelProperties::is_compact); } TEST_CASE("Singleton-COO")