hashmap.h
1 /*
2  @copyright Russell Standish 2000-2013
3  @author Russell Standish
4  This file is part of EcoLab
5 
6  Open source licensed under the MIT license. See LICENSE for details.
7 */
8 
9 
10 template <class hash>
11 class hashmap
12 {
13  typedef std::vector<objref> v;
14  typedef std::map<short,v> vv;
15  vv data;
16  hash h;
17 
18  struct objref_eq
19  {
20  GraphID_t ID;
21  objref_eq(GraphID_t i): ID(i) {}
22  bool operator()(const objref& x) {return x.ID==ID;}
23  };
24 
25 protected:
26  objref& at(GraphID_t i)
27  {
28  v& bin=data[h(i)];
29  v::iterator elem=find_if(bin.begin(),bin.end(),objref_eq(i));
30  if (elem==bin.end())
31  {
32  bin.push_back(objref(i));
33  return bin.back();
34  }
35  return *elem;
36  }
37 
38  objref at(GraphID_t i) const
39  {
40  const v& bin=data[h(i)];
41  v::const_iterator elem=find_if(bin.begin(),bin.end(),objref_eq(i));
42  if (elem==bin.end())
43  return objref(i);
44  else
45  return *elem;
46  }
47 
48 
49  public:
50  hashmap() {}
51  hashmap(const hashmap& x): data(x.data) {}
52 
53  template <class ret, class v_it, class vv_it>
54  class iter
55  {
56  vv_it i1;
57  v_it i2;
58  void incr() {i2++; if (i2==i1->second.end()) {i1++; i2=i1->second.begin();}}
59  void decr() {if (i2==i1->second.begin()) {i1--; i2=i1->second.end();} i2--;}
60  public:
61  iter() {}
62  iter(const iter& x): i1(x.i1), i2(x.i2) {}
63  iter(const vv_it& x,const v_it& y):
64  i1(x), i2(y) {}
65  iter operator++(int) {iter r=*this; incr(); return r;}
66  iter operator++() {incr(); return *this;}
67  iter operator--(int) {iter r=*this; decr(); return r;}
68  iter operator--() {decr(); return *this;}
69  bool operator==(const iter& x) const {return i1==x.i1 && i2==x.i2 ;}
70  bool operator!=(const iter& x) const {return !(x==*this);}
71  ret& operator*() {return *i2;}
72  ret* operator->() {return &*i2;}
73  };
74 
77 
78  iterator begin() {
79  return iterator(data.begin(), data.begin()->second.begin());}
80  iterator end() {return iterator(data.end(),data.end()->second.begin());}
81  const_iterator begin() const {
82  return const_iterator(data.begin(), data.begin()->second.begin());}
83  const_iterator end() const {
84  return const_iterator(data.end(),data.end()->second.begin());}
85  typedef GraphID_t size_type;
86  size_type size() const
87  {
88  unsigned s=0;
89  for (vv::const_iterator i=data.begin(); i!=data.end(); i++)
90  s+=i->second.size();
91  return s;
92  }
93  void clear() {data.clear();}
94 };
Definition: hashmap.h:11
Definition: hashmap.h:54