Go to the documentation of this file.
37 #ifndef GOOGLE_PROTOBUF_MAP_H__
38 #define GOOGLE_PROTOBUF_MAP_H__
41 #include <initializer_list>
46 #include <type_traits>
49 #if defined(__cpp_lib_string_view)
50 #include <string_view>
51 #endif // defined(__cpp_lib_string_view)
53 #if !defined(GOOGLE_PROTOBUF_NO_RDTSC) && defined(__APPLE__)
54 #include <mach/mach_time.h>
57 #include <google/protobuf/stubs/common.h>
58 #include <google/protobuf/arena.h>
59 #include <google/protobuf/generated_enum_util.h>
60 #include <google/protobuf/map_type_handler.h>
61 #include <google/protobuf/stubs/hash.h>
64 #error "You cannot SWIG proto headers"
67 #include <google/protobuf/port_def.inc>
72 template <
typename Key,
typename T>
77 template <
typename Enum>
81 template <
typename Derived,
typename Key,
typename T,
86 template <
typename Derived,
typename Key,
typename T,
91 template <
typename Key,
typename T>
92 class TypeDefinedMapFieldBase;
94 class DynamicMapField;
96 class GeneratedMessageReflection;
101 template <
typename U>
114 template <
typename X>
124 return reinterpret_cast<pointer>(
131 #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
135 ::operator
delete(p);
140 #if !defined(GOOGLE_PROTOBUF_OS_APPLE) && !defined(GOOGLE_PROTOBUF_OS_NACL) && \
141 !defined(GOOGLE_PROTOBUF_OS_EMSCRIPTEN)
142 template <
class NodeType,
class...
Args>
148 new (
const_cast<void*
>(
static_cast<const void*
>(p)))
149 NodeType(std::forward<Args>(
args)...);
152 template <
class NodeType>
162 template <
typename X>
167 template <
typename X>
172 template <
typename X>
192 template <
typename T>
200 template <
typename key_type>
202 using hash = std::hash<key_type>;
203 using less = std::less<key_type>;
207 template <
typename K>
211 #if defined(__cpp_lib_string_view)
223 template <
typename =
void>
229 using is_transparent = void;
231 template <
typename T>
232 size_t operator()(
const T&
str)
const {
233 return base()(ImplicitConvert(
str));
237 const std::hash<std::string_view>&
base()
const {
return *
this; }
240 using is_transparent = void;
242 template <
typename T,
typename U>
243 bool operator()(
const T& t,
const U& u)
const {
244 return ImplicitConvert(t) < ImplicitConvert(u);
248 template <
typename T,
typename U>
249 static bool Equals(
const T& t,
const U& u) {
250 return ImplicitConvert(t) == ImplicitConvert(u);
253 template <
typename K>
256 #endif // defined(__cpp_lib_string_view)
258 template <
typename Key>
264 return table[
b] ==
nullptr;
281 template <
typename T,
282 typename = decltype(std::declval<const T&>().SpaceUsedLong())>
284 return message.SpaceUsedLong() -
sizeof(
T);
292 template <
typename Key>
295 size_t sizeof_node) {
298 size +=
sizeof(
void*) * num_buckets;
303 for (
size_t b = 0;
b < num_buckets;
b += 2) {
306 Tree* tree =
static_cast<Tree*
>(
table[
b]);
309 size += tree->size() *
316 template <
typename Map,
317 typename =
typename std::enable_if<
322 for (
const auto&
v : *
map) {
336 template <
typename Key,
typename T>
351 template <
typename T1,
typename T2>
352 operator std::pair<T1, T2>()
const {
374 template <
typename Key,
typename T>
395 if (other.arena() !=
nullptr) {
403 if (
this != &other) {
413 template <
class InputIt>
455 class InnerMap :
private hasher {
492 return static_cast<Node*
>(
it->second);
496 template <
typename KeyValueType>
497 class iterator_base {
518 template <
typename U>
556 return a.node_ ==
b.node_;
559 return a.node_ !=
b.node_;
571 if (++tree_it == tree->end()) {
603 while ((l = l->next) !=
nullptr) {
652 }
while (node !=
nullptr);
662 tree->erase(tree_it);
665 }
while (tree_it != tree->end());
677 return static_cast<size_type>(1) << (
sizeof(
void**) >= 8 ? 60 : 28);
682 template <
typename K>
687 template <
typename K>
694 template <
typename K>
696 std::pair<const_iterator, size_type> p =
FindHelper(
k);
698 if (p.first.node_ !=
nullptr)
699 return std::make_pair(
iterator(p.first),
false);
706 using TypeToInit =
typename std::conditional<
709 Node* node = Alloc<Node>(1);
713 Arena::CreateInArenaStorage(
const_cast<Key*
>(&node->kv.first),
715 static_cast<TypeToInit
>(std::forward<K>(
k)));
716 Arena::CreateInArenaStorage(&node->kv.second,
alloc_.
arena());
720 return std::make_pair(
result,
true);
723 template <
typename K>
725 return *
insert(std::forward<K>(
k)).first;
731 const bool is_list =
it.revalidate_if_necessary(&tree_it);
733 Node*
const item =
it.node_;
738 table_[
b] =
static_cast<void*
>(head);
742 tree->erase(tree_it);
746 b &= ~static_cast<size_type>(1);
770 template <
typename K>
771 std::pair<const_iterator, size_type>
FindHelper(
const K&
k)
const {
774 template <
typename K>
786 }
while (node !=
nullptr);
789 b &= ~static_cast<size_t>(1);
791 auto tree_it = tree->find(
k);
792 if (tree_it != tree->end()) {
793 if (
it !=
nullptr) *
it = tree_it;
797 return std::make_pair(
end(),
b);
855 node->next =
first->next;
861 table_[
b] =
static_cast<void*
>(node);
870 node->next =
nullptr;
873 this,
b & ~
static_cast<size_t>(1));
887 const size_type lo_cutoff = hi_cutoff / 4;
891 if (PROTOBUF_PREDICT_FALSE(
new_size >= hi_cutoff)) {
896 }
else if (PROTOBUF_PREDICT_FALSE(
new_size <= lo_cutoff &&
898 size_type lg2_of_size_reduction_factor = 1;
903 while ((hypothetical_size << lg2_of_size_reduction_factor) <
905 ++lg2_of_size_reduction_factor;
907 size_type new_num_buckets = std::max<size_type>(
929 void**
const old_table =
table_;
942 Dealloc<void*>(old_table, old_table_size);
951 }
while (node !=
nullptr);
960 }
while (++tree_it != tree->end());
989 Arena::Create<Tree>(
alloc_.
arena(),
typename Tree::key_compare(),
990 typename Tree::allocator_type(
alloc_));
1001 while (node !=
nullptr) {
1002 tree->insert({node->kv.first, node});
1005 node->next =
nullptr;
1020 }
while (node !=
nullptr);
1023 return count >= kMaxLength;
1026 template <
typename K>
1048 template <
typename U>
1051 return alloc_type(
alloc_).allocate(
n);
1055 template <
typename U>
1058 alloc_type(
alloc_).deallocate(t,
n);
1076 void**
result = Alloc<void*>(
n);
1087 #if !defined(GOOGLE_PROTOBUF_NO_RDTSC)
1088 #if defined(__APPLE__)
1091 s += mach_absolute_time();
1092 #elif defined(__x86_64__) && defined(__GNUC__)
1094 asm volatile(
"rdtsc" :
"=a"(lo),
"=d"(hi));
1095 s += ((
static_cast<uint64_t>(hi) << 32) | lo);
1096 #elif defined(__aarch64__) && defined(__GNUC__)
1101 asm volatile(
"mrs %0, cntvct_el0" :
"=r"(virtual_timer_value));
1102 s += virtual_timer_value;
1104 #endif // !defined(GOOGLE_PROTOBUF_NO_RDTSC)
1121 template <
typename LookupKey>
1127 class const_iterator {
1150 return a.it_ ==
b.it_;
1188 return a.it_ ==
b.it_;
1212 template <
typename K = key_type>
1224 template <
typename K = key_type>
1231 template <
typename K = key_type>
1239 template <
typename K = key_type>
1244 template <
typename K = key_type>
1248 template <
typename K = key_type>
1253 template <
typename K = key_type>
1258 template <
typename K = key_type>
1263 return std::pair<const_iterator, const_iterator>(
it,
it);
1266 return std::pair<const_iterator, const_iterator>(
begin,
it);
1270 template <
typename K = key_type>
1274 return std::pair<iterator, iterator>(
it,
it);
1277 return std::pair<iterator, iterator>(
begin,
it);
1283 std::pair<typename InnerMap::iterator, bool>
p =
1286 p.first->second =
value.second;
1288 return std::pair<iterator, bool>(
iterator(
p.first),
p.second);
1290 template <
class InputIt>
1294 if (exist_it ==
end()) {
1304 template <
typename K = key_type>
1320 while (
first != last) {
1328 if (
this != &other) {
1355 if (
empty())
return 0;
1366 template <
typename Derived,
typename K,
typename V,
1375 #include <google/protobuf/port_undef.inc>
1377 #endif // GOOGLE_PROTOBUF_MAP_H__
T & operator[](key_arg< K > &&key)
bool operator!=(const MapAllocator< X > &other) const
void ** CreateEmptyTable(size_type n)
constexpr size_t kGlobalEmptyTableSize
iterator erase(iterator pos)
iterator find(const Key &k)
ptrdiff_t difference_type
size_type index_of_first_non_null_
bool TableEntryIsEmpty(void *const *table, size_t b)
std::forward_iterator_tag iterator_category
std::pair< const_iterator, size_type > FindHelper(const K &k, TreeIterator *it) const
const Descriptor::ReservedRange value
T & at(const key_arg< K > &key)
constexpr InnerMap(Arena *arena)
const value_type * const_pointer
std::pair< iterator, iterator > equal_range(const key_arg< K > &key)
MapAllocator< KeyValuePair > Allocator
std::pair< const_iterator, const_iterator > equal_range(const key_arg< K > &key) const
return memset(p, 0, total)
iterator_base(TreeIterator tree_it, const InnerMap *m, size_type index)
friend bool operator==(const const_iterator &a, const const_iterator &b)
Map & operator=(const Map &other)
ptrdiff_t difference_type
MapPair(Key &&other_first)
const_iterator find(const key_type &key) const
size_t SpaceUsedExcludingSelfLong() const
const value_type & reference
const_iterator begin() const
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
void DestructorSkippable_
iterator find(const K &k)
bool TableEntryIsTooLong(size_type b)
T & operator[](const key_arg< K > &key)
void DestroyTree(Tree *tree)
OPENSSL_EXPORT pem_password_cb void * u
size_type max_size() const
iterator(const InnerIt &it)
static size_t num_elements(const uint8_t *in, size_t in_len)
std::pair< iterator, bool > insert(const value_type &value)
void TreeConvert(size_type b)
const_iterator find(const key_arg< K > &key) const
std::pair< iterator, bool > insert(const KeyValuePair &kv)
std::less< key_type > less
std::forward_iterator_tag iterator_category
void DestroyNode(Node *node)
const typedef MCPhysReg * iterator
void destroy(NodeType *p)
Tree::iterator TreeIterator
const_reference operator*() const
void Resize(size_t new_num_buckets)
InnerMap::const_iterator InnerIt
static Node * NodeFromTreeIterator(TreeIterator it)
#define T(upbtypeconst, upbtype, ctype, default_value)
bool revalidate_if_necessary(TreeIterator *it)
size_type BucketNumber(const K &k) const
bool TableEntryIsNonEmptyList(size_type b) const
reference operator*() const
size_type count(const key_type &key) const
bool ResizeIfLoadIsOutOfRange(size_type new_size)
iterator_base(Node *n, const InnerMap *m, size_type index)
bool TableEntryIsList(size_type b) const
std::pair< iterator, bool > insert(K &&k)
reference operator*() const
size_type BucketNumber(const Key &k) const
const_iterator end() const
MapPair(const Key &other_first)
const hasher & hash_function() const
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
hasher hash_function() const
Map & operator=(Map &&other) noexcept
bool operator==(const MapAllocator< X > &other) const
PROTOBUF_NOINLINE size_t SpaceUsedInTable(void **table, size_t num_buckets, size_t num_elements, size_t sizeof_node)
iterator find(const key_arg< K > &key)
bool TableEntryIsTree(size_type b) const
unsigned __int64 uint64_t
friend bool operator!=(const iterator_base &a, const iterator_base &b)
size_t StringSpaceUsedExcludingSelfLong(const std::string &str)
Map(const InputIt &first, const InputIt &last)
const_iterator begin() const
bool TableEntryIsTree(void *const *table, size_t b)
pointer operator->() const
std::set< Key *, KeyCompare, KeyPtrAllocator > Tree
std::pair< const_iterator, size_type > FindHelper(const Key &k) const
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
constexpr MapAllocator(Arena *arena)
void Swap(InnerMap *other)
const value_type * pointer
iterator_base(const InnerMap *m)
_W64 unsigned int uintptr_t
size_type TableSize(size_type n)
const_iterator(const InnerIt &it)
void TransferTree(void *const *table, size_type index)
Map::value_type value_type
InnerMap::iterator InnerIt
size_t MapValueSpaceUsedExcludingSelfLong(bool)
Map(Map &&other) noexcept
const_iterator operator++(int)
MapAllocator(const MapAllocator< X > &allocator)
bool contains(const key_arg< K > &key) const
iterator InsertUniqueInTree(size_type b, Node *node)
size_type CopyListToTree(size_type b, Tree *tree)
iterator_base & operator++()
MapPair(const MapPair &other)
Node * EraseFromLinkedList(Node *item, Node *head)
bool TableEntryIsEmpty(size_type b) const
void *const kGlobalEmptyTable[kGlobalEmptyTableSize]
std::map< KeyForTree< Key >, void *, typename TransparentSupport< Key >::less, MapAllocator< std::pair< const KeyForTree< Key >, void * > >> TreeForMap
const_iterator cbegin() const
size_t SpaceUsedInValues(const Map *map)
const_iterator find(const K &k) const
static bool Equals(const key_type &a, const key_type &b)
iterator_base operator++(int)
MapPair< Key, T > value_type
iterator InsertUnique(size_type b, Node *node)
ptrdiff_t difference_type
friend bool operator!=(const const_iterator &a, const const_iterator &b)
const_iterator find(const Key &k, TreeIterator *it) const
value_type & operator[](K &&k)
pointer allocate(size_type n, const void *=nullptr)
const_iterator end() const
size_type count(const key_arg< K > &key) const
friend bool operator!=(const iterator &a, const iterator &b)
void InternalArenaConstructable_
void Dealloc(U *t, size_type n)
internal::KeyMatcher< M > Key(M inner_matcher)
std::pair< const_iterator, size_type > FindHelper(const K &k) const
AllocList * next[kMaxLevel]
absl::string_view string_view
MapPair(const Key &other_first, const T &other_second)
std::array< int64_t, Size > values
Map::value_type value_type
iterator InsertUniqueInList(size_type b, Node *node)
bool TableEntryIsNonEmptyList(void *const *table, size_t b)
#define GOOGLE_CHECK(EXPRESSION)
void construct(NodeType *p, Args &&... args)
iterator_base< KeyValuePair > iterator
iterator_base(const iterator_base< U > &it)
bool TableEntryIsList(void *const *table, size_t b)
void SearchFrom(size_type start_bucket)
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(InnerMap)
void InternalSwap(Map &other)
void TransferList(void *const *table, size_type index)
const_iterator & operator++()
void deallocate(pointer p, size_type n)
size_type erase(const key_type &key)
friend bool operator==(const iterator &a, const iterator &b)
void DestructorSkippable_
bool ShouldInsertAfterHead(void *node)
typename std::conditional< std::is_scalar< T >::value, T, std::reference_wrapper< const T > >::type KeyForTree
pointer operator->() const
void insert(InputIt first, InputIt last)
void erase(iterator first, iterator last)
friend bool operator==(const iterator_base &a, const iterator_base &b)
const value_type & const_reference
const T & at(const key_arg< K > &key) const
size_type erase(const key_arg< K > &key)
static size_type max_size()
iterator_base< const KeyValuePair > const_iterator
size_t SpaceUsedInternal() const
const_pointer operator->() const
const_iterator cend() const
void InternalArenaConstructable_
T & operator[](const key_type &key)
void DestructorSkippable_
void insert(std::initializer_list< value_type > values)
typename internal::TransparentSupport< key_type >::template key_arg< LookupKey > key_arg
std::hash< key_type > hash
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:18