From dec508817681b8a0cdfe08496cacd98b5084d2d2 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 11:12:16 +0200 Subject: [PATCH 01/14] benchmark --- benchmarks/CMakeLists.txt | 1 + benchmarks/src/flat_meow_assign.cpp | 51 +++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 benchmarks/src/flat_meow_assign.cpp diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index ff6c3ad1651..04e942926d7 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -111,6 +111,7 @@ add_benchmark(filesystem src/filesystem.cpp) add_benchmark(fill src/fill.cpp) add_benchmark(find_and_count src/find_and_count.cpp) add_benchmark(find_first_of src/find_first_of.cpp) +add_benchmark(flat_meow_assign src/flat_meow_assign.cpp) add_benchmark(has_single_bit src/has_single_bit.cpp) add_benchmark(includes src/includes.cpp) add_benchmark(integer_to_string src/integer_to_string.cpp) diff --git a/benchmarks/src/flat_meow_assign.cpp b/benchmarks/src/flat_meow_assign.cpp new file mode 100644 index 00000000000..7f95c32dc53 --- /dev/null +++ b/benchmarks/src/flat_meow_assign.cpp @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include +#include + +using namespace std; + +void flat_map_strings(benchmark::State& state) { + flat_map pieces; + for (auto _ : state) { + pieces = {{"soldier"s, 1}, {"soldier"s, 2}, {"soldier"s, 3}, {"soldier"s, 4}, {"soldier"s, 5}, {"soldier"s, 6}, + {"soldier"s, 7}, {"soldier"s, 8}, {"tour"s, 9}, {"horse"s, 10}, {"elephant"s, 11}, {"vizier"s, 12}, + {"king"s, 13}, {"elephant"s, 14}, {"horse"s, 15}, {"tour"s, 16}}; + benchmark::DoNotOptimize(pieces); + } +} + +void flat_set_strings(benchmark::State& state) { + flat_set pieces; + for (auto _ : state) { + pieces = {"soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, + "tour"s, "horse"s, "elephant"s, "vizier"s, "king"s, "elephant"s, "horse"s, "tour"s}; + benchmark::DoNotOptimize(pieces); + } +} + +void flat_map_integers(benchmark::State& state) { + flat_map pieces; + for (auto _ : state) { + pieces = {{'s', 1}, {'s', 2}, {'s', 3}, {'s', 4}, {'s', 5}, {'s', 6}, {'s', 7}, {'s', 8}, {'T', 9}, {'H', 10}, + {'E', 11}, {'V', 12}, {'K', 13}, {'E', 14}, {'H', 15}, {'T', 16}}; + benchmark::DoNotOptimize(pieces); + } +} + +void flat_set_integers(benchmark::State& state) { + flat_set pieces; + for (auto _ : state) { + pieces = {'s', 's', 's', 's', 's', 's', 's', 's', 'T', 'H', 'E', 'V', 'K', 'E', 'H', 'T'}; + benchmark::DoNotOptimize(pieces); + } +} + +BENCHMARK(flat_map_strings); +BENCHMARK(flat_set_strings); +BENCHMARK(flat_map_integers); +BENCHMARK(flat_set_integers); + +BENCHMARK_MAIN(); From adf2a59ae647e2e3b55b4d83b087550e8f8e246d Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 11:29:42 +0200 Subject: [PATCH 02/14] optimization --- stl/inc/__msvc_string_view.hpp | 5 +++++ stl/inc/flat_map | 14 +++++++++++--- stl/inc/flat_set | 14 ++++++++++---- stl/inc/xstring | 6 ++++++ stl/inc/xutility | 4 ++++ 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index 587f09a142c..b8af4d09571 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -2148,6 +2148,11 @@ inline namespace literals { } // namespace string_view_literals } // namespace literals #endif // _HAS_CXX17 + +#if _HAS_CXX23 +template +constexpr bool _Equivalence_is_equality> = _Is_implementation_handled_char_traits<_Traits>; +#endif // _HAS_CXX23 _STD_END #pragma pop_macro("new") diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 9593e99bec1..9b9b6928af8 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1084,12 +1084,20 @@ private: _STL_INTERNAL_CHECK(_Is_sorted_and_unique()); } + auto _Erase_dupes_if_not_multi_pred() { + if constexpr (_Equivalence_is_equality<_Key>) { + return equal_to<>{}; + } else { + return [this](const_reference _Left, const_reference _Right) { + return this->_Key_equal(_Left.first, _Right.first); + }; + } + } + void _Erase_dupes_if_not_multi() { if constexpr (_IsUnique) { auto _Sorted_view = _View_to_mutate(); - const auto _New_last = _RANGES unique(_Sorted_view, [this](const_reference _Left, const_reference _Right) { - return this->_Key_equal(_Left.first, _Right.first); - }).begin(); + const auto _New_last = _RANGES unique(_Sorted_view, _Erase_dupes_if_not_multi_pred()).begin(); _Data.keys.erase(_New_last._Key_it, _Data.keys.end()); _Data.values.erase(_New_last._Mapped_it, _Data.values.end()); diff --git a/stl/inc/flat_set b/stl/inc/flat_set index 5491de0dee9..f1b1a429585 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -705,13 +705,19 @@ private: } } + auto _Erase_dupes_if_not_multi_pred() { + if constexpr (_Equivalence_is_equality<_Kty>) { + return equal_to<>{}; + } else { + return + [this](const _Kty& _Lhs, const _Kty& _Rhs) { return !_Compare(_Lhs, _Rhs) && !_Compare(_Rhs, _Lhs); }; + } + } + void _Erase_dupes_if_not_multi() { if constexpr (_IsUnique) { - const auto _Equivalent = [this](const _Kty& _Lhs, const _Kty& _Rhs) { - return !_Compare(_Lhs, _Rhs) && !_Compare(_Rhs, _Lhs); - }; const auto _End = _Mycont.end(); - _Mycont.erase(_STD unique(_Mycont.begin(), _End, _Equivalent), _End); + _Mycont.erase(_STD unique(_Mycont.begin(), _End, _Erase_dupes_if_not_multi_pred()), _End); } } diff --git a/stl/inc/xstring b/stl/inc/xstring index 1af2f85fe18..361e28a973c 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -3236,6 +3236,12 @@ private: #pragma warning(pop) +#if _HAS_CXX23 +template +constexpr bool _Equivalence_is_equality> = + _Is_implementation_handled_char_traits<_Traits>; +#endif // _HAS_CXX23 + #if _HAS_CXX17 template >, enable_if_t, _Is_allocator<_Alloc>>, int> = 0> diff --git a/stl/inc/xutility b/stl/inc/xutility index 6988002faeb..14d6b0c4546 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -7920,6 +7920,10 @@ _NODISCARD constexpr bool _Mul_overflow(const _Int _Left, const _Int _Right, _In } #endif // _HAS_CXX17 +#if _HAS_CXX23 +template +constexpr bool _Equivalence_is_equality = is_integral_v<_Ty> || is_pointer_v<_Ty>; +#endif // _HAS_CXX23 _STD_END // TRANSITION, non-_Ugly attribute tokens From 6b8b182b8fd6694a8887ccc23043edb22f33242a Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 12:05:24 +0200 Subject: [PATCH 03/14] wrap --- stl/inc/__msvc_string_view.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index b8af4d09571..cf62fe4a6e2 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -2151,7 +2151,8 @@ inline namespace literals { #if _HAS_CXX23 template -constexpr bool _Equivalence_is_equality> = _Is_implementation_handled_char_traits<_Traits>; +constexpr bool _Equivalence_is_equality> = + _Is_implementation_handled_char_traits<_Traits>; #endif // _HAS_CXX23 _STD_END From 7d7f719d043c9d6afe36a1c9f1094840f557aa86 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 13:16:52 +0200 Subject: [PATCH 04/14] condition --- stl/inc/flat_map | 5 ++++- stl/inc/flat_set | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 9b9b6928af8..21dbb275ebb 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1085,7 +1085,10 @@ private: } auto _Erase_dupes_if_not_multi_pred() { - if constexpr (_Equivalence_is_equality<_Key>) { + if constexpr (_Is_any_of_v<_Compare, less<>, less<_Key>, _RANGES less, greater<>, greater<_Key>, + _RANGES greater> + && _Equivalence_is_equality<_Key>) { + return equal_to<>{}; } else { return [this](const_reference _Left, const_reference _Right) { diff --git a/stl/inc/flat_set b/stl/inc/flat_set index f1b1a429585..a5e3b99e7d8 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -706,7 +706,8 @@ private: } auto _Erase_dupes_if_not_multi_pred() { - if constexpr (_Equivalence_is_equality<_Kty>) { + if constexpr (_Is_any_of_v<_Keylt, less<>, less<_Kty>, _RANGES less, greater<>, greater<_Kty>, _RANGES greater> + && _Equivalence_is_equality<_Kty>) { return equal_to<>{}; } else { return From e3ab3518ac39c9a8d4408de6eed0f057f3e59c7a Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 13:21:34 +0200 Subject: [PATCH 05/14] compare keys --- stl/inc/flat_map | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 21dbb275ebb..a04f57b426f 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1088,8 +1088,7 @@ private: if constexpr (_Is_any_of_v<_Compare, less<>, less<_Key>, _RANGES less, greater<>, greater<_Key>, _RANGES greater> && _Equivalence_is_equality<_Key>) { - - return equal_to<>{}; + return [](const_reference _Left, const_reference _Right) { return _Left.first == _Right.first; }; } else { return [this](const_reference _Left, const_reference _Right) { return this->_Key_equal(_Left.first, _Right.first); From fc48d1c35b2d7c4dd32bd8515f99418ce9a42781 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 15:59:51 +0200 Subject: [PATCH 06/14] one wield ranges trick --- stl/inc/flat_map | 6 +++--- stl/inc/flat_set | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index a04f57b426f..6df57b2a927 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1085,9 +1085,9 @@ private: } auto _Erase_dupes_if_not_multi_pred() { - if constexpr (_Is_any_of_v<_Compare, less<>, less<_Key>, _RANGES less, greater<>, greater<_Key>, - _RANGES greater> - && _Equivalence_is_equality<_Key>) { + if constexpr (_Is_any_of_v<_Compare, _RANGES less, _RANGES greater> + || (_Is_any_of_v<_Compare, less<>, less<_Key>, greater<>, greater<_Key>> + && _Equivalence_is_equality<_Key>) ) { return [](const_reference _Left, const_reference _Right) { return _Left.first == _Right.first; }; } else { return [this](const_reference _Left, const_reference _Right) { diff --git a/stl/inc/flat_set b/stl/inc/flat_set index a5e3b99e7d8..df6c3d9579d 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -706,8 +706,10 @@ private: } auto _Erase_dupes_if_not_multi_pred() { - if constexpr (_Is_any_of_v<_Keylt, less<>, less<_Kty>, _RANGES less, greater<>, greater<_Kty>, _RANGES greater> - && _Equivalence_is_equality<_Kty>) { + if constexpr (_Is_any_of_v<_Keylt, _RANGES less, _RANGES greater> + || (_Is_any_of_v<_Keylt, less<>, less<_Kty>, greater<>, greater<_Kty>> + && _Equivalence_is_equality<_Kty>) ) { + return equal_to<>{}; } else { return From e524bc4448f691f6e1cc9cf0a705be25a90e02d3 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 17:04:13 +0200 Subject: [PATCH 07/14] -newline --- stl/inc/flat_set | 1 - 1 file changed, 1 deletion(-) diff --git a/stl/inc/flat_set b/stl/inc/flat_set index df6c3d9579d..6444da06519 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -709,7 +709,6 @@ private: if constexpr (_Is_any_of_v<_Keylt, _RANGES less, _RANGES greater> || (_Is_any_of_v<_Keylt, less<>, less<_Kty>, greater<>, greater<_Kty>> && _Equivalence_is_equality<_Kty>) ) { - return equal_to<>{}; } else { return From 367a29a616c60dd87be0171742b62c6f0e50c706 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 18:50:40 +0200 Subject: [PATCH 08/14] Sorted range --- stl/inc/flat_map | 2 +- stl/inc/flat_set | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 6df57b2a927..578760535d6 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1091,7 +1091,7 @@ private: return [](const_reference _Left, const_reference _Right) { return _Left.first == _Right.first; }; } else { return [this](const_reference _Left, const_reference _Right) { - return this->_Key_equal(_Left.first, _Right.first); + return !this->_Key_compare(_Left.first, _Right.first); }; } } diff --git a/stl/inc/flat_set b/stl/inc/flat_set index 6444da06519..0450d2808d3 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -711,8 +711,7 @@ private: && _Equivalence_is_equality<_Kty>) ) { return equal_to<>{}; } else { - return - [this](const _Kty& _Lhs, const _Kty& _Rhs) { return !_Compare(_Lhs, _Rhs) && !_Compare(_Rhs, _Lhs); }; + return [this](const _Kty& _Lhs, const _Kty& _Rhs) { return !_Compare(_Lhs, _Rhs); }; } } From a905fc06dfbf09653b8914b8a17b8dd99af168d3 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 18 Jan 2026 19:02:52 +0200 Subject: [PATCH 09/14] Revert "Sorted range" This reverts commit 367a29a616c60dd87be0171742b62c6f0e50c706. --- stl/inc/flat_map | 2 +- stl/inc/flat_set | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 578760535d6..6df57b2a927 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1091,7 +1091,7 @@ private: return [](const_reference _Left, const_reference _Right) { return _Left.first == _Right.first; }; } else { return [this](const_reference _Left, const_reference _Right) { - return !this->_Key_compare(_Left.first, _Right.first); + return this->_Key_equal(_Left.first, _Right.first); }; } } diff --git a/stl/inc/flat_set b/stl/inc/flat_set index 0450d2808d3..6444da06519 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -711,7 +711,8 @@ private: && _Equivalence_is_equality<_Kty>) ) { return equal_to<>{}; } else { - return [this](const _Kty& _Lhs, const _Kty& _Rhs) { return !_Compare(_Lhs, _Rhs); }; + return + [this](const _Kty& _Lhs, const _Kty& _Rhs) { return !_Compare(_Lhs, _Rhs) && !_Compare(_Rhs, _Lhs); }; } } From 705ba1391386bc77e9c091f60a7bb39e61fb53d1 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 20 Jan 2026 06:51:39 -0800 Subject: [PATCH 10/14] Extract and comment a combined compare-key trait. --- stl/inc/__msvc_string_view.hpp | 2 +- stl/inc/flat_map | 4 +--- stl/inc/flat_set | 4 +--- stl/inc/xstring | 2 +- stl/inc/xutility | 8 +++++++- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/stl/inc/__msvc_string_view.hpp b/stl/inc/__msvc_string_view.hpp index cf62fe4a6e2..303653318e3 100644 --- a/stl/inc/__msvc_string_view.hpp +++ b/stl/inc/__msvc_string_view.hpp @@ -2151,7 +2151,7 @@ inline namespace literals { #if _HAS_CXX23 template -constexpr bool _Equivalence_is_equality> = +constexpr bool _Equivalence_is_equality_impl> = _Is_implementation_handled_char_traits<_Traits>; #endif // _HAS_CXX23 _STD_END diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 6df57b2a927..78de7e5e75d 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1085,9 +1085,7 @@ private: } auto _Erase_dupes_if_not_multi_pred() { - if constexpr (_Is_any_of_v<_Compare, _RANGES less, _RANGES greater> - || (_Is_any_of_v<_Compare, less<>, less<_Key>, greater<>, greater<_Key>> - && _Equivalence_is_equality<_Key>) ) { + if constexpr (_Equivalence_is_equality<_Compare, _Key>) { return [](const_reference _Left, const_reference _Right) { return _Left.first == _Right.first; }; } else { return [this](const_reference _Left, const_reference _Right) { diff --git a/stl/inc/flat_set b/stl/inc/flat_set index 6444da06519..7bc3f831a0e 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -706,9 +706,7 @@ private: } auto _Erase_dupes_if_not_multi_pred() { - if constexpr (_Is_any_of_v<_Keylt, _RANGES less, _RANGES greater> - || (_Is_any_of_v<_Keylt, less<>, less<_Kty>, greater<>, greater<_Kty>> - && _Equivalence_is_equality<_Kty>) ) { + if constexpr (_Equivalence_is_equality<_Keylt, _Kty>) { return equal_to<>{}; } else { return diff --git a/stl/inc/xstring b/stl/inc/xstring index 361e28a973c..1617a4aa381 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -3238,7 +3238,7 @@ private: #if _HAS_CXX23 template -constexpr bool _Equivalence_is_equality> = +constexpr bool _Equivalence_is_equality_impl> = _Is_implementation_handled_char_traits<_Traits>; #endif // _HAS_CXX23 diff --git a/stl/inc/xutility b/stl/inc/xutility index 14d6b0c4546..39e202b8c27 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -7922,7 +7922,13 @@ _NODISCARD constexpr bool _Mul_overflow(const _Int _Left, const _Int _Right, _In #if _HAS_CXX23 template -constexpr bool _Equivalence_is_equality = is_integral_v<_Ty> || is_pointer_v<_Ty>; +constexpr bool _Equivalence_is_equality_impl = is_integral_v<_Ty> || is_pointer_v<_Ty>; + +// For ranges::less and ranges::greater, see N5032 [range.cmp]/9, [concept.totallyordered]/1.1, [cmp.concept]/1.2. +template +constexpr bool _Equivalence_is_equality = + _Is_any_of_v<_Compare, _RANGES less, _RANGES greater> + || (_Is_any_of_v<_Compare, less<>, less<_Key>, greater<>, greater<_Key>> && _Equivalence_is_equality_impl<_Key>); #endif // _HAS_CXX23 _STD_END From dc6f606046d192f71f1704cdcf118d1227e070b7 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 20 Jan 2026 06:59:39 -0800 Subject: [PATCH 11/14] Add `_STL_INTERNAL_STATIC_ASSERT(_IsUnique);` --- stl/inc/flat_map | 1 + stl/inc/flat_set | 1 + 2 files changed, 2 insertions(+) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 78de7e5e75d..76c3af77b8c 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1085,6 +1085,7 @@ private: } auto _Erase_dupes_if_not_multi_pred() { + _STL_INTERNAL_STATIC_ASSERT(_IsUnique); if constexpr (_Equivalence_is_equality<_Compare, _Key>) { return [](const_reference _Left, const_reference _Right) { return _Left.first == _Right.first; }; } else { diff --git a/stl/inc/flat_set b/stl/inc/flat_set index 7bc3f831a0e..d5de1e9ff2e 100644 --- a/stl/inc/flat_set +++ b/stl/inc/flat_set @@ -706,6 +706,7 @@ private: } auto _Erase_dupes_if_not_multi_pred() { + _STL_INTERNAL_STATIC_ASSERT(_IsUnique); if constexpr (_Equivalence_is_equality<_Keylt, _Kty>) { return equal_to<>{}; } else { From 013419a9db931724cf2416925c22a16827009910 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 20 Jan 2026 07:00:20 -0800 Subject: [PATCH 12/14] Add `_STATIC_CALL_OPERATOR`. --- stl/inc/flat_map | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 76c3af77b8c..79131f977ec 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1087,7 +1087,8 @@ private: auto _Erase_dupes_if_not_multi_pred() { _STL_INTERNAL_STATIC_ASSERT(_IsUnique); if constexpr (_Equivalence_is_equality<_Compare, _Key>) { - return [](const_reference _Left, const_reference _Right) { return _Left.first == _Right.first; }; + return [](const_reference _Left, const_reference _Right) + _STATIC_CALL_OPERATOR { return _Left.first == _Right.first; }; } else { return [this](const_reference _Left, const_reference _Right) { return this->_Key_equal(_Left.first, _Right.first); From 2a287f64a8ebb590859796a30b210fd20cffe631 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 20 Jan 2026 07:04:48 -0800 Subject: [PATCH 13/14] Drop `this->` for `_Key_equal`. --- stl/inc/flat_map | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stl/inc/flat_map b/stl/inc/flat_map index 79131f977ec..394fa0394ad 100644 --- a/stl/inc/flat_map +++ b/stl/inc/flat_map @@ -1090,9 +1090,8 @@ private: return [](const_reference _Left, const_reference _Right) _STATIC_CALL_OPERATOR { return _Left.first == _Right.first; }; } else { - return [this](const_reference _Left, const_reference _Right) { - return this->_Key_equal(_Left.first, _Right.first); - }; + return + [this](const_reference _Left, const_reference _Right) { return _Key_equal(_Left.first, _Right.first); }; } } From 305ad985af996a9197c13966f3383e149cd59d65 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 20 Jan 2026 07:14:30 -0800 Subject: [PATCH 14/14] tour => tower (i.e. rook) --- benchmarks/src/flat_meow_assign.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/benchmarks/src/flat_meow_assign.cpp b/benchmarks/src/flat_meow_assign.cpp index 7f95c32dc53..07b718695f5 100644 --- a/benchmarks/src/flat_meow_assign.cpp +++ b/benchmarks/src/flat_meow_assign.cpp @@ -4,6 +4,7 @@ #include #include #include +#include using namespace std; @@ -11,8 +12,8 @@ void flat_map_strings(benchmark::State& state) { flat_map pieces; for (auto _ : state) { pieces = {{"soldier"s, 1}, {"soldier"s, 2}, {"soldier"s, 3}, {"soldier"s, 4}, {"soldier"s, 5}, {"soldier"s, 6}, - {"soldier"s, 7}, {"soldier"s, 8}, {"tour"s, 9}, {"horse"s, 10}, {"elephant"s, 11}, {"vizier"s, 12}, - {"king"s, 13}, {"elephant"s, 14}, {"horse"s, 15}, {"tour"s, 16}}; + {"soldier"s, 7}, {"soldier"s, 8}, {"tower"s, 9}, {"horse"s, 10}, {"elephant"s, 11}, {"vizier"s, 12}, + {"king"s, 13}, {"elephant"s, 14}, {"horse"s, 15}, {"tower"s, 16}}; benchmark::DoNotOptimize(pieces); } } @@ -21,7 +22,7 @@ void flat_set_strings(benchmark::State& state) { flat_set pieces; for (auto _ : state) { pieces = {"soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, "soldier"s, - "tour"s, "horse"s, "elephant"s, "vizier"s, "king"s, "elephant"s, "horse"s, "tour"s}; + "tower"s, "horse"s, "elephant"s, "vizier"s, "king"s, "elephant"s, "horse"s, "tower"s}; benchmark::DoNotOptimize(pieces); } }