abseil-cpp/absl/container/internal/raw_hash_map.h
Go to the documentation of this file.
1 // Copyright 2018 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef ABSL_CONTAINER_INTERNAL_RAW_HASH_MAP_H_
16 #define ABSL_CONTAINER_INTERNAL_RAW_HASH_MAP_H_
17 
18 #include <tuple>
19 #include <type_traits>
20 #include <utility>
21 
22 #include "absl/base/internal/throw_delegate.h"
23 #include "absl/container/internal/container_memory.h"
24 #include "absl/container/internal/raw_hash_set.h" // IWYU pragma: export
25 
26 namespace absl {
28 namespace container_internal {
29 
30 template <class Policy, class Hash, class Eq, class Alloc>
31 class raw_hash_map : public raw_hash_set<Policy, Hash, Eq, Alloc> {
32  // P is Policy. It's passed as a template argument to support maps that have
33  // incomplete types as values, as in unordered_map<K, IncompleteType>.
34  // MappedReference<> may be a non-reference type.
35  template <class P>
36  using MappedReference = decltype(P::value(
37  std::addressof(std::declval<typename raw_hash_map::reference>())));
38 
39  // MappedConstReference<> may be a non-reference type.
40  template <class P>
41  using MappedConstReference = decltype(P::value(
42  std::addressof(std::declval<typename raw_hash_map::const_reference>())));
43 
44  using KeyArgImpl =
46 
47  public:
48  using key_type = typename Policy::key_type;
49  using mapped_type = typename Policy::mapped_type;
50  template <class K>
51  using key_arg = typename KeyArgImpl::template type<K, key_type>;
52 
53  static_assert(!std::is_reference<key_type>::value, "");
54 
55  // TODO(b/187807849): Evaluate whether to support reference mapped_type and
56  // remove this assertion if/when it is supported.
57  static_assert(!std::is_reference<mapped_type>::value, "");
58 
60  using const_iterator = typename raw_hash_map::raw_hash_set::const_iterator;
61 
63  using raw_hash_map::raw_hash_set::raw_hash_set;
64 
65  // The last two template parameters ensure that both arguments are rvalues
66  // (lvalue arguments are handled by the overloads below). This is necessary
67  // for supporting bitfield arguments.
68  //
69  // union { int n : 1; };
70  // flat_hash_map<int, int> m;
71  // m.insert_or_assign(n, n);
72  template <class K = key_type, class V = mapped_type, K* = nullptr,
73  V* = nullptr>
74  std::pair<iterator, bool> insert_or_assign(key_arg<K>&& k, V&& v) {
75  return insert_or_assign_impl(std::forward<K>(k), std::forward<V>(v));
76  }
77 
78  template <class K = key_type, class V = mapped_type, K* = nullptr>
79  std::pair<iterator, bool> insert_or_assign(key_arg<K>&& k, const V& v) {
80  return insert_or_assign_impl(std::forward<K>(k), v);
81  }
82 
83  template <class K = key_type, class V = mapped_type, V* = nullptr>
84  std::pair<iterator, bool> insert_or_assign(const key_arg<K>& k, V&& v) {
85  return insert_or_assign_impl(k, std::forward<V>(v));
86  }
87 
88  template <class K = key_type, class V = mapped_type>
89  std::pair<iterator, bool> insert_or_assign(const key_arg<K>& k, const V& v) {
90  return insert_or_assign_impl(k, v);
91  }
92 
93  template <class K = key_type, class V = mapped_type, K* = nullptr,
94  V* = nullptr>
96  return insert_or_assign(std::forward<K>(k), std::forward<V>(v)).first;
97  }
98 
99  template <class K = key_type, class V = mapped_type, K* = nullptr>
101  return insert_or_assign(std::forward<K>(k), v).first;
102  }
103 
104  template <class K = key_type, class V = mapped_type, V* = nullptr>
106  return insert_or_assign(k, std::forward<V>(v)).first;
107  }
108 
109  template <class K = key_type, class V = mapped_type>
111  return insert_or_assign(k, v).first;
112  }
113 
114  // All `try_emplace()` overloads make the same guarantees regarding rvalue
115  // arguments as `std::unordered_map::try_emplace()`, namely that these
116  // functions will not move from rvalue arguments if insertions do not happen.
117  template <class K = key_type, class... Args,
118  typename std::enable_if<
120  K* = nullptr>
121  std::pair<iterator, bool> try_emplace(key_arg<K>&& k, Args&&... args) {
122  return try_emplace_impl(std::forward<K>(k), std::forward<Args>(args)...);
123  }
124 
125  template <class K = key_type, class... Args,
126  typename std::enable_if<
128  std::pair<iterator, bool> try_emplace(const key_arg<K>& k, Args&&... args) {
129  return try_emplace_impl(k, std::forward<Args>(args)...);
130  }
131 
132  template <class K = key_type, class... Args, K* = nullptr>
134  return try_emplace(std::forward<K>(k), std::forward<Args>(args)...).first;
135  }
136 
137  template <class K = key_type, class... Args>
139  return try_emplace(k, std::forward<Args>(args)...).first;
140  }
141 
142  template <class K = key_type, class P = Policy>
144  auto it = this->find(key);
145  if (it == this->end()) {
147  "absl::container_internal::raw_hash_map<>::at");
148  }
149  return Policy::value(&*it);
150  }
151 
152  template <class K = key_type, class P = Policy>
154  auto it = this->find(key);
155  if (it == this->end()) {
157  "absl::container_internal::raw_hash_map<>::at");
158  }
159  return Policy::value(&*it);
160  }
161 
162  template <class K = key_type, class P = Policy, K* = nullptr>
164  return Policy::value(&*try_emplace(std::forward<K>(key)).first);
165  }
166 
167  template <class K = key_type, class P = Policy>
169  return Policy::value(&*try_emplace(key).first);
170  }
171 
172  private:
173  template <class K, class V>
174  std::pair<iterator, bool> insert_or_assign_impl(K&& k, V&& v) {
175  auto res = this->find_or_prepare_insert(k);
176  if (res.second)
177  this->emplace_at(res.first, std::forward<K>(k), std::forward<V>(v));
178  else
179  Policy::value(&*this->iterator_at(res.first)) = std::forward<V>(v);
180  return {this->iterator_at(res.first), res.second};
181  }
182 
183  template <class K = key_type, class... Args>
184  std::pair<iterator, bool> try_emplace_impl(K&& k, Args&&... args) {
185  auto res = this->find_or_prepare_insert(k);
186  if (res.second)
187  this->emplace_at(res.first, std::piecewise_construct,
188  std::forward_as_tuple(std::forward<K>(k)),
189  std::forward_as_tuple(std::forward<Args>(args)...));
190  return {this->iterator_at(res.first), res.second};
191  }
192 };
193 
194 } // namespace container_internal
196 } // namespace absl
197 
198 #endif // ABSL_CONTAINER_INTERNAL_RAW_HASH_MAP_H_
regen-readme.it
it
Definition: regen-readme.py:15
absl::container_internal::raw_hash_map::at
MappedReference< P > at(const key_arg< K > &key)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:143
absl::container_internal::raw_hash_set::iterator_at
iterator iterator_at(size_t i)
Definition: abseil-cpp/absl/container/internal/raw_hash_set.h:2220
absl::container_internal::raw_hash_map::operator[]
MappedReference< P > operator[](const key_arg< K > &key)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:168
absl::container_internal::raw_hash_map::raw_hash_map
raw_hash_map()
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:62
absl::container_internal::raw_hash_set::find
iterator find(const key_arg< K > &key, size_t hash)
Definition: abseil-cpp/absl/container/internal/raw_hash_set.h:1739
absl::container_internal::raw_hash_set::find_or_prepare_insert
std::pair< size_t, bool > find_or_prepare_insert(const K &key)
Definition: abseil-cpp/absl/container/internal/raw_hash_set.h:2164
absl::container_internal::raw_hash_map::at
MappedConstReference< P > at(const key_arg< K > &key) const
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:153
absl::container_internal::raw_hash_map::try_emplace
std::pair< iterator, bool > try_emplace(const key_arg< K > &k, Args &&... args)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:128
absl::container_internal::raw_hash_map::const_iterator
typename raw_hash_map::raw_hash_set::const_iterator const_iterator
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:60
ABSL_NAMESPACE_END
#define ABSL_NAMESPACE_END
Definition: third_party/abseil-cpp/absl/base/config.h:171
iterator
const typedef MCPhysReg * iterator
Definition: MCRegisterInfo.h:27
setup.k
k
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
absl::container_internal::raw_hash_map::try_emplace
iterator try_emplace(const_iterator, key_arg< K > &&k, Args &&... args)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:133
absl::container_internal::raw_hash_map::insert_or_assign
iterator insert_or_assign(const_iterator, const key_arg< K > &k, V &&v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:105
absl::base_internal::ThrowStdOutOfRange
void ThrowStdOutOfRange(const std::string &what_arg)
Definition: abseil-cpp/absl/base/internal/throw_delegate.cc:109
absl::container_internal::raw_hash_set::end
iterator end()
Definition: abseil-cpp/absl/container/internal/raw_hash_set.h:1332
ABSL_NAMESPACE_BEGIN
#define ABSL_NAMESPACE_BEGIN
Definition: third_party/abseil-cpp/absl/base/config.h:170
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
hpack_encoder_fixtures::Args
Args({0, 16384})
absl::container_internal::raw_hash_map::try_emplace_impl
std::pair< iterator, bool > try_emplace_impl(K &&k, Args &&... args)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:184
absl::container_internal::IsTransparent
Definition: abseil-cpp/absl/container/internal/common.h:29
absl::container_internal::raw_hash_map::insert_or_assign_impl
std::pair< iterator, bool > insert_or_assign_impl(K &&k, V &&v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:174
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
absl::container_internal::raw_hash_map::try_emplace
std::pair< iterator, bool > try_emplace(key_arg< K > &&k, Args &&... args)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:121
absl::container_internal::raw_hash_map::insert_or_assign
iterator insert_or_assign(const_iterator, key_arg< K > &&k, const V &v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:100
absl::container_internal::raw_hash_map
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:31
absl::container_internal::raw_hash_map::MappedConstReference
decltype(P::value(std::addressof(std::declval< typename raw_hash_map::const_reference >()))) MappedConstReference
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:42
absl::container_internal::raw_hash_map::key_type
typename Policy::key_type key_type
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:48
absl::container_internal::raw_hash_map::insert_or_assign
iterator insert_or_assign(const_iterator, key_arg< K > &&k, V &&v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:95
absl::container_internal::raw_hash_map::try_emplace
iterator try_emplace(const_iterator, const key_arg< K > &k, Args &&... args)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:138
absl::container_internal::raw_hash_map::MappedReference
decltype(P::value(std::addressof(std::declval< typename raw_hash_map::reference >()))) MappedReference
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:37
value
const char * value
Definition: hpack_parser_table.cc:165
absl::container_internal::KeyArg
Definition: abseil-cpp/absl/container/internal/common.h:35
absl::container_internal::raw_hash_map::insert_or_assign
std::pair< iterator, bool > insert_or_assign(key_arg< K > &&k, const V &v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:79
key
const char * key
Definition: hpack_parser_table.cc:164
absl::container_internal::raw_hash_map::insert_or_assign
std::pair< iterator, bool > insert_or_assign(key_arg< K > &&k, V &&v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:74
first
StrT first
Definition: cxa_demangle.cpp:4884
absl::container_internal::raw_hash_map::operator[]
MappedReference< P > operator[](key_arg< K > &&key)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:163
absl::container_internal::raw_hash_map::mapped_type
typename Policy::mapped_type mapped_type
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:49
absl::container_internal::raw_hash_map::insert_or_assign
iterator insert_or_assign(const_iterator, const key_arg< K > &k, const V &v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:110
absl::container_internal::raw_hash_map::iterator
typename raw_hash_map::raw_hash_set::iterator iterator
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:59
absl::container_internal::raw_hash_set
Definition: abseil-cpp/absl/container/internal/raw_hash_set.h:726
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
setup.template
template
Definition: setup.py:47
absl::container_internal::raw_hash_map::insert_or_assign
std::pair< iterator, bool > insert_or_assign(const key_arg< K > &k, V &&v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:84
key_type
upb_fieldtype_t key_type
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1071
absl::container_internal::raw_hash_set::emplace_at
void emplace_at(size_t i, Args &&... args)
Definition: abseil-cpp/absl/container/internal/raw_hash_set.h:2211
absl::container_internal::raw_hash_map::key_arg
typename KeyArgImpl::template type< K, key_type > key_arg
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:51
absl::container_internal::raw_hash_map::insert_or_assign
std::pair< iterator, bool > insert_or_assign(const key_arg< K > &k, const V &v)
Definition: abseil-cpp/absl/container/internal/raw_hash_map.h:89


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:51