1#ifndef CLICK_HASHMAP_HH
2#define CLICK_HASHMAP_HH
3#include <click/hashcode.hh>
7class HashMap_ArenaFactory;
21template <
class K,
class V =
void>
class _HashMap_const_iterator;
22template <
class K,
class V =
void>
class _HashMap_iterator;
23template <
class K,
class V =
void>
class HashMap;
25template <
class K,
class V>
26class HashMap {
public:
29 typedef V mapped_type;
33 explicit HashMap(
const V &, HashMap_ArenaFactory * = 0);
34 HashMap(
const HashMap<K, V> &);
37 void set_arena(HashMap_ArenaFactory *);
39 size_t size()
const {
return _n; }
40 bool empty()
const {
return _n == 0; }
41 size_t nbuckets()
const {
return _nbuckets; }
43 Pair *find_pair(
const K &)
const;
44 inline V *findp(
const K &)
const;
45 inline const V &find(
const K &,
const V &)
const;
46 inline const V &find(
const K &)
const;
47 inline const V &operator[](
const K &)
const;
49 Pair *find_pair_force(
const K &,
const V &);
50 Pair *find_pair_force(
const K &k) {
return find_pair_force(k, _default_value); }
51 V *findp_force(
const K &k,
const V &v) {
if (Pair *p = find_pair_force(k, v))
return &p->value;
else return 0; }
52 V &find_force(
const K &k,
const V &v) {
return *findp_force(k, v); }
53 V *findp_force(
const K &k) {
return findp_force(k, _default_value); }
54 V &find_force(
const K &k) {
return *findp_force(k, _default_value); }
56 bool insert(
const K &,
const V &);
57 bool erase(
const K &);
58 bool remove(
const K &key) {
63 void swap(HashMap<K, V> &);
66 typedef _HashMap_const_iterator<K, V> const_iterator;
67 typedef _HashMap_iterator<K, V> iterator;
68 inline const_iterator begin()
const;
69 inline iterator begin();
70 inline const_iterator end()
const;
71 inline iterator end();
75 bool dynamic_resizing()
const {
return _capacity < 0x7FFFFFFF; }
76 void set_dynamic_resizing(
bool);
78 HashMap<K, V> &operator=(
const HashMap<K, V> &);
85 enum { MAX_NBUCKETS = 4194303,
86 DEFAULT_INITIAL_NBUCKETS = 127,
87 DEFAULT_RESIZE_THRESHOLD = 2 };
91 struct Elt :
public Pair {
93#if defined(__GNUC__) && __GNUC__ < 4
95 Elt(
const Pair &p) : Pair(p) { }
106 HashMap_Arena *_arena;
108 void initialize(HashMap_ArenaFactory *,
size_t);
109 void copy_from(
const HashMap<K, V> &);
110 void resize0(
size_t);
111 size_t bucket(
const K &)
const;
113 friend class _HashMap_iterator<K, V>;
114 friend class _HashMap_const_iterator<K, V>;
118template <
class K,
class V>
119class _HashMap_const_iterator {
public:
121 bool live()
const {
return _elt; }
122 typedef bool (_HashMap_const_iterator::*unspecified_bool_type)() const;
123 inline operator unspecified_bool_type() const CLICK_DEPRECATED;
124 void operator++(
int);
125 void operator++() { (*this)++; }
127 typedef typename HashMap<K, V>::Pair Pair;
128 const Pair *pair()
const {
return _elt; }
130 const K &key()
const {
return _elt->key; }
131 const V &value()
const {
return _elt->value; }
135 const HashMap<K, V> *_hm;
136 typename HashMap<K, V>::Elt *_elt;
139 _HashMap_const_iterator(
const HashMap<K, V> *m,
bool begin);
140 friend class HashMap<K, V>;
141 friend class _HashMap_iterator<K, V>;
145template <
class K,
class V>
146class _HashMap_iterator :
public _HashMap_const_iterator<K, V> {
public:
148 typedef _HashMap_const_iterator<K, V> inherited;
150 typedef typename HashMap<K, V>::Pair Pair;
151 Pair *pair()
const {
return const_cast<Pair *
>(inherited::pair()); }
152 V &value()
const {
return const_cast<V &
>(inherited::value()); }
156 _HashMap_iterator(HashMap<K, V> *m,
bool begin) : inherited(m, begin) { }
157 friend class HashMap<K, V>;
161template <
class K,
class V>
162inline typename HashMap<K, V>::const_iterator
163HashMap<K, V>::begin()
const
165 return const_iterator(
this,
true);
168template <
class K,
class V>
169inline typename HashMap<K, V>::iterator
170HashMap<K, V>::begin()
172 return iterator(
this,
true);
175template <
class K,
class V>
176inline typename HashMap<K, V>::const_iterator
177HashMap<K, V>::end()
const
179 return const_iterator(
this,
false);
182template <
class K,
class V>
183inline typename HashMap<K, V>::iterator
186 return iterator(
this,
false);
189template <
class K,
class V>
191HashMap<K, V>::findp(
const K &key)
const
193 Pair *p = find_pair(key);
194 return (p ? &p->value : 0);
197template <
class K,
class V>
199HashMap<K, V>::find(
const K &key,
const V &default_value)
const
201 Pair *p = find_pair(key);
202 const V *v = (p ? &p->value : &default_value);
206template <
class K,
class V>
208HashMap<K, V>::find(
const K &key)
const
210 return find(key, _default_value);
213template <
class K,
class V>
215HashMap<K, V>::operator[](
const K &key)
const
220template <
class K,
class V>
222_HashMap_const_iterator<K, V>::operator unspecified_bool_type()
const
224 return live() ? &_HashMap_const_iterator::live : 0;
229class HashMap<K, void *> {
public:
232 typedef void *mapped_type;
236 explicit HashMap(
void *, HashMap_ArenaFactory * = 0);
237 HashMap(
const HashMap<K, void *> &);
240 void set_arena(HashMap_ArenaFactory *);
242 size_t size()
const {
return _n; }
243 bool empty()
const {
return _n == 0; }
244 size_t nbuckets()
const {
return _nbuckets; }
246 Pair *find_pair(
const K &)
const;
247 inline void **findp(
const K &)
const;
248 inline void *find(
const K &,
void *)
const;
249 inline void *find(
const K &)
const;
250 inline void *operator[](
const K &)
const;
252 Pair *find_pair_force(
const K &,
void *);
253 Pair *find_pair_force(
const K &k) {
return find_pair_force(k, _default_value); }
254 void **findp_force(
const K &k,
void *v) {
if (Pair *p = find_pair_force(k, v))
return &p->value;
else return 0; }
255 void *&find_force(
const K &k,
void *v) {
return *findp_force(k, v); }
256 void **findp_force(
const K &k) {
return findp_force(k, _default_value); }
257 void *&find_force(
const K &k) {
return *findp_force(k, _default_value); }
259 bool insert(
const K &,
void *);
260 bool erase(
const K &);
261 bool remove(
const K &key) {
266 void swap(HashMap<K, void *> &);
269 typedef _HashMap_const_iterator<K, void *> const_iterator;
270 typedef _HashMap_iterator<K, void *> iterator;
271 inline const_iterator begin()
const;
272 inline iterator begin();
273 inline const_iterator end()
const;
274 inline iterator end();
278 bool dynamic_resizing()
const {
return _capacity < 0x7FFFFFFF; }
279 void set_dynamic_resizing(
bool);
281 HashMap<K, void *> &operator=(
const HashMap<K, void *> &);
288 enum { MAX_NBUCKETS = 32767,
289 DEFAULT_INITIAL_NBUCKETS = 127,
290 DEFAULT_RESIZE_THRESHOLD = 2 };
294 struct Elt :
public Pair {
296#if defined(__GNUC__) && __GNUC__ < 4
298 Elt(
const Pair &p) : Pair(p) { }
304 void *_default_value;
309 HashMap_Arena *_arena;
311 void initialize(HashMap_ArenaFactory *,
size_t);
312 void copy_from(
const HashMap<K, void *> &);
313 void resize0(
size_t);
314 size_t bucket(
const K &)
const;
316 friend class _HashMap_iterator<K, void *>;
317 friend class _HashMap_const_iterator<K, void *>;
322class _HashMap_const_iterator<K, void *> {
public:
324 bool live()
const {
return _elt; }
325 typedef bool (_HashMap_const_iterator::*unspecified_bool_type)() const;
326 inline operator unspecified_bool_type() const CLICK_DEPRECATED;
327 void operator++(
int);
328 void operator++() { (*this)++; }
330 typedef typename HashMap<K, void *>::Pair Pair;
331 const Pair *pair()
const {
return _elt; }
333 const K &key()
const {
return _elt->key; }
334 void *value()
const {
return _elt->value; }
338 const HashMap<K, void *> *_hm;
339 typename HashMap<K, void *>::Elt *_elt;
342 _HashMap_const_iterator(
const HashMap<K, void *> *,
bool begin);
343 template <
class,
class>
friend class _HashMap_const_iterator;
344 template <
class,
class>
friend class _HashMap_iterator;
345 template <
class,
class>
friend class HashMap;
350class _HashMap_iterator<K, void *> :
public _HashMap_const_iterator<K, void *> {
public:
352 typedef _HashMap_const_iterator<K, void *> inherited;
354 typedef typename HashMap<K, void *>::Pair Pair;
355 Pair *pair()
const {
return const_cast<Pair *
>(inherited::pair()); }
356 void *&value()
const {
return this->_elt->value; }
360 _HashMap_iterator(HashMap<K, void *> *m,
bool begin) : inherited(m, begin) { }
361 template <
class,
class>
friend class HashMap;
366inline typename HashMap<K, void *>::const_iterator
367HashMap<K, void *>::begin()
const
369 return const_iterator(
this,
true);
373inline typename HashMap<K, void *>::iterator
374HashMap<K, void *>::begin()
376 return iterator(
this,
true);
380inline typename HashMap<K, void *>::const_iterator
381HashMap<K, void *>::end()
const
383 return const_iterator(
this,
false);
387inline typename HashMap<K, void *>::iterator
388HashMap<K, void *>::end()
390 return iterator(
this,
false);
395HashMap<K, void *>::findp(
const K &key)
const
397 Pair *p = find_pair(key);
398 return (p ? &p->value : 0);
403HashMap<K, void *>::find(
const K &key,
void *default_value)
const
405 Pair *p = find_pair(key);
406 return (p ? p->value : default_value);
411HashMap<K, void *>::find(
const K &key)
const
413 return find(key, _default_value);
418HashMap<K, void *>::operator[](
const K &key)
const
425_HashMap_const_iterator<K, void *>::operator unspecified_bool_type()
const
427 return live() ? &_HashMap_const_iterator::live : 0;
431template <
class K,
class T>
432class HashMap<K, T *> :
public HashMap<K, void *> {
public:
435 typedef T *mapped_type;
436 typedef HashMap<K, void *> inherited;
439 HashMap() : inherited() { }
440 explicit HashMap(T *def, HashMap_ArenaFactory *factory = 0)
441 : inherited(def, factory) { }
442 HashMap(
const HashMap<K, T *> &o) : inherited(o) { }
445 void set_arena(HashMap_ArenaFactory *af) { inherited::set_arena(af); }
451 Pair *find_pair(
const K &k)
const {
return reinterpret_cast<Pair *
>(inherited::find_pair(k)); }
452 T **findp(
const K &k)
const {
return reinterpret_cast<T **
>(inherited::findp(k)); }
453 T *find(
const K &k, T *v)
const {
return reinterpret_cast<T *
>(inherited::find(k, v)); }
454 T *find(
const K &k)
const {
return reinterpret_cast<T *
>(inherited::find(k)); }
455 T *operator[](
const K &k)
const {
return reinterpret_cast<T *
>(inherited::operator[](k)); }
457 Pair *find_pair_force(
const K &k, T *v) {
return reinterpret_cast<Pair *
>(inherited::find_pair_force(k, v)); }
458 Pair *find_pair_force(
const K &k) {
return reinterpret_cast<Pair *
>(inherited::find_pair_force(k)); }
459 T **findp_force(
const K &k, T *v) {
return reinterpret_cast<T **
>(inherited::findp_force(k, v)); }
460 T *&find_force(
const K &k, T *v) {
return *
reinterpret_cast<T **
>(inherited::findp_force(k, v)); }
461 T **findp_force(
const K &k) {
return reinterpret_cast<T **
>(inherited::findp_force(k)); }
462 T *&find_force(
const K &k) {
return *
reinterpret_cast<T **
>(inherited::findp_force(k)); }
464 bool insert(
const K &k, T *v) {
return inherited::insert(k, v); }
469 void swap(HashMap<K, T *> &o) { inherited::swap(o); }
472 typedef _HashMap_const_iterator<K, T *> const_iterator;
473 typedef _HashMap_iterator<K, T *> iterator;
474 inline const_iterator begin()
const;
475 inline iterator begin();
476 inline const_iterator end()
const;
477 inline iterator end();
481 HashMap<K, T *> &operator=(
const HashMap<K, T *> &o) {
return static_cast<HashMap<K, T *> &
>(inherited::operator=(o)); }
490template <
class K,
class T>
491class _HashMap_const_iterator<K, T *> {
public:
493 typedef _HashMap_const_iterator<K, void *> inherited;
495 bool live()
const {
return _i.live(); }
496 typedef typename inherited::unspecified_bool_type unspecified_bool_type;
497 inline operator unspecified_bool_type() const CLICK_DEPRECATED;
498 void operator++(
int) { _i.operator++(0); }
499 void operator++() { _i.operator++(); }
501 typedef typename HashMap<K, T *>::Pair Pair;
502 const Pair *pair()
const {
return reinterpret_cast<const Pair *
>(_i.pair()); }
504 const K &key()
const {
return _i.key(); }
505 T *value()
const {
return reinterpret_cast<T *
>(_i.value()); }
511 _HashMap_const_iterator(
const HashMap<K, T *> *t,
bool begin) : _i(t, begin) { }
512 friend class _HashMap_iterator<K, T *>;
513 template <
class,
class>
friend class HashMap;
517template <
class K,
class T>
518class _HashMap_iterator<K, T *> :
public _HashMap_const_iterator<K, T *> {
public:
520 typedef _HashMap_const_iterator<K, T *> inherited;
522 typedef typename HashMap<K, T *>::Pair Pair;
523 Pair *pair()
const {
return const_cast<Pair *
>(inherited::pair()); }
524 T *&value()
const {
return pair()->value; }
528 _HashMap_iterator(HashMap<K, T *> *t,
bool begin) : inherited(t, begin) { }
529 template <
class,
class>
friend class HashMap;
533template <
class K,
class T>
534inline typename HashMap<K, T *>::const_iterator
535HashMap<K, T *>::begin()
const
537 return const_iterator(
this,
true);
540template <
class K,
class T>
541inline typename HashMap<K, T *>::iterator
542HashMap<K, T *>::begin()
544 return iterator(
this,
true);
547template <
class K,
class T>
548inline typename HashMap<K, T *>::const_iterator
549HashMap<K, T *>::end()
const
551 return const_iterator(
this,
false);
554template <
class K,
class T>
555inline typename HashMap<K, T *>::iterator
556HashMap<K, T *>::end()
558 return iterator(
this,
false);
561template <
class K,
class T>
563_HashMap_const_iterator<K, T *>::operator unspecified_bool_type()
const
565 return inherited::live() ? &inherited::live : 0;
568template <
class K,
class V>
570operator==(
const _HashMap_const_iterator<K, V> &a,
const _HashMap_const_iterator<K, V> &b)
572 return a.pair() == b.pair();
575template <
class K,
class V>
577operator!=(
const _HashMap_const_iterator<K, V> &a,
const _HashMap_const_iterator<K, V> &b)
579 return a.pair() != b.pair();
584#include <click/hashmap.cc>