17 #ifndef GRPC_CORE_LIB_SLICE_SLICE_HASH_TABLE_H 18 #define GRPC_CORE_LIB_SLICE_SLICE_HASH_TABLE_H 88 static int DefaultValueCmp(
const T& a,
const T& b) {
return GPR_ICMP(a, b); }
92 size_t max_num_probes_;
100 template <
typename T>
103 ValueCmp value_cmp) {
104 return MakeRefCounted<SliceHashTable<T>>(num_entries, entries, value_cmp);
107 template <
typename T>
110 : value_cmp_(value_cmp),
112 size_(num_entries * 2),
114 entries_ =
static_cast<Entry*
>(
gpr_zalloc(
sizeof(Entry) * size_));
115 for (
size_t i = 0; i < num_entries; ++i) {
116 Entry* entry = &entries[i];
117 Add(entry->key, entry->value);
121 template <
typename T>
123 for (
size_t i = 0; i < size_; ++i) {
124 Entry& entry = entries_[i];
133 template <
typename T>
136 for (
size_t offset = 0; offset < size_; ++offset) {
137 const size_t idx = (hash + offset) % size_;
138 if (!entries_[idx].is_set) {
139 entries_[idx].is_set =
true;
140 entries_[idx].key = key;
141 entries_[idx].value = std::move(value);
144 if (offset > max_num_probes_) max_num_probes_ = offset;
151 template <
typename T>
156 for (
size_t offset = 0; offset <= max_num_probes_; ++offset) {
157 const size_t idx = (hash + offset) % size_;
158 if (!entries_[idx].is_set)
break;
160 return &entries_[idx].value;
166 template <
typename T>
168 ValueCmp value_cmp_a =
169 a.value_cmp_ !=
nullptr ? a.value_cmp_ : DefaultValueCmp;
170 ValueCmp value_cmp_b =
171 b.value_cmp_ !=
nullptr ? b.value_cmp_ : DefaultValueCmp;
173 const int value_fns_cmp =
GPR_ICMP((
void*)value_cmp_a, (
void*)value_cmp_b);
174 if (value_fns_cmp != 0)
return value_fns_cmp;
176 if (a.size_ < b.size_)
return -1;
177 if (a.size_ > b.size_)
return 1;
179 for (
size_t i = 0; i < a.size_; ++i) {
180 if (!a.entries_[i].
is_set) {
181 if (b.entries_[i].
is_set) {
185 }
else if (!b.entries_[i].
is_set) {
190 if (key_cmp != 0)
return key_cmp;
191 const int value_cmp = value_cmp_a(a.entries_[i].
value, b.entries_[i].
value);
192 if (value_cmp != 0)
return value_cmp;
GPRAPI void gpr_free(void *ptr)
free
Definition: alloc.cc:50
virtual ~SliceHashTable()
Definition: slice_hash_table.h:122
SliceHashTable(size_t num_entries, Entry *entries, ValueCmp value_cmp)
Definition: slice_hash_table.h:108
A grpc_slice s, if initialized, represents the byte range s.bytes[0..s.length-1]. ...
Definition: slice.h:60
Round Robin Policy.
Definition: backend_metric.cc:24
#define GPR_ICMP(a, b)
Definition: useful.h:60
grpc_slice key
Definition: slice_hash_table.h:49
void grpc_slice_unref_internal(const grpc_slice &slice)
Definition: slice_internal.h:272
GPRAPI void * gpr_zalloc(size_t size)
like malloc, but zero all bytes before returning them
Definition: alloc.cc:39
int(* ValueCmp)(const T &, const T &)
Definition: slice_hash_table.h:57
const T * Get(const grpc_slice &key) const
Returns the value from the table associated with key.
Definition: slice_hash_table.h:152
bool is_set
Definition: slice_hash_table.h:51
Definition: ref_counted_ptr.h:35
Definition: slice_hash_table.h:46
#define GPR_ASSERT(x)
abort() the process if x is zero, having written a line to the log.
Definition: log.h:94
static int Cmp(const SliceHashTable &a, const SliceHashTable &b)
Compares a vs.
Definition: slice_hash_table.h:167
uint32_t grpc_slice_hash_internal(const grpc_slice &s)
Definition: slice_internal.h:333
Definition: slice_hash_table.h:48
Definition: ref_counted.h:248
static RefCountedPtr< SliceHashTable > Create(size_t num_entries, Entry *entries, ValueCmp value_cmp)
Creates a new hash table containing entries, which is an array of length num_entries.
Definition: slice_hash_table.h:101
T value
Definition: slice_hash_table.h:50
GPRAPI int grpc_slice_cmp(grpc_slice a, grpc_slice b)
Returns <0 if a < b, ==0 if a == b, >0 if a > b The order is arbitrary, and is not guaranteed to be s...
Definition: slice.cc:491
GPRAPI int grpc_slice_eq(grpc_slice a, grpc_slice b)
Definition: slice.cc:458