bloaty/third_party/abseil-cpp/absl/container/internal/common.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_CONTAINER_H_
16 #define ABSL_CONTAINER_INTERNAL_CONTAINER_H_
17 
18 #include <cassert>
19 #include <type_traits>
20 
21 #include "absl/meta/type_traits.h"
22 #include "absl/types/optional.h"
23 
24 namespace absl {
26 namespace container_internal {
27 
28 template <class, class = void>
29 struct IsTransparent : std::false_type {};
30 template <class T>
31 struct IsTransparent<T, absl::void_t<typename T::is_transparent>>
32  : std::true_type {};
33 
34 template <bool is_transparent>
35 struct KeyArg {
36  // Transparent. Forward `K`.
37  template <typename K, typename key_type>
38  using type = K;
39 };
40 
41 template <>
42 struct KeyArg<false> {
43  // Not transparent. Always use `key_type`.
44  template <typename K, typename key_type>
45  using type = key_type;
46 };
47 
48 // The node_handle concept from C++17.
49 // We specialize node_handle for sets and maps. node_handle_base holds the
50 // common API of both.
51 template <typename PolicyTraits, typename Alloc>
52 class node_handle_base {
53  protected:
54  using slot_type = typename PolicyTraits::slot_type;
55 
56  public:
58 
59  constexpr node_handle_base() = default;
60  node_handle_base(node_handle_base&& other) noexcept {
61  *this = std::move(other);
62  }
65  destroy();
66  if (!other.empty()) {
67  alloc_ = other.alloc_;
68  PolicyTraits::transfer(alloc(), slot(), other.slot());
69  other.reset();
70  }
71  return *this;
72  }
73 
74  bool empty() const noexcept { return !alloc_; }
75  explicit operator bool() const noexcept { return !empty(); }
76  allocator_type get_allocator() const { return *alloc_; }
77 
78  protected:
79  friend struct CommonAccess;
80 
81  struct transfer_tag_t {};
83  : alloc_(a) {
85  }
86 
87  struct move_tag_t {};
89  : alloc_(a) {
91  }
92 
93  void destroy() {
94  if (!empty()) {
96  reset();
97  }
98  }
99 
100  void reset() {
101  assert(alloc_.has_value());
102  alloc_ = absl::nullopt;
103  }
104 
105  slot_type* slot() const {
106  assert(!empty());
107  return reinterpret_cast<slot_type*>(std::addressof(slot_space_));
108  }
109  allocator_type* alloc() { return std::addressof(*alloc_); }
110 
111  private:
113  alignas(slot_type) mutable unsigned char slot_space_[sizeof(slot_type)] = {};
114 };
115 
116 // For sets.
117 template <typename Policy, typename PolicyTraits, typename Alloc,
118  typename = void>
119 class node_handle : public node_handle_base<PolicyTraits, Alloc> {
121 
122  public:
124 
125  constexpr node_handle() {}
126 
127  value_type& value() const { return PolicyTraits::element(this->slot()); }
128 
129  private:
130  friend struct CommonAccess;
131 
132  using Base::Base;
133 };
134 
135 // For maps.
136 template <typename Policy, typename PolicyTraits, typename Alloc>
137 class node_handle<Policy, PolicyTraits, Alloc,
138  absl::void_t<typename Policy::mapped_type>>
139  : public node_handle_base<PolicyTraits, Alloc> {
141  using slot_type = typename PolicyTraits::slot_type;
142 
143  public:
144  using key_type = typename Policy::key_type;
145  using mapped_type = typename Policy::mapped_type;
146 
147  constexpr node_handle() {}
148 
149  // When C++17 is available, we can use std::launder to provide mutable
150  // access to the key. Otherwise, we provide const access.
151  auto key() const
152  -> decltype(PolicyTraits::mutable_key(std::declval<slot_type*>())) {
153  return PolicyTraits::mutable_key(this->slot());
154  }
155 
156  mapped_type& mapped() const {
158  }
159 
160  private:
161  friend struct CommonAccess;
162 
163  using Base::Base;
164 };
165 
166 // Provide access to non-public node-handle functions.
167 struct CommonAccess {
168  template <typename Node>
169  static auto GetSlot(const Node& node) -> decltype(node.slot()) {
170  return node.slot();
171  }
172 
173  template <typename Node>
174  static void Destroy(Node* node) {
175  node->destroy();
176  }
177 
178  template <typename Node>
179  static void Reset(Node* node) {
180  node->reset();
181  }
182 
183  template <typename T, typename... Args>
184  static T Transfer(Args&&... args) {
185  return T(typename T::transfer_tag_t{}, std::forward<Args>(args)...);
186  }
187 
188  template <typename T, typename... Args>
189  static T Move(Args&&... args) {
190  return T(typename T::move_tag_t{}, std::forward<Args>(args)...);
191  }
192 };
193 
194 // Implement the insert_return_type<> concept of C++17.
195 template <class Iterator, class NodeType>
196 struct InsertReturnType {
198  bool inserted;
199  NodeType node;
200 };
201 
202 } // namespace container_internal
204 } // namespace absl
205 
206 #endif // ABSL_CONTAINER_INTERNAL_CONTAINER_H_
absl::container_internal::node_handle_base::get_allocator
allocator_type get_allocator() const
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:76
absl::container_internal::node_handle_base::alloc
allocator_type * alloc()
Definition: abseil-cpp/absl/container/internal/common.h:110
element
static std::function< Slot &(Slot *)> element
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:44
opencensus.proto.agent.common.v1.common_pb2.Node
Node
Definition: common_pb2.py:308
const
#define const
Definition: bloaty/third_party/zlib/zconf.h:230
bool
bool
Definition: setup_once.h:312
absl::container_internal::node_handle_base::destroy
void destroy()
Definition: abseil-cpp/absl/container/internal/common.h:94
absl::container_internal::KeyArg< false >::type
key_type type
Definition: abseil-cpp/absl/container/internal/common.h:45
absl::container_internal::node_handle_base::node_handle_base
node_handle_base(move_tag_t, const allocator_type &a, slot_type *s)
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:88
false
#define false
Definition: setup_once.h:323
absl::container_internal::CommonAccess::Destroy
static void Destroy(Node *node)
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:174
google::protobuf.internal::true_type
integral_constant< bool, true > true_type
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/template_util.h:89
google::protobuf.internal::false_type
integral_constant< bool, false > false_type
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/template_util.h:90
absl::container_internal::node_handle_base
Definition: abseil-cpp/absl/container/internal/common.h:52
absl::container_internal::node_handle_base::node_handle_base
node_handle_base(node_handle_base &&other) noexcept
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:60
absl::FormatConversionChar::s
@ s
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
ABSL_NAMESPACE_END
#define ABSL_NAMESPACE_END
Definition: third_party/abseil-cpp/absl/base/config.h:171
absl::container_internal::node_handle< Policy, PolicyTraits, Alloc, absl::void_t< typename Policy::mapped_type > >::key_type
typename Policy::key_type key_type
Definition: abseil-cpp/absl/container/internal/common.h:145
absl::container_internal::InsertReturnType::position
Iterator position
Definition: abseil-cpp/absl/container/internal/common.h:198
T
#define T(upbtypeconst, upbtype, ctype, default_value)
absl::container_internal::CommonAccess::GetSlot
static auto GetSlot(const Node &node) -> decltype(node.slot())
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:169
absl::container_internal::CommonAccess::Move
static T Move(Args &&... args)
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:189
absl::container_internal::node_handle< Policy, PolicyTraits, Alloc, absl::void_t< typename Policy::mapped_type > >::key
auto key() const -> decltype(PolicyTraits::mutable_key(std::declval< slot_type * >()))
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:151
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
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
hpack_encoder_fixtures::Args
Args({0, 16384})
absl::container_internal::KeyArg::type
K type
Definition: abseil-cpp/absl/container/internal/common.h:38
absl::container_internal::node_handle_base::reset
void reset()
Definition: abseil-cpp/absl/container/internal/common.h:101
absl::container_internal::node_handle_base::node_handle_base
node_handle_base(transfer_tag_t, const allocator_type &a, slot_type *s)
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:82
absl::container_internal::CommonAccess::Transfer
static T Transfer(Args &&... args)
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:184
absl::container_internal::node_handle_base::alloc_
absl::optional< allocator_type > alloc_
Definition: abseil-cpp/absl/container/internal/common.h:113
absl::optional
Definition: abseil-cpp/absl/types/internal/optional.h:61
absl::container_internal::node_handle_base::move_tag_t
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:87
absl::compare_internal::value_type
int8_t value_type
Definition: abseil-cpp/absl/types/compare.h:45
absl::container_internal::node_handle< Policy, PolicyTraits, Alloc, absl::void_t< typename Policy::mapped_type > >::mapped
mapped_type & mapped() const
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:156
absl::container_internal::node_handle< Policy, PolicyTraits, Alloc, absl::void_t< typename Policy::mapped_type > >::mapped_type
typename Policy::mapped_type mapped_type
Definition: abseil-cpp/absl/container/internal/common.h:146
absl::flags_internal::Alloc
void * Alloc(FlagOpFn op)
Definition: abseil-cpp/absl/flags/internal/flag.h:102
absl::container_internal::node_handle< Policy, PolicyTraits, Alloc, absl::void_t< typename Policy::mapped_type > >::node_handle
constexpr node_handle()
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:147
transfer
static std::function< void(void *, Slot *, Slot *)> transfer
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:58
value
const char * value
Definition: hpack_parser_table.cc:165
absl::container_internal::node_handle_base::slot_space_
unsigned char slot_space_[sizeof(slot_type)]
Definition: abseil-cpp/absl/container/internal/common.h:114
absl::void_t
typename type_traits_internal::VoidTImpl< Ts... >::type void_t
Definition: abseil-cpp/absl/meta/type_traits.h:218
absl::container_internal::KeyArg
Definition: abseil-cpp/absl/container/internal/common.h:35
construct
static std::function< void(void *, Slot *, Slot)> construct
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:41
absl::container_internal::CommonAccess::Reset
static void Reset(Node *node)
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:179
absl::container_internal::node_handle_base::slot_type
typename PolicyTraits::slot_type slot_type
Definition: abseil-cpp/absl/container/internal/common.h:54
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
absl::container_internal::node_handle_base::transfer_tag_t
Definition: abseil-cpp/absl/container/internal/common.h:81
absl::container_internal::node_handle_base::operator=
node_handle_base & operator=(node_handle_base &&other) noexcept
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:64
absl::container_internal::node_handle::value
value_type & value() const
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:127
absl::inlined_vector_internal::Iterator
Pointer< A > Iterator
Definition: abseil-cpp/absl/container/internal/inlined_vector.h:64
absl::container_internal::node_handle_base::empty
bool empty() const noexcept
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:74
absl::container_internal::Alloc
Definition: abseil-cpp/absl/container/internal/hash_policy_testing.h:118
absl::container_internal::InsertReturnType::inserted
bool inserted
Definition: abseil-cpp/absl/container/internal/common.h:199
absl::container_internal::node_handle_base::~node_handle_base
~node_handle_base()
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:63
absl::container_internal::node_handle_base::node_handle_base
constexpr node_handle_base()=default
absl::container_internal::CommonAccess
Definition: abseil-cpp/absl/container/internal/common.h:168
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
absl::container_internal::node_handle_base::slot
slot_type * slot() const
Definition: abseil-cpp/absl/container/internal/common.h:106
key_type
upb_fieldtype_t key_type
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1071
absl::container_internal::InsertReturnType::node
NodeType node
Definition: abseil-cpp/absl/container/internal/common.h:200
absl::container_internal::node_handle::value_type
typename PolicyTraits::value_type value_type
Definition: abseil-cpp/absl/container/internal/common.h:124
absl::container_internal::node_handle::node_handle
constexpr node_handle()
Definition: bloaty/third_party/abseil-cpp/absl/container/internal/common.h:125
destroy
static std::function< void(void *, Slot *)> destroy
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:42


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