From 061cd0de555bb7dcc7cc7f8a130b32a80370ba50 Mon Sep 17 00:00:00 2001 From: Andrew Lazarev Date: Thu, 25 Sep 2025 10:01:35 -0700 Subject: [PATCH] =?UTF-8?q?Revert=20"[libc++]=20Avoid=20constructing=20add?= =?UTF-8?q?itional=20objects=20when=20using=20map::at=20(#1=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 833d5f0cd8bec8de84cdbefc49c4ef4566a5b356. --- libcxx/include/CMakeLists.txt | 2 - libcxx/include/__algorithm/comp.h | 4 -- libcxx/include/__functional/is_transparent.h | 8 --- libcxx/include/__functional/operations.h | 18 ------- .../include/__functional/ranges_operations.h | 7 --- libcxx/include/__tree | 4 +- .../is_generic_transparent_comparator.h | 30 ----------- .../include/__type_traits/make_transparent.h | 48 ----------------- libcxx/include/map | 54 +++---------------- libcxx/include/module.modulemap.in | 2 - libcxx/include/string | 16 ------ .../containers/associative/map.bench.cpp | 13 ----- .../associative/unordered_map.bench.cpp | 13 ----- 13 files changed, 8 insertions(+), 211 deletions(-) delete mode 100644 libcxx/include/__type_traits/is_generic_transparent_comparator.h delete mode 100644 libcxx/include/__type_traits/make_transparent.h diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index ddace8bf8c728..e050362abb658 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -839,7 +839,6 @@ set(files __type_traits/is_floating_point.h __type_traits/is_function.h __type_traits/is_fundamental.h - __type_traits/is_generic_transparent_comparator.h __type_traits/is_implicit_lifetime.h __type_traits/is_implicitly_default_constructible.h __type_traits/is_integral.h @@ -882,7 +881,6 @@ set(files __type_traits/make_32_64_or_128_bit.h __type_traits/make_const_lvalue_ref.h __type_traits/make_signed.h - __type_traits/make_transparent.h __type_traits/make_unsigned.h __type_traits/maybe_const.h __type_traits/nat.h diff --git a/libcxx/include/__algorithm/comp.h b/libcxx/include/__algorithm/comp.h index 38e2fb9f5e744..ab3c598418828 100644 --- a/libcxx/include/__algorithm/comp.h +++ b/libcxx/include/__algorithm/comp.h @@ -11,7 +11,6 @@ #include <__config> #include <__type_traits/desugars_to.h> -#include <__type_traits/is_generic_transparent_comparator.h> #include <__type_traits/is_integral.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -49,9 +48,6 @@ inline const bool __desugars_to_v<__less_tag, __less<>, _Tp, _Tp> = true; template inline const bool __desugars_to_v<__totally_ordered_less_tag, __less<>, _Tp, _Tp> = is_integral<_Tp>::value; -template <> -inline const bool __is_generic_transparent_comparator_v<__less<> > = true; - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___ALGORITHM_COMP_H diff --git a/libcxx/include/__functional/is_transparent.h b/libcxx/include/__functional/is_transparent.h index c2c6fbce2465b..567df1a662f54 100644 --- a/libcxx/include/__functional/is_transparent.h +++ b/libcxx/include/__functional/is_transparent.h @@ -29,14 +29,6 @@ inline const bool __is_transparent_v<_Tp, _Key, __void_t(arg))`. -// -// This is different from `__is_transparent_v`, which is only a property of the comparator and doesn't provide -// additional semantic guarantees. -template -inline const bool __is_transparently_comparable_v = false; - _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___FUNCTIONAL_IS_TRANSPARENT diff --git a/libcxx/include/__functional/operations.h b/libcxx/include/__functional/operations.h index 7f315ca851c08..7b0ea11db5844 100644 --- a/libcxx/include/__functional/operations.h +++ b/libcxx/include/__functional/operations.h @@ -15,9 +15,7 @@ #include <__functional/unary_function.h> #include <__fwd/functional.h> #include <__type_traits/desugars_to.h> -#include <__type_traits/is_generic_transparent_comparator.h> #include <__type_traits/is_integral.h> -#include <__type_traits/make_transparent.h> #include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -379,14 +377,6 @@ struct less { typedef void is_transparent; }; -template -struct __make_transparent > { - using type _LIBCPP_NODEBUG = less<>; -}; - -template <> -inline const bool __is_generic_transparent_comparator_v> = true; - template inline const bool __desugars_to_v<__less_tag, less<>, _Tp, _Up> = true; @@ -476,14 +466,6 @@ struct greater { template inline const bool __desugars_to_v<__greater_tag, greater<>, _Tp, _Up> = true; - -template -struct __make_transparent> { - using type _LIBCPP_NODEBUG = greater<>; -}; - -template <> -inline const bool __is_generic_transparent_comparator_v> = true; #endif // Logical operations diff --git a/libcxx/include/__functional/ranges_operations.h b/libcxx/include/__functional/ranges_operations.h index dc9da061af264..df95843e7c9af 100644 --- a/libcxx/include/__functional/ranges_operations.h +++ b/libcxx/include/__functional/ranges_operations.h @@ -14,7 +14,6 @@ #include <__concepts/totally_ordered.h> #include <__config> #include <__type_traits/desugars_to.h> -#include <__type_traits/is_generic_transparent_comparator.h> #include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -109,12 +108,6 @@ inline const bool __desugars_to_v<__less_tag, ranges::less, _Tp, _Up> = true; template inline const bool __desugars_to_v<__greater_tag, ranges::greater, _Tp, _Up> = true; -template <> -inline const bool __is_generic_transparent_comparator_v = true; - -template <> -inline const bool __is_generic_transparent_comparator_v = true; - #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/__tree b/libcxx/include/__tree index ef960d481cb7b..61c910c52c536 100644 --- a/libcxx/include/__tree +++ b/libcxx/include/__tree @@ -34,7 +34,6 @@ #include <__type_traits/is_same.h> #include <__type_traits/is_specialization.h> #include <__type_traits/is_swappable.h> -#include <__type_traits/make_transparent.h> #include <__type_traits/remove_const.h> #include <__utility/forward.h> #include <__utility/lazy_synth_three_way_comparator.h> @@ -1750,8 +1749,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(const _Key& __v) { } __node_base_pointer* __node_ptr = __root_ptr(); - auto&& __transparent = std::__as_transparent(value_comp()); - auto __comp = __lazy_synth_three_way_comparator<__make_transparent_t<_Compare>, _Key, value_type>(__transparent); + auto __comp = __lazy_synth_three_way_comparator<_Compare, _Key, value_type>(value_comp()); while (true) { auto __comp_res = __comp(__v, __nd->__get_value()); diff --git a/libcxx/include/__type_traits/is_generic_transparent_comparator.h b/libcxx/include/__type_traits/is_generic_transparent_comparator.h deleted file mode 100644 index fd02c0b0423d1..0000000000000 --- a/libcxx/include/__type_traits/is_generic_transparent_comparator.h +++ /dev/null @@ -1,30 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___TYPE_TRAITS_IS_GENERIC_TRANSPARENT_COMPARATOR_H -#define _LIBCPP___TYPE_TRAITS_IS_GENERIC_TRANSPARENT_COMPARATOR_H - -#include <__config> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -_LIBCPP_BEGIN_NAMESPACE_STD - -// This traits returns true if the given _Comparator is known to accept any two types for compaison. This is separate -// from `__is_transparent_v`, since that only enables overloads of specific functions, but doesn't give any semantic -// guarantees. This trait guarantess that the comparator simply calls the appropriate comparison functions for any two -// types. - -template -inline const bool __is_generic_transparent_comparator_v = false; - -_LIBCPP_END_NAMESPACE_STD - -#endif // _LIBCPP___TYPE_TRAITS_IS_GENERIC_TRANSPARENT_COMPARATOR_H diff --git a/libcxx/include/__type_traits/make_transparent.h b/libcxx/include/__type_traits/make_transparent.h deleted file mode 100644 index 4d3207a807fa7..0000000000000 --- a/libcxx/include/__type_traits/make_transparent.h +++ /dev/null @@ -1,48 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___TYPE_TRAITS_MAKE_TRANSPARENT_H -#define _LIBCPP___TYPE_TRAITS_MAKE_TRANSPARENT_H - -#include <__config> -#include <__type_traits/enable_if.h> -#include <__type_traits/is_empty.h> -#include <__type_traits/is_same.h> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -_LIBCPP_BEGIN_NAMESPACE_STD - -// __make_transparent tries to create a transparent comparator from its non-transparent counterpart, e.g. obtain -// `less<>` from `less`. This is useful in cases where conversions can be avoided (e.g. a string literal to a -// std::string). - -template -struct __make_transparent { - using type _LIBCPP_NODEBUG = _Comparator; -}; - -template -using __make_transparent_t _LIBCPP_NODEBUG = typename __make_transparent<_Comparator>::type; - -template >::value, int> = 0> -_LIBCPP_HIDE_FROM_ABI _Comparator& __as_transparent(_Comparator& __comp) { - return __comp; -} - -template >::value, int> = 0> -_LIBCPP_HIDE_FROM_ABI __make_transparent_t<_Comparator> __as_transparent(_Comparator&) { - static_assert(is_empty<_Comparator>::value); - return __make_transparent_t<_Comparator>(); -} - -_LIBCPP_END_NAMESPACE_STD - -#endif // _LIBCPP___TYPE_TRAITS_MAKE_TRANSPARENT_H diff --git a/libcxx/include/map b/libcxx/include/map index 035f913bd3497..a63dfec910aae 100644 --- a/libcxx/include/map +++ b/libcxx/include/map @@ -600,10 +600,7 @@ erase_if(multimap& c, Predicate pred); // C++20 # include <__ranges/from_range.h> # include <__tree> # include <__type_traits/container_traits.h> -# include <__type_traits/desugars_to.h> # include <__type_traits/is_allocator.h> -# include <__type_traits/is_convertible.h> -# include <__type_traits/make_transparent.h> # include <__type_traits/remove_const.h> # include <__type_traits/type_identity.h> # include <__utility/forward.h> @@ -669,11 +666,6 @@ public: # endif }; -template -struct __make_transparent<__map_value_compare<_Key, _MapValueT, _Compare> > { - using type _LIBCPP_NODEBUG = __map_value_compare<_Key, _MapValueT, __make_transparent_t<_Compare> >; -}; - # if _LIBCPP_STD_VER >= 14 template struct __lazy_synth_three_way_comparator<__map_value_compare<_Key, _MapValueT, _Compare>, _MapValueT, _MapValueT> { @@ -1056,24 +1048,6 @@ public: _LIBCPP_HIDE_FROM_ABI mapped_type& operator[](key_type&& __k); # endif - template >, int> = 0> - _LIBCPP_HIDE_FROM_ABI mapped_type& at(_Arg&& __arg) { - auto [_, __child] = __tree_.__find_equal(__arg); - if (__child == nullptr) - std::__throw_out_of_range("map::at: key not found"); - return static_cast<__node_pointer>(__child)->__get_value().second; - } - - template >, int> = 0> - _LIBCPP_HIDE_FROM_ABI const mapped_type& at(_Arg&& __arg) const { - auto [_, __child] = __tree_.__find_equal(__arg); - if (__child == nullptr) - std::__throw_out_of_range("map::at: key not found"); - return static_cast<__node_pointer>(__child)->__get_value().second; - } - _LIBCPP_HIDE_FROM_ABI mapped_type& at(const key_type& __k); _LIBCPP_HIDE_FROM_ABI const mapped_type& at(const key_type& __k) const; @@ -1268,15 +1242,11 @@ public: _LIBCPP_HIDE_FROM_ABI iterator find(const key_type& __k) { return __tree_.find(__k); } _LIBCPP_HIDE_FROM_ABI const_iterator find(const key_type& __k) const { return __tree_.find(__k); } # if _LIBCPP_STD_VER >= 14 - template || __is_transparently_comparable_v<_Compare, key_type, _K2>, - int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI iterator find(const _K2& __k) { return __tree_.find(__k); } - template || __is_transparently_comparable_v<_Compare, key_type, _K2>, - int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI const_iterator find(const _K2& __k) const { return __tree_.find(__k); } @@ -1292,9 +1262,7 @@ public: # if _LIBCPP_STD_VER >= 20 _LIBCPP_HIDE_FROM_ABI bool contains(const key_type& __k) const { return find(__k) != end(); } - template || __is_transparently_comparable_v<_Compare, key_type, _K2>, - int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI bool contains(const _K2& __k) const { return find(__k) != end(); } @@ -1303,16 +1271,12 @@ public: _LIBCPP_HIDE_FROM_ABI iterator lower_bound(const key_type& __k) { return __tree_.lower_bound(__k); } _LIBCPP_HIDE_FROM_ABI const_iterator lower_bound(const key_type& __k) const { return __tree_.lower_bound(__k); } # if _LIBCPP_STD_VER >= 14 - template || __is_transparently_comparable_v<_Compare, key_type, _K2>, - int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI iterator lower_bound(const _K2& __k) { return __tree_.lower_bound(__k); } - template || __is_transparently_comparable_v<_Compare, key_type, _K2>, - int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI const_iterator lower_bound(const _K2& __k) const { return __tree_.lower_bound(__k); } @@ -1321,15 +1285,11 @@ public: _LIBCPP_HIDE_FROM_ABI iterator upper_bound(const key_type& __k) { return __tree_.upper_bound(__k); } _LIBCPP_HIDE_FROM_ABI const_iterator upper_bound(const key_type& __k) const { return __tree_.upper_bound(__k); } # if _LIBCPP_STD_VER >= 14 - template || __is_transparently_comparable_v<_Compare, key_type, _K2>, - int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI iterator upper_bound(const _K2& __k) { return __tree_.upper_bound(__k); } - template || __is_transparently_comparable_v<_Compare, key_type, _K2>, - int> = 0> + template , int> = 0> _LIBCPP_HIDE_FROM_ABI const_iterator upper_bound(const _K2& __k) const { return __tree_.upper_bound(__k); } diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in index 9b0a7bb433552..dc1933324ef79 100644 --- a/libcxx/include/module.modulemap.in +++ b/libcxx/include/module.modulemap.in @@ -200,7 +200,6 @@ module std_core [system] { header "__type_traits/is_fundamental.h" export std_core.type_traits.integral_constant } - module is_generic_transparent_comparator { header "__type_traits/is_generic_transparent_comparator.h" } module is_implicit_lifetime { header "__type_traits/is_implicit_lifetime.h" export std_core.type_traits.integral_constant @@ -354,7 +353,6 @@ module std_core [system] { module make_32_64_or_128_bit { header "__type_traits/make_32_64_or_128_bit.h" } module make_const_lvalue_ref { header "__type_traits/make_const_lvalue_ref.h" } module make_signed { header "__type_traits/make_signed.h" } - module make_transparent { header "__type_traits/make_transparent.h" } module make_unsigned { header "__type_traits/make_unsigned.h" } module maybe_const { header "__type_traits/maybe_const.h" } module nat { header "__type_traits/nat.h" } diff --git a/libcxx/include/string b/libcxx/include/string index b5b1624201e38..729a420d47598 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -600,7 +600,6 @@ basic_string operator""s( const char32_t *str, size_t len ); # include <__debug_utils/sanitizers.h> # include <__format/enable_insertable.h> # include <__functional/hash.h> -# include <__functional/is_transparent.h> # include <__functional/unary_function.h> # include <__fwd/string.h> # include <__iterator/bounded_iter.h> @@ -629,7 +628,6 @@ basic_string operator""s( const char32_t *str, size_t len ); # include <__type_traits/is_allocator.h> # include <__type_traits/is_array.h> # include <__type_traits/is_convertible.h> -# include <__type_traits/is_generic_transparent_comparator.h> # include <__type_traits/is_nothrow_assignable.h> # include <__type_traits/is_nothrow_constructible.h> # include <__type_traits/is_replaceable.h> @@ -2569,20 +2567,6 @@ struct __default_three_way_comparator, bas }; # endif -template -inline const bool __is_transparently_comparable_v<_Comparator, - basic_string<_CharT, _Traits, _Alloc>, - const _CharT*, - __enable_if_t<__is_generic_transparent_comparator_v<_Comparator> > > = - true; - -template -inline const bool __is_transparently_comparable_v<_Comparator, - basic_string<_CharT, _Traits, _Alloc>, - _CharT[_Np], - __enable_if_t<__is_generic_transparent_comparator_v<_Comparator> > > = - true; - # if _LIBCPP_STD_VER >= 17 template , diff --git a/libcxx/test/benchmarks/containers/associative/map.bench.cpp b/libcxx/test/benchmarks/containers/associative/map.bench.cpp index 142229ae64cad..bd664dbb56ee7 100644 --- a/libcxx/test/benchmarks/containers/associative/map.bench.cpp +++ b/libcxx/test/benchmarks/containers/associative/map.bench.cpp @@ -16,19 +16,6 @@ #include "../../GenerateInput.h" #include "benchmark/benchmark.h" -static void BM_map_find_string_literal(benchmark::State& state) { - std::map map; - map.emplace("Something very very long to show a long string situation", 1); - map.emplace("Something Else", 2); - - for (auto _ : state) { - benchmark::DoNotOptimize(map); - benchmark::DoNotOptimize(map.find("Something very very long to show a long string situation")); - } -} - -BENCHMARK(BM_map_find_string_literal); - template struct support::adapt_operations> { using ValueType = typename std::map::value_type; diff --git a/libcxx/test/benchmarks/containers/associative/unordered_map.bench.cpp b/libcxx/test/benchmarks/containers/associative/unordered_map.bench.cpp index d670c531910ea..57adec2d214d4 100644 --- a/libcxx/test/benchmarks/containers/associative/unordered_map.bench.cpp +++ b/libcxx/test/benchmarks/containers/associative/unordered_map.bench.cpp @@ -15,19 +15,6 @@ #include "../../GenerateInput.h" #include "benchmark/benchmark.h" -static void BM_map_find_string_literal(benchmark::State& state) { - std::unordered_map map; - map.emplace("Something very very long to show a long string situation", 1); - map.emplace("Something Else", 2); - - for (auto _ : state) { - benchmark::DoNotOptimize(map); - benchmark::DoNotOptimize(map.find("Something very very long to show a long string situation")); - } -} - -BENCHMARK(BM_map_find_string_literal); - template struct support::adapt_operations> { using ValueType = typename std::unordered_map::value_type;