NEURON
bimap.hpp
Go to the documentation of this file.
1 //
2 // bimap.hpp
3 // bimap
4 //
5 // Created by Ewart Timothee on 16/06/16.
6 //
7 
8 #ifndef bimap_h
9 #define bimap_h
10 
11 #include <map>
12 
13 namespace nrn {
14 namespace tool {
15 
16 template <class T, class O>
17 struct bimap {
18  typedef std::multimap<T, O> pd2ob_map;
19  typedef std::multimap<O, T> ob2pd_map;
20 
21  void insert(T const&, O const&);
22  bool find(T const& p, size_t n, T&, O&);
23  bool find(T const& p, T&, O&);
24  void obremove(O const&);
25  void remove(T const&, O const&);
26 
29 };
30 
31 // free function for remove, generic also no need to duplicate
32 template <class T>
33 void remove_from(typename T::key_type const& a, typename T::mapped_type const& b, T& m) {
34  std::pair<typename T::iterator, typename T::const_iterator> itp = m.equal_range(a);
35  for (typename T::iterator it = itp.first; it != itp.second;) {
36  typename T::iterator it2(it);
37  ++it;
38  if (it2->second == b) {
39  m.erase(it2);
40  }
41  }
42 }
43 
44 template <class T, class O>
45 void bimap<T, O>::insert(T const& pd, O const& ob) {
46  pd2ob.insert(std::pair<T, O>(pd, ob));
47  ob2pd.insert(std::pair<O, T>(ob, pd));
48 }
49 
50 template <class T, class O>
51 void bimap<T, O>::obremove(O const& ob) {
52  std::pair<typename ob2pd_map::iterator, typename ob2pd_map::iterator> itp = ob2pd.equal_range(
53  ob);
54  for (typename ob2pd_map::iterator it = itp.first; it != itp.second; ++it) {
55  T const& pd = it->second;
56  remove_from(pd, ob, pd2ob);
57  }
58  ob2pd.erase(itp.first, itp.second);
59 }
60 
61 template <class T, class O>
62 void bimap<T, O>::remove(T const& pd, O const& ob) {
63  remove_from(pd, ob, pd2ob);
64  remove_from(ob, pd, ob2pd);
65 }
66 
67 template <class T, class O>
68 bool bimap<T, O>::find(T const& p, size_t n, T& pret, O& obret) {
69  bool result = false;
70  typename pd2ob_map::iterator it = pd2ob.upper_bound(p + n);
71  if (it != pd2ob.begin()) {
72  --it;
73  if ((it->first >= p) && (it->first < p + n)) {
74  result = true;
75  pret = it->first;
76  obret = it->second;
77  }
78  }
79  return result;
80 }
81 
82 template <class T, class O>
83 bool bimap<T, O>::find(T const& p, T& pret, O& obret) {
84  bool result = false;
85  typename pd2ob_map::iterator it = pd2ob.find(p);
86  if (it != pd2ob.end()) {
87  result = true;
88  pret = it->first;
89  obret = it->second;
90  }
91  return result;
92 }
93 
94 } // namespace tool
95 } // end namespace nrn
96 #endif /* bimap_h */
void remove_from(typename T::key_type const &a, typename T::mapped_type const &b, T &m)
Definition: bimap.hpp:33
Definition: bimap.hpp:13
int const size_t const size_t n
Definition: nrngsl.h:10
size_t p
std::multimap< O, T > ob2pd_map
Definition: bimap.hpp:19
bool find(T const &p, size_t n, T &, O &)
Definition: bimap.hpp:68
void insert(T const &, O const &)
Definition: bimap.hpp:45
ob2pd_map ob2pd
Definition: bimap.hpp:28
void obremove(O const &)
Definition: bimap.hpp:51
void remove(T const &, O const &)
Definition: bimap.hpp:62
pd2ob_map pd2ob
Definition: bimap.hpp:27
std::multimap< T, O > pd2ob_map
Definition: bimap.hpp:18