diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2025-03-19 22:22:56 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2025-03-20 09:59:41 +0000 |
commit | f3253bd7bd49e54fe56cfb7e41fed4d8183803de (patch) | |
tree | fb0fbf1ddd1643e30e3ddeccd82af85e162c36f4 /libstdc++-v3 | |
parent | d458020e19b686e0d46320e7d26fa876c19965a0 (diff) | |
download | gcc-f3253bd7bd49e54fe56cfb7e41fed4d8183803de.zip gcc-f3253bd7bd49e54fe56cfb7e41fed4d8183803de.tar.gz gcc-f3253bd7bd49e54fe56cfb7e41fed4d8183803de.tar.bz2 |
libstdc++: Add from_range_t constructors to debug ordered containers
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 <tkaminsk@redhat.com>
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/include/debug/map.h | 36 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/multimap.h | 36 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/multiset.h | 30 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/set.h | 32 |
4 files changed, 133 insertions, 1 deletions
diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index a9fac79..aa1c1db 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<std::__detail::__container_compatible_range<value_type> _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<std::__detail::__container_compatible_range<value_type> _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<pair<_Key, _Tp>>, _Allocator) -> map<_Key, _Tp, less<_Key>, _Allocator>; +#if __glibcxx_ranges_to_container // C++ >= 23 + template<ranges::input_range _Rg, + __not_allocator_like _Compare = less<__detail::__range_key_type<_Rg>>, + __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<ranges::input_range _Rg, __allocator_like _Alloc> + 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<typename _Key, typename _Tp, diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h index 8feca2c..bef1f17 100644 --- a/libstdc++-v3/include/debug/multimap.h +++ b/libstdc++-v3/include/debug/multimap.h @@ -133,6 +133,25 @@ namespace __debug __glibcxx_check_valid_constructor_range(__first, __last)), __gnu_debug::__base(__last), __a) { } +#if __glibcxx_ranges_to_container // C++ >= 23 + /** + * @brief Construct a multimap from a range. + * @since C++23 + */ + template<std::__detail::__container_compatible_range<value_type> _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<std::__detail::__container_compatible_range<value_type> _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<pair<_Key, _Tp>>, _Allocator) -> multimap<_Key, _Tp, less<_Key>, _Allocator>; +#if __glibcxx_ranges_to_container // C++ >= 23 + template<ranges::input_range _Rg, + __not_allocator_like _Compare = less<__detail::__range_key_type<_Rg>>, + __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<ranges::input_range _Rg, __allocator_like _Alloc> + 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<typename _Key, typename _Tp, diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index 09db81f..bddcd28 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -133,6 +133,25 @@ namespace __debug __glibcxx_check_valid_constructor_range(__first, __last)), __gnu_debug::__base(__last), __a) { } +#if __glibcxx_ranges_to_container // C++ >= 23 + /** + * @brief Construct a multiset from a range. + * @since C++23 + */ + template<std::__detail::__container_compatible_range<value_type> _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<std::__detail::__container_compatible_range<value_type> _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<ranges::input_range _Rg, + __not_allocator_like _Compare = less<ranges::range_value_t<_Rg>>, + __allocator_like _Alloc = std::allocator<ranges::range_value_t<_Rg>>> + multiset(from_range_t, _Rg&&, _Compare = _Compare(), _Alloc = _Alloc()) + -> multiset<ranges::range_value_t<_Rg>, _Compare, _Alloc>; + + template<ranges::input_range _Rg, __allocator_like _Alloc> + multiset(from_range_t, _Rg&&, _Alloc) + -> multiset<ranges::range_value_t<_Rg>, less<ranges::range_value_t<_Rg>>, _Alloc>; +#endif #endif // deduction guides template<typename _Key, typename _Compare, typename _Allocator> diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index 5f6cf12..9555555 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<std::__detail::__container_compatible_range<_Key> _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<std::__detail::__container_compatible_range<_Key> _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<ranges::input_range _Rg, + __not_allocator_like _Compare = less<ranges::range_value_t<_Rg>>, + __allocator_like _Alloc = std::allocator<ranges::range_value_t<_Rg>>> + set(from_range_t, _Rg&&, _Compare = _Compare(), _Alloc = _Alloc()) + -> set<ranges::range_value_t<_Rg>, _Compare, _Alloc>; + + template<ranges::input_range _Rg, __allocator_like _Alloc> + set(from_range_t, _Rg&&, _Alloc) + -> set<ranges::range_value_t<_Rg>, less<ranges::range_value_t<_Rg>>, _Alloc>; +#endif #endif // deduction guides template<typename _Key, typename _Compare, typename _Allocator> |