From f3253bd7bd49e54fe56cfb7e41fed4d8183803de Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 19 Mar 2025 22:22:56 +0000 Subject: [PATCH] libstdc++: Add from_range_t constructors to debug ordered containers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libstdc++-v3/ChangeLog: * include/debug/map.h (map): Add from_range constructors and deduction guides. * include/debug/multimap.h (multimap): Likewise. * include/debug/multiset.h (multiset): Likewise. * include/debug/set.h (set): Likewise. Reviewed-by: Tomasz KamiƄski --- libstdc++-v3/include/debug/map.h | 36 +++++++++++++++++++++++++++ libstdc++-v3/include/debug/multimap.h | 36 +++++++++++++++++++++++++++ libstdc++-v3/include/debug/multiset.h | 30 ++++++++++++++++++++++ libstdc++-v3/include/debug/set.h | 32 +++++++++++++++++++++++- 4 files changed, 133 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index a9fac790b1c..aa1c1dbd47a 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -133,6 +133,25 @@ namespace __debug __gnu_debug::__base(__last), __a) { } +#if __glibcxx_ranges_to_container // C++ >= 23 + /** + * @brief Construct a map from a range. + * @since C++23 + */ + template _Rg> + map(std::from_range_t __t, _Rg&& __rg, + const _Compare& __c, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __c, __a) + { } + + template _Rg> + map(std::from_range_t __t, _Rg&& __rg, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __a) + { } +#endif + ~map() = default; #endif @@ -740,6 +759,23 @@ namespace __debug map(initializer_list>, _Allocator) -> map<_Key, _Tp, less<_Key>, _Allocator>; +#if __glibcxx_ranges_to_container // C++ >= 23 + template>, + __allocator_like _Alloc = + std::allocator<__detail::__range_to_alloc_type<_Rg>>> + map(from_range_t, _Rg&&, _Compare = _Compare(), _Alloc = _Alloc()) + -> map<__detail::__range_key_type<_Rg>, + __detail::__range_mapped_type<_Rg>, + _Compare, _Alloc>; + + template + map(from_range_t, _Rg&&, _Alloc) + -> map<__detail::__range_key_type<_Rg>, + __detail::__range_mapped_type<_Rg>, + less<__detail::__range_key_type<_Rg>>, + _Alloc>; +#endif #endif // deduction guides template= 23 + /** + * @brief Construct a multimap from a range. + * @since C++23 + */ + template _Rg> + multimap(std::from_range_t __t, _Rg&& __rg, + const _Compare& __c, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __c, __a) + { } + + template _Rg> + multimap(std::from_range_t __t, _Rg&& __rg, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __a) + { } +#endif + ~multimap() = default; #endif @@ -622,6 +641,23 @@ namespace __debug multimap(initializer_list>, _Allocator) -> multimap<_Key, _Tp, less<_Key>, _Allocator>; +#if __glibcxx_ranges_to_container // C++ >= 23 + template>, + __allocator_like _Alloc = + std::allocator<__detail::__range_to_alloc_type<_Rg>>> + multimap(from_range_t, _Rg&&, _Compare = _Compare(), _Alloc = _Alloc()) + -> multimap<__detail::__range_key_type<_Rg>, + __detail::__range_mapped_type<_Rg>, + _Compare, _Alloc>; + + template + multimap(from_range_t, _Rg&&, _Alloc) + -> multimap<__detail::__range_key_type<_Rg>, + __detail::__range_mapped_type<_Rg>, + less<__detail::__range_key_type<_Rg>>, + _Alloc>; +#endif #endif template= 23 + /** + * @brief Construct a multiset from a range. + * @since C++23 + */ + template _Rg> + multiset(std::from_range_t __t, _Rg&& __rg, + const _Compare& __c, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __c, __a) + { } + + template _Rg> + multiset(std::from_range_t __t, _Rg&& __rg, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __a) + { } +#endif + ~multiset() = default; #endif @@ -594,6 +613,17 @@ namespace __debug multiset(initializer_list<_Key>, _Allocator) -> multiset<_Key, less<_Key>, _Allocator>; +#if __glibcxx_ranges_to_container // C++ >= 23 + template>, + __allocator_like _Alloc = std::allocator>> + multiset(from_range_t, _Rg&&, _Compare = _Compare(), _Alloc = _Alloc()) + -> multiset, _Compare, _Alloc>; + + template + multiset(from_range_t, _Rg&&, _Alloc) + -> multiset, less>, _Alloc>; +#endif #endif // deduction guides template diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index 5f6cf123898..9555555975f 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -131,7 +131,26 @@ namespace __debug __glibcxx_check_valid_constructor_range(__first, __last)), __gnu_debug::__base(__last), __a) { } - ~set() = default; +#if __glibcxx_ranges_to_container // C++ >= 23 + /** + * @brief Construct a set from a range. + * @since C++23 + */ + template _Rg> + set(std::from_range_t __t, _Rg&& __rg, + const _Compare& __c, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __c, __a) + { } + + template _Rg> + set(std::from_range_t __t, _Rg&& __rg, + const allocator_type& __a = allocator_type()) + : _Base(__t, std::forward<_Rg>(__rg), __a) + { } +#endif + + ~set() = default; #endif explicit set(const _Compare& __comp, @@ -604,6 +623,17 @@ namespace __debug set(initializer_list<_Key>, _Allocator) -> set<_Key, less<_Key>, _Allocator>; +#if __glibcxx_ranges_to_container // C++ >= 23 + template>, + __allocator_like _Alloc = std::allocator>> + set(from_range_t, _Rg&&, _Compare = _Compare(), _Alloc = _Alloc()) + -> set, _Compare, _Alloc>; + + template + set(from_range_t, _Rg&&, _Alloc) + -> set, less>, _Alloc>; +#endif #endif // deduction guides template