diff --git a/flat_map.hpp b/flat_map.hpp index ef4db10..67b6ace 100644 --- a/flat_map.hpp +++ b/flat_map.hpp @@ -133,6 +133,10 @@ namespace flat_hpp insert(ilist); } + allocator_type get_allocator() const { + return data_.get_allocator(); + } + iterator begin() noexcept { return data_.begin(); } const_iterator begin() const noexcept { return data_.begin(); } const_iterator cbegin() const noexcept { return data_.cbegin(); } diff --git a/flat_map_tests.cpp b/flat_map_tests.cpp index 1957624..40891f6 100644 --- a/flat_map_tests.cpp +++ b/flat_map_tests.cpp @@ -18,9 +18,11 @@ namespace using value_type = T; dummy_allocator() = default; + dummy_allocator(int i) : i(i) {} template < typename U > - dummy_allocator(const dummy_allocator&) noexcept { + dummy_allocator(const dummy_allocator& o) noexcept { + i = o.i; } T* allocate(std::size_t n) noexcept { @@ -31,6 +33,8 @@ namespace (void)n; std::free(p); } + + int i = 0; }; template < typename T, typename U > @@ -100,6 +104,9 @@ TEST_CASE("flat_map") { std::greater, alloc_t>; + using vec_t = std::vector< + std::pair>; + { auto s0 = map_t(); auto s1 = map2_t(alloc_t()); @@ -108,8 +115,6 @@ TEST_CASE("flat_map") { } { - using vec_t = std::vector>; - vec_t v{{1,30},{2,20},{3,10}}; auto s0 = map_t(v.cbegin(), v.cend()); auto s1 = map2_t(v.cbegin(), v.cend(), alloc_t()); @@ -127,6 +132,18 @@ TEST_CASE("flat_map") { auto s1 = map_t({{0,1}, {1,2}}, alloc_t()); auto s2 = map_t({{0,1}, {1,2}}, std::less()); auto s3 = map_t({{0,1}, {1,2}}, std::less(), alloc_t()); + + REQUIRE(vec_t(s0.begin(), s0.end()) == vec_t({{0,1},{1,2}})); + REQUIRE(vec_t(s1.begin(), s1.end()) == vec_t({{0,1},{1,2}})); + REQUIRE(vec_t(s2.begin(), s2.end()) == vec_t({{0,1},{1,2}})); + REQUIRE(vec_t(s3.begin(), s3.end()) == vec_t({{0,1},{1,2}})); + } + + { + auto s0 = map_t(); + auto s1 = map_t(alloc_t(42)); + REQUIRE(s0.get_allocator().i == 0); + REQUIRE(s1.get_allocator().i == 42); } } SECTION("capacity") { diff --git a/flat_set.hpp b/flat_set.hpp index b167597..12cfa69 100644 --- a/flat_set.hpp +++ b/flat_set.hpp @@ -111,6 +111,10 @@ namespace flat_hpp insert(ilist); } + allocator_type get_allocator() const { + return data_.get_allocator(); + } + iterator begin() noexcept { return data_.begin(); } const_iterator begin() const noexcept { return data_.begin(); } const_iterator cbegin() const noexcept { return data_.cbegin(); } diff --git a/flat_set_tests.cpp b/flat_set_tests.cpp index d103f55..92c9383 100644 --- a/flat_set_tests.cpp +++ b/flat_set_tests.cpp @@ -18,9 +18,11 @@ namespace using value_type = T; dummy_allocator() = default; + dummy_allocator(int i) : i(i) {} template < typename U > - dummy_allocator(const dummy_allocator&) noexcept { + dummy_allocator(const dummy_allocator& o) noexcept { + i = o.i; } T* allocate(std::size_t n) noexcept { @@ -31,6 +33,8 @@ namespace (void)n; std::free(p); } + + int i = 0; }; template < typename T, typename U > @@ -85,6 +89,7 @@ TEST_CASE("flat_set") { using alloc_t = dummy_allocator; using set_t = flat_set, alloc_t>; using set2_t = flat_set, alloc_t>; + using vec_t = std::vector; { auto s0 = set_t(); @@ -94,16 +99,16 @@ TEST_CASE("flat_set") { } { - std::vector v{1,2,3}; + vec_t v{1,2,3}; auto s0 = set_t(v.cbegin(), v.cend()); auto s1 = set2_t(v.cbegin(), v.cend(), alloc_t()); auto s2 = set_t(v.cbegin(), v.cend(), std::less()); auto s3 = set2_t(v.cbegin(), v.cend(), std::greater(), alloc_t()); - REQUIRE(std::vector(s0.begin(), s0.end()) == std::vector({1,2,3})); - REQUIRE(std::vector(s1.begin(), s1.end()) == std::vector({3,2,1})); - REQUIRE(std::vector(s2.begin(), s2.end()) == std::vector({1,2,3})); - REQUIRE(std::vector(s3.begin(), s3.end()) == std::vector({3,2,1})); + REQUIRE(vec_t(s0.begin(), s0.end()) == vec_t({1,2,3})); + REQUIRE(vec_t(s1.begin(), s1.end()) == vec_t({3,2,1})); + REQUIRE(vec_t(s2.begin(), s2.end()) == vec_t({1,2,3})); + REQUIRE(vec_t(s3.begin(), s3.end()) == vec_t({3,2,1})); } { @@ -112,10 +117,17 @@ TEST_CASE("flat_set") { auto s2 = set_t({0,1,2}, std::less()); auto s3 = set2_t({0,1,2}, std::greater(), alloc_t()); - REQUIRE(std::vector(s0.begin(), s0.end()) == std::vector({0,1,2})); - REQUIRE(std::vector(s1.begin(), s1.end()) == std::vector({2,1,0})); - REQUIRE(std::vector(s2.begin(), s2.end()) == std::vector({0,1,2})); - REQUIRE(std::vector(s3.begin(), s3.end()) == std::vector({2,1,0})); + REQUIRE(vec_t(s0.begin(), s0.end()) == vec_t({0,1,2})); + REQUIRE(vec_t(s1.begin(), s1.end()) == vec_t({2,1,0})); + REQUIRE(vec_t(s2.begin(), s2.end()) == vec_t({0,1,2})); + REQUIRE(vec_t(s3.begin(), s3.end()) == vec_t({2,1,0})); + } + + { + auto s0 = set_t(); + auto s1 = set_t(alloc_t(42)); + REQUIRE(s0.get_allocator().i == 0); + REQUIRE(s1.get_allocator().i == 42); } } SECTION("capacity") {