mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 23:25:24 +02:00
Implements P2353R5 "Extending associative containers with the
remaining heterogeneous overloads". Adds overloads templated on
heterogeneous key types for several members of associative
containers, particularly insertions:
/-- unordered --\
set map mset mmap set map mset mmap
@ . . . @ . . . insert
. @ . . . @ . . op[], at, try_emplace,
insert_or_assign
. . . . @ @ @ @ bucket
(Nothing is added to the multiset or multimap tree containers.)
All the insert*() and try_emplace() members also get a hinted
overload. The at() members get const and non-const overloads.
The new overloads enforce concept __heterogeneous_tree_key or
__heterogeneous_hash_key, as in P2077, to enforce that the
function objects provided meet requirements, and that the key
supplied is not an iterator or the native key. Insertions
implicitly construct the required key_type object from the
argument, by move where permitted.
libstdc++-v3/ChangeLog:
PR libstdc++/117402
* include/bits/stl_map.h (operator[], at (2x), try_emplace (2x),
insert_or_assign (2x)): Add overloads.
* include/bits/unordered_map.h (operator[], at (2x),
try_emplace (2x), insert_or_assign (2x), bucket (2x)): Add overloads.
* include/bits/stl_set.h (insert (2x)): Add overloads.
* include/bits/unordered_set.h (insert (2x), bucket (2x)): Add overloads.
* include/bits/hashtable.h (_M_bucket_tr, _M_insert_tr): Define.
* include/bits/hashtable_policy.h (_M_at_tr (2x)): Define.
* include/bits/stl_tree.h (_M_emplace_here, _M_get_insert_unique_pos_tr,
_M_get_insert_hint_unique_pos_tr): Define new heterogeneous insertion
code path for set and map.
* include/bits/version.def (associative_heterogeneous_insertion):
Define.
* include/bits/version.h: Regenerate.
* include/std/map (__glibcxx_want_associative_heterogeneous_insertion):
Define macro.
* include/std/set: Same.
* include/std/unordered_map: Same.
* include/std/unordered_set: Same.
* testsuite/23_containers/map/modifiers/hetero/insert.cc: New tests.
* testsuite/23_containers/set/modifiers/hetero/insert.cc: Same.
* testsuite/23_containers/unordered_map/modifiers/hetero/insert.cc:
Same.
* testsuite/23_containers/unordered_multimap/modifiers/hetero/insert.cc:
Same.
* testsuite/23_containers/unordered_multiset/modifiers/hetero/insert.cc:
Same.
* testsuite/23_containers/unordered_set/modifiers/hetero/insert.cc:
Same.
129 lines
4.5 KiB
C++
129 lines
4.5 KiB
C++
// <map> -*- C++ -*-
|
|
|
|
// Copyright (C) 2001-2026 Free Software Foundation, Inc.
|
|
//
|
|
// This file is part of the GNU ISO C++ Library. This library is free
|
|
// software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 3, or (at your option)
|
|
// any later version.
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
/*
|
|
*
|
|
* Copyright (c) 1994
|
|
* Hewlett-Packard Company
|
|
*
|
|
* Permission to use, copy, modify, distribute and sell this software
|
|
* and its documentation for any purpose is hereby granted without fee,
|
|
* provided that the above copyright notice appear in all copies and
|
|
* that both that copyright notice and this permission notice appear
|
|
* in supporting documentation. Hewlett-Packard Company makes no
|
|
* representations about the suitability of this software for any
|
|
* purpose. It is provided "as is" without express or implied warranty.
|
|
*
|
|
*
|
|
* Copyright (c) 1996,1997
|
|
* Silicon Graphics Computer Systems, Inc.
|
|
*
|
|
* Permission to use, copy, modify, distribute and sell this software
|
|
* and its documentation for any purpose is hereby granted without fee,
|
|
* provided that the above copyright notice appear in all copies and
|
|
* that both that copyright notice and this permission notice appear
|
|
* in supporting documentation. Silicon Graphics makes no
|
|
* representations about the suitability of this software for any
|
|
* purpose. It is provided "as is" without express or implied warranty.
|
|
*/
|
|
|
|
/** @file include/map
|
|
* This is a Standard C++ Library header.
|
|
*/
|
|
|
|
#ifndef _GLIBCXX_MAP
|
|
#define _GLIBCXX_MAP 1
|
|
|
|
#ifdef _GLIBCXX_SYSHDR
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
#include <bits/requires_hosted.h> // containers
|
|
|
|
#include <bits/stl_tree.h>
|
|
#include <bits/stl_map.h>
|
|
#include <bits/stl_multimap.h>
|
|
#include <bits/range_access.h>
|
|
#include <bits/erase_if.h>
|
|
|
|
#ifdef _GLIBCXX_DEBUG
|
|
# include <debug/map>
|
|
#endif
|
|
|
|
#define __glibcxx_want_allocator_traits_is_always_equal
|
|
#define __glibcxx_want_containers_ranges
|
|
#define __glibcxx_want_erase_if
|
|
#define __glibcxx_want_generic_associative_lookup
|
|
#define __glibcxx_want_map_try_emplace
|
|
#define __glibcxx_want_node_extract
|
|
#define __glibcxx_want_nonmember_container_access
|
|
#define __glibcxx_want_tuple_like
|
|
#define __glibcxx_want_associative_heterogeneous_erasure
|
|
#define __glibcxx_want_associative_heterogeneous_insertion
|
|
#include <bits/version.h>
|
|
|
|
#if __cplusplus >= 201703L
|
|
#include <bits/memory_resource.h>
|
|
namespace std _GLIBCXX_VISIBILITY(default)
|
|
{
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
namespace pmr
|
|
{
|
|
template<typename _Key, typename _Tp, typename _Cmp = std::less<_Key>>
|
|
using map
|
|
= std::map<_Key, _Tp, _Cmp,
|
|
polymorphic_allocator<pair<const _Key, _Tp>>>;
|
|
template<typename _Key, typename _Tp, typename _Cmp = std::less<_Key>>
|
|
using multimap
|
|
= std::multimap<_Key, _Tp, _Cmp,
|
|
polymorphic_allocator<pair<const _Key, _Tp>>>;
|
|
} // namespace pmr
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
} // namespace std
|
|
#endif // C++17
|
|
|
|
#ifdef __cpp_lib_erase_if // C++ >= 20 && HOSTED
|
|
namespace std _GLIBCXX_VISIBILITY(default)
|
|
{
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
template<typename _Key, typename _Tp, typename _Compare, typename _Alloc,
|
|
typename _Predicate>
|
|
inline typename _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Alloc>::size_type
|
|
erase_if(_GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Alloc>& __cont,
|
|
_Predicate __pred)
|
|
{ return __detail::__erase_nodes_if(__cont, __cont, __pred); }
|
|
|
|
template<typename _Key, typename _Tp, typename _Compare, typename _Alloc,
|
|
typename _Predicate>
|
|
inline typename _GLIBCXX_STD_C::multimap<_Key, _Tp,
|
|
_Compare, _Alloc>::size_type
|
|
erase_if(_GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Alloc>& __cont,
|
|
_Predicate __pred)
|
|
{ return __detail::__erase_nodes_if(__cont, __cont, __pred); }
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
} // namespace std
|
|
#endif // __cpp_lib_erase_if
|
|
|
|
#endif /* _GLIBCXX_MAP */
|