[libcxx-commits] [libcxx] [libc++] `flat_meow` transparent comparator string literals (PR #133654)
via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Apr 4 05:43:11 PDT 2025
https://github.com/huixie90 updated https://github.com/llvm/llvm-project/pull/133654
>From f45f632bebee915bc060fd6dc97fe9230e7a3de8 Mon Sep 17 00:00:00 2001
From: Hui Xie <hui.xie1990 at gmail.com>
Date: Sun, 30 Mar 2025 21:00:18 +0100
Subject: [PATCH 1/2] string transparent test
---
.../flat.map/flat.map.access/at_transparent.pass.cpp | 7 +++++++
.../flat.map.access/index_transparent.pass.cpp | 7 +++++++
.../flat.map.modifiers/erase_key_transparent.pass.cpp | 7 +++++++
.../flat.map.modifiers/insert_transparent.pass.cpp | 10 ++++++++++
.../try_emplace_transparent.pass.cpp | 11 +++++++++++
.../flat.map.operations/contains_transparent.pass.cpp | 8 ++++++++
.../flat.map.operations/count_transparent.pass.cpp | 8 ++++++++
.../equal_range_transparent.pass.cpp | 9 +++++++++
.../flat.map.operations/find_transparent.pass.cpp | 8 ++++++++
.../lower_bound_transparent.pass.cpp | 8 ++++++++
.../upper_bound_transparent.pass.cpp | 8 ++++++++
11 files changed, 91 insertions(+)
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/at_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/at_transparent.pass.cpp
index 456f12e0c0d29..dd9f6da2dda71 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/at_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/at_transparent.pass.cpp
@@ -106,6 +106,13 @@ int main(int, char**) {
TEST_IGNORE_NODISCARD m.at(Transparent<int>{3});
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ int& x = m.at("alpha");
+ assert(x == 1);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/index_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/index_transparent.pass.cpp
index 24c08464f3158..3a18990123553 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/index_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.access/index_transparent.pass.cpp
@@ -94,6 +94,13 @@ int main(int, char**) {
m[ConvertibleTransparent<int>{3}];
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ int& x = m["alpha"];
+ assert(x == 1);
+ }
{
auto index_func = [](auto& m, auto key_arg, auto value_arg) {
using FlatMap = std::decay_t<decltype(m)>;
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/erase_key_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/erase_key_transparent.pass.cpp
index 3ba30757bf2c7..20e23dc085ffd 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/erase_key_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/erase_key_transparent.pass.cpp
@@ -139,6 +139,13 @@ int main(int, char**) {
};
test_erase_exception_guarantee(erase_transparent);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto n = m.erase("beta");
+ assert(n == 1);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_transparent.pass.cpp
index 75cabb70630f3..b6a2abe5e5e01 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_transparent.pass.cpp
@@ -163,5 +163,15 @@ int main(int, char**) {
};
test_emplace_exception_guarantee(insert_func_iter);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto [it, inserted] = m.insert({"alpha", 1});
+ assert(!inserted);
+ assert(it == m.begin());
+ auto it2 = m.insert(m.begin(), {"beta2", 2});
+ assert(it2 == m.begin() + 2);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/try_emplace_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/try_emplace_transparent.pass.cpp
index 21fda43780967..b8dd590ac808e 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/try_emplace_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/try_emplace_transparent.pass.cpp
@@ -160,6 +160,17 @@ int main(int, char**) {
assert(p->second == 3);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto [it1, inserted] = m.try_emplace("charlie", 4);
+ assert(it1 == m.begin() + 2);
+ assert(inserted);
+
+ auto it2 = m.try_emplace(m.begin(), "beta2", 2);
+ assert(it2 == m.begin() + 2);
+ }
{
auto try_emplace = [](auto& m, auto key_arg, auto value_arg) {
using M = std::decay_t<decltype(m)>;
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/contains_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/contains_transparent.pass.cpp
index 0493538ab6dad..46863681ae6ef 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/contains_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/contains_transparent.pass.cpp
@@ -14,6 +14,7 @@
#include <cassert>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
#include <deque>
@@ -67,5 +68,12 @@ int main(int, char**) {
assert(b);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ assert(m.contains("beta") == true);
+ assert(m.contains("charlie") == false);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/count_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/count_transparent.pass.cpp
index cd195ff1fa8b4..946ded0b1cfab 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/count_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/count_transparent.pass.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -67,6 +68,13 @@ int main(int, char**) {
assert(n == 1);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ assert(m.count("alpha") == 1);
+ assert(m.count("charlie") == 0);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/equal_range_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/equal_range_transparent.pass.cpp
index 0198f433bdc4f..9d623823d430e 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/equal_range_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/equal_range_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -95,6 +96,14 @@ int main(int, char**) {
assert(p.first != p.second);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto [first, last] = m.equal_range("beta");
+ assert(first == m.begin() + 1);
+ assert(last == m.begin() + 2);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/find_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/find_transparent.pass.cpp
index 291577a89fc8f..249732b757662 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/find_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/find_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -83,6 +84,13 @@ int main(int, char**) {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto it = m.find("beta");
+ assert(it == m.begin() + 1);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/lower_bound_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/lower_bound_transparent.pass.cpp
index 6a923c197e91e..4fd5eb37d69a9 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/lower_bound_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/lower_bound_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -90,6 +91,13 @@ int main(int, char**) {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto it = m.lower_bound("charlie");
+ assert(it == m.begin() + 2);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/upper_bound_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/upper_bound_transparent.pass.cpp
index 4e83f920835df..008d48b9aba28 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/upper_bound_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.operations/upper_bound_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -89,6 +90,13 @@ int main(int, char**) {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto it = m.upper_bound("charlie");
+ assert(it == m.begin() + 2);
+ }
return 0;
}
>From 7c14e5d973d5cdf0563ff482e1b2eb29e1bffe79 Mon Sep 17 00:00:00 2001
From: Hui Xie <hui.xie1990 at gmail.com>
Date: Fri, 4 Apr 2025 13:43:00 +0100
Subject: [PATCH 2/2] more tests
---
libcxx/include/__flat_map/flat_map.h | 49 +++++++++----------
libcxx/include/__flat_map/flat_multimap.h | 23 ++++-----
libcxx/include/__flat_set/flat_set.h | 1 -
.../insert_or_assign_transparent.pass.cpp | 12 +++++
.../erase_key_transparent.pass.cpp | 7 +++
.../insert_transparent.pass.cpp | 9 ++++
.../contains_transparent.pass.cpp | 8 +++
.../count_transparent.pass.cpp | 8 +++
.../equal_range_transparent.pass.cpp | 9 ++++
.../find_transparent.pass.cpp | 8 +++
.../lower_bound_transparent.pass.cpp | 8 +++
.../upper_bound_transparent.pass.cpp | 8 +++
.../erase_key_transparent.pass.cpp | 7 +++
.../insert_transparent.pass.cpp | 8 +++
.../contains_transparent.pass.cpp | 8 +++
.../count_transparent.pass.cpp | 8 +++
.../equal_range_transparent.pass.cpp | 9 ++++
.../find_transparent.pass.cpp | 10 ++++
.../lower_bound_transparent.pass.cpp | 10 ++++
.../upper_bound_transparent.pass.cpp | 10 ++++
20 files changed, 181 insertions(+), 39 deletions(-)
diff --git a/libcxx/include/__flat_map/flat_map.h b/libcxx/include/__flat_map/flat_map.h
index f5abfd0985280..76a51bed50744 100644
--- a/libcxx/include/__flat_map/flat_map.h
+++ b/libcxx/include/__flat_map/flat_map.h
@@ -11,16 +11,15 @@
#define _LIBCPP___FLAT_MAP_FLAT_MAP_H
#include <__algorithm/lexicographical_compare_three_way.h>
+#include <__algorithm/lower_bound.h>
#include <__algorithm/min.h>
#include <__algorithm/ranges_adjacent_find.h>
#include <__algorithm/ranges_equal.h>
#include <__algorithm/ranges_inplace_merge.h>
-#include <__algorithm/ranges_lower_bound.h>
-#include <__algorithm/ranges_partition_point.h>
#include <__algorithm/ranges_sort.h>
#include <__algorithm/ranges_unique.h>
-#include <__algorithm/ranges_upper_bound.h>
#include <__algorithm/remove_if.h>
+#include <__algorithm/upper_bound.h>
#include <__assert>
#include <__compare/synth_three_way.h>
#include <__concepts/swappable.h>
@@ -863,6 +862,13 @@ class flat_map {
__containers_.values.erase(__containers_.values.begin() + __dist, __containers_.values.end());
}
+ template <class _Self, class _KeyIter>
+ _LIBCPP_HIDE_FROM_ABI static auto __corresponding_mapped_it(_Self&& __self, _KeyIter&& __key_iter) {
+ return __self.__containers_.values.begin() +
+ static_cast<ranges::range_difference_t<mapped_container_type>>(
+ ranges::distance(__self.__containers_.keys.begin(), __key_iter));
+ }
+
template <bool _WasSorted, class _InputIterator, class _Sentinel>
_LIBCPP_HIDE_FROM_ABI void __append_sort_merge_unique(_InputIterator __first, _Sentinel __last) {
auto __on_failure = std::__make_exception_guard([&]() noexcept { clear() /* noexcept */; });
@@ -903,7 +909,8 @@ class flat_map {
template <class _Self, class _Kp>
_LIBCPP_HIDE_FROM_ABI static auto __key_equal_range(_Self&& __self, const _Kp& __key) {
- auto __it = ranges::lower_bound(__self.__containers_.keys, __key, __self.__compare_);
+ auto __it =
+ std::lower_bound(__self.__containers_.keys.begin(), __self.__containers_.keys.end(), __key, __self.__compare_);
auto __last = __self.__containers_.keys.end();
if (__it == __last || __self.__compare_(__key, *__it)) {
return std::make_pair(__it, __it);
@@ -914,42 +921,30 @@ class flat_map {
template <class _Self, class _Kp>
_LIBCPP_HIDE_FROM_ABI static auto __equal_range_impl(_Self&& __self, const _Kp& __key) {
auto [__key_first, __key_last] = __key_equal_range(__self, __key);
-
- const auto __make_mapped_iter = [&](const auto& __key_iter) {
- return __self.__containers_.values.begin() +
- static_cast<ranges::range_difference_t<mapped_container_type>>(
- ranges::distance(__self.__containers_.keys.begin(), __key_iter));
- };
-
- using __iterator_type = ranges::iterator_t<decltype(__self)>;
- return std::make_pair(__iterator_type(__key_first, __make_mapped_iter(__key_first)),
- __iterator_type(__key_last, __make_mapped_iter(__key_last)));
+ using __iterator_type = ranges::iterator_t<decltype(__self)>;
+ return std::make_pair(__iterator_type(__key_first, __corresponding_mapped_it(__self, __key_first)),
+ __iterator_type(__key_last, __corresponding_mapped_it(__self, __key_last)));
}
template <class _Res, class _Self, class _Kp>
_LIBCPP_HIDE_FROM_ABI static _Res __lower_bound(_Self&& __self, _Kp& __x) {
- return __binary_search<_Res>(__self, ranges::lower_bound, __x);
+ auto __key_iter =
+ std::lower_bound(__self.__containers_.keys.begin(), __self.__containers_.keys.end(), __x, __self.__compare_);
+ auto __mapped_iter = __corresponding_mapped_it(__self, __key_iter);
+ return _Res(std::move(__key_iter), std::move(__mapped_iter));
}
template <class _Res, class _Self, class _Kp>
_LIBCPP_HIDE_FROM_ABI static _Res __upper_bound(_Self&& __self, _Kp& __x) {
- return __binary_search<_Res>(__self, ranges::upper_bound, __x);
- }
-
- template <class _Res, class _Self, class _Fn, class _Kp>
- _LIBCPP_HIDE_FROM_ABI static _Res __binary_search(_Self&& __self, _Fn __search_fn, _Kp& __x) {
- auto __key_iter = __search_fn(__self.__containers_.keys, __x, __self.__compare_);
- auto __mapped_iter =
- __self.__containers_.values.begin() +
- static_cast<ranges::range_difference_t<mapped_container_type>>(
- ranges::distance(__self.__containers_.keys.begin(), __key_iter));
-
+ auto __key_iter =
+ std::upper_bound(__self.__containers_.keys.begin(), __self.__containers_.keys.end(), __x, __self.__compare_);
+ auto __mapped_iter = __corresponding_mapped_it(__self, __key_iter);
return _Res(std::move(__key_iter), std::move(__mapped_iter));
}
template <class _KeyArg, class... _MArgs>
_LIBCPP_HIDE_FROM_ABI pair<iterator, bool> __try_emplace(_KeyArg&& __key, _MArgs&&... __mapped_args) {
- auto __key_it = ranges::lower_bound(__containers_.keys, __key, __compare_);
+ auto __key_it = std::lower_bound(__containers_.keys.begin(), __containers_.keys.end(), __key, __compare_);
auto __mapped_it = __containers_.values.begin() + ranges::distance(__containers_.keys.begin(), __key_it);
if (__key_it == __containers_.keys.end() || __compare_(__key, *__key_it)) {
diff --git a/libcxx/include/__flat_map/flat_multimap.h b/libcxx/include/__flat_map/flat_multimap.h
index ea77fb5d79bd2..7b5c64e0b5262 100644
--- a/libcxx/include/__flat_map/flat_multimap.h
+++ b/libcxx/include/__flat_map/flat_multimap.h
@@ -10,18 +10,16 @@
#ifndef _LIBCPP___FLAT_MAP_FLAT_MULTIMAP_H
#define _LIBCPP___FLAT_MAP_FLAT_MULTIMAP_H
+#include <__algorithm/equal_range.h>
#include <__algorithm/lexicographical_compare_three_way.h>
+#include <__algorithm/lower_bound.h>
#include <__algorithm/min.h>
#include <__algorithm/ranges_equal.h>
-#include <__algorithm/ranges_equal_range.h>
#include <__algorithm/ranges_inplace_merge.h>
#include <__algorithm/ranges_is_sorted.h>
-#include <__algorithm/ranges_lower_bound.h>
-#include <__algorithm/ranges_partition_point.h>
#include <__algorithm/ranges_sort.h>
-#include <__algorithm/ranges_unique.h>
-#include <__algorithm/ranges_upper_bound.h>
#include <__algorithm/remove_if.h>
+#include <__algorithm/upper_bound.h>
#include <__assert>
#include <__compare/synth_three_way.h>
#include <__concepts/convertible_to.h>
@@ -443,7 +441,7 @@ class flat_multimap {
is_move_constructible_v<mapped_type>
_LIBCPP_HIDE_FROM_ABI iterator emplace(_Args&&... __args) {
std::pair<key_type, mapped_type> __pair(std::forward<_Args>(__args)...);
- auto __key_it = ranges::upper_bound(__containers_.keys, __pair.first, __compare_);
+ auto __key_it = std::upper_bound(__containers_.keys.begin(), __containers_.keys.end(), __pair.first, __compare_);
auto __mapped_it = __corresponding_mapped_it(*this, __key_it);
return __flat_map_utils::__emplace_exact_pos(
@@ -473,7 +471,7 @@ class flat_multimap {
// |
// hint
// We want to insert "2" after the last existing "2"
- __key_iter = ranges::upper_bound(__containers_.keys.begin(), __key_iter, __pair.first, __compare_);
+ __key_iter = std::upper_bound(__containers_.keys.begin(), __key_iter, __pair.first, __compare_);
__mapped_iter = __corresponding_mapped_it(*this, __key_iter);
} else {
_LIBCPP_ASSERT_INTERNAL(!__prev_larger && __next_smaller, "this means that the multimap is not sorted");
@@ -485,7 +483,7 @@ class flat_multimap {
// |
// hint
// We want to insert "2" before the first existing "2"
- __key_iter = ranges::lower_bound(__key_iter, __containers_.keys.end(), __pair.first, __compare_);
+ __key_iter = std::lower_bound(__key_iter, __containers_.keys.end(), __pair.first, __compare_);
__mapped_iter = __corresponding_mapped_it(*this, __key_iter);
}
return __flat_map_utils::__emplace_exact_pos(
@@ -804,7 +802,8 @@ class flat_multimap {
template <class _Self, class _Kp>
_LIBCPP_HIDE_FROM_ABI static auto __equal_range_impl(_Self&& __self, const _Kp& __key) {
- auto [__key_first, __key_last] = ranges::equal_range(__self.__containers_.keys, __key, __self.__compare_);
+ auto [__key_first, __key_last] =
+ std::equal_range(__self.__containers_.keys.begin(), __self.__containers_.keys.end(), __key, __self.__compare_);
using __iterator_type = ranges::iterator_t<decltype(__self)>;
return std::make_pair(__iterator_type(__key_first, __corresponding_mapped_it(__self, __key_first)),
@@ -813,14 +812,16 @@ class flat_multimap {
template <class _Res, class _Self, class _Kp>
_LIBCPP_HIDE_FROM_ABI static _Res __lower_bound(_Self&& __self, _Kp& __x) {
- auto __key_iter = ranges::lower_bound(__self.__containers_.keys, __x, __self.__compare_);
+ auto __key_iter =
+ std::lower_bound(__self.__containers_.keys.begin(), __self.__containers_.keys.end(), __x, __self.__compare_);
auto __mapped_iter = __corresponding_mapped_it(__self, __key_iter);
return _Res(std::move(__key_iter), std::move(__mapped_iter));
}
template <class _Res, class _Self, class _Kp>
_LIBCPP_HIDE_FROM_ABI static _Res __upper_bound(_Self&& __self, _Kp& __x) {
- auto __key_iter = ranges::upper_bound(__self.__containers_.keys, __x, __self.__compare_);
+ auto __key_iter =
+ std::upper_bound(__self.__containers_.keys.begin(), __self.__containers_.keys.end(), __x, __self.__compare_);
auto __mapped_iter = __corresponding_mapped_it(__self, __key_iter);
return _Res(std::move(__key_iter), std::move(__mapped_iter));
}
diff --git a/libcxx/include/__flat_set/flat_set.h b/libcxx/include/__flat_set/flat_set.h
index dca06c7236e73..b554d7555997e 100644
--- a/libcxx/include/__flat_set/flat_set.h
+++ b/libcxx/include/__flat_set/flat_set.h
@@ -16,7 +16,6 @@
#include <__algorithm/ranges_adjacent_find.h>
#include <__algorithm/ranges_equal.h>
#include <__algorithm/ranges_inplace_merge.h>
-#include <__algorithm/ranges_partition_point.h>
#include <__algorithm/ranges_sort.h>
#include <__algorithm/ranges_unique.h>
#include <__algorithm/remove_if.h>
diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_or_assign_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_or_assign_transparent.pass.cpp
index 636c4edfe551d..3a1e9eb7482b0 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_or_assign_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_or_assign_transparent.pass.cpp
@@ -254,6 +254,18 @@ int main(int, char**) {
};
test_emplace_exception_guarantee(insert_or_assign_iter);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_map<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"epsilon", 1}, {"eta", 3}, {"gamma", 3}};
+ auto [it, inserted] = m.insert_or_assign("alpha", 2);
+ assert(!inserted);
+ assert(it == m.begin());
+ assert(it->second == 2);
+ auto it2 = m.insert_or_assign(m.begin(), "beta2", 2);
+ assert(it2 == m.begin() + 2);
+ assert(it2->second == 2);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/erase_key_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/erase_key_transparent.pass.cpp
index 75a2d205b8f87..c8ae007deb4ff 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/erase_key_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/erase_key_transparent.pass.cpp
@@ -156,6 +156,13 @@ int main(int, char**) {
};
test_erase_exception_guarantee(erase_transparent);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ auto n = m.erase("beta");
+ assert(n == 2);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_transparent.pass.cpp
index 33ca4d4e30469..29e657c80437c 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_transparent.pass.cpp
@@ -131,5 +131,14 @@ int main(int, char**) {
};
test_emplace_exception_guarantee(insert_func_iter);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ auto it = m.insert({"beta", 1});
+ assert(it == m.begin() + 3);
+ auto it2 = m.insert(m.begin(), {"beta2", 2});
+ assert(it2 == m.begin() + 4);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/contains_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/contains_transparent.pass.cpp
index 8a66ec63768d7..6511383210692 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/contains_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/contains_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
#include <deque>
@@ -69,5 +70,12 @@ int main(int, char**) {
assert(b);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ assert(m.contains("beta") == true);
+ assert(m.contains("charlie") == false);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/count_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/count_transparent.pass.cpp
index 41f71065b2f75..b412cbe18f4f6 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/count_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/count_transparent.pass.cpp
@@ -17,6 +17,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -78,6 +79,13 @@ int main(int, char**) {
assert(n == 2);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ assert(m.count("beta") == 2);
+ assert(m.count("charlie") == 0);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/equal_range_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/equal_range_transparent.pass.cpp
index 3666492bb921f..ddc07e000e6f2 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/equal_range_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/equal_range_transparent.pass.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -105,6 +106,14 @@ int main(int, char**) {
assert(p.second == m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ auto [first, last] = m.equal_range("beta");
+ assert(first == m.begin() + 1);
+ assert(last == m.begin() + 3);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/find_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/find_transparent.pass.cpp
index be8c6f2e35440..d35a6300ff504 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/find_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/find_transparent.pass.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -94,6 +95,13 @@ int main(int, char**) {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ auto it = m.find("beta");
+ assert(it == m.begin() + 1);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/lower_bound_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/lower_bound_transparent.pass.cpp
index b757af132e677..dad97552935c0 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/lower_bound_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/lower_bound_transparent.pass.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -102,6 +103,13 @@ int main(int, char**) {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ auto it = m.lower_bound("charlie");
+ assert(it == m.begin() + 3);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/upper_bound_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/upper_bound_transparent.pass.cpp
index 969489d0fe619..88b430829452a 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/upper_bound_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.multimap/flat.multimap.operations/upper_bound_transparent.pass.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include <deque>
#include <flat_map>
+#include <functional>
#include <string>
#include <utility>
@@ -101,6 +102,13 @@ int main(int, char**) {
assert(it == m.begin() + 3);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_multimap<std::string, int, std::less<>>;
+ M m{{"alpha", 1}, {"beta", 2}, {"beta", 1}, {"eta", 3}, {"gamma", 3}};
+ auto it = m.upper_bound("charlie");
+ assert(it == m.begin() + 3);
+ }
return 0;
}
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/erase_key_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/erase_key_transparent.pass.cpp
index 9dd91628d1c29..e432fe5069612 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/erase_key_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/erase_key_transparent.pass.cpp
@@ -138,6 +138,13 @@ void test() {
assert(n == 1);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ auto n = m.erase("beta");
+ assert(n == 1);
+ }
}
void test_exception() {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_transparent.pass.cpp
index f60fd78008a30..c3881622466ae 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_transparent.pass.cpp
@@ -123,6 +123,14 @@ void test() {
ASSERT_SAME_TYPE(decltype(m.insert(m.begin(), Evil())), M::iterator);
ASSERT_SAME_TYPE(decltype(m.insert(m.begin(), m.end())), void);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ auto [iter, inserted] = m.insert("beta");
+ assert(!inserted);
+ assert(iter == m.begin() + 1);
+ }
}
void test_exception() {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/contains_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/contains_transparent.pass.cpp
index cae8eea89471b..bed6fbf17fd88 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/contains_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/contains_transparent.pass.cpp
@@ -14,6 +14,7 @@
#include <cassert>
#include <flat_set>
+#include <functional>
#include <string>
#include <utility>
#include <deque>
@@ -74,6 +75,13 @@ void test() {
assert(b);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ assert(m.contains("beta"));
+ assert(!m.contains("eta2"));
+ }
}
int main(int, char**) {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/count_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/count_transparent.pass.cpp
index b24b6fa712fa9..af932412e0478 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/count_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/count_transparent.pass.cpp
@@ -15,6 +15,7 @@
#include <cassert>
#include <deque>
#include <flat_set>
+#include <functional>
#include <string>
#include <utility>
@@ -73,6 +74,13 @@ void test() {
assert(n == 1);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ assert(m.count("beta") == 1);
+ assert(m.count("eta2") == 0);
+ }
}
int main(int, char**) {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/equal_range_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/equal_range_transparent.pass.cpp
index 8a270ffa15915..0cea7adf57997 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/equal_range_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/equal_range_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_set>
+#include <functional>
#include <string>
#include <utility>
@@ -101,6 +102,14 @@ void test() {
assert(p.first != p.second);
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ auto [first, last] = m.equal_range("beta");
+ assert(first == m.begin() + 1);
+ assert(last == m.begin() + 2);
+ }
}
int main(int, char**) {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/find_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/find_transparent.pass.cpp
index 6ba91bd5ebe43..bd04c75988df1 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/find_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/find_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_set>
+#include <functional>
#include <string>
#include <utility>
@@ -91,6 +92,15 @@ void test() {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ auto it = m.find("beta");
+ assert(it == m.begin() + 1);
+ auto it2 = m.find("beta2");
+ assert(it2 == m.end());
+ }
}
int main(int, char**) {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/lower_bound_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/lower_bound_transparent.pass.cpp
index 8fcfe4d9d432b..c61a755a7b459 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/lower_bound_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/lower_bound_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_set>
+#include <functional>
#include <string>
#include <utility>
@@ -97,6 +98,15 @@ void test() {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ auto it = m.lower_bound("beta");
+ assert(it == m.begin() + 1);
+ auto it2 = m.lower_bound("beta2");
+ assert(it2 == m.begin() + 2);
+ }
}
int main(int, char**) {
diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/upper_bound_transparent.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/upper_bound_transparent.pass.cpp
index db89614dd815b..fa3779e1f81e6 100644
--- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/upper_bound_transparent.pass.cpp
+++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.operations/upper_bound_transparent.pass.cpp
@@ -16,6 +16,7 @@
#include <cassert>
#include <deque>
#include <flat_set>
+#include <functional>
#include <string>
#include <utility>
@@ -97,6 +98,15 @@ void test() {
assert(it != m.end());
assert(transparent_used);
}
+ {
+ // std::string and C string literal
+ using M = std::flat_set<std::string, std::less<>>;
+ M m{"alpha", "beta", "epsilon", "eta", "gamma"};
+ auto it = m.upper_bound("beta");
+ assert(it == m.begin() + 2);
+ auto it2 = m.upper_bound("beta2");
+ assert(it2 == m.begin() + 2);
+ }
}
int main(int, char**) {
More information about the libcxx-commits
mailing list