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 
27  pd2ob_map pd2ob;
28  ob2pd_map ob2pd;
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(ob);
53  for (typename ob2pd_map::iterator it = itp.first; it != itp.second; ++it) {
54  T const& pd = it->second;
55  remove_from(pd, ob, pd2ob);
56  }
57  ob2pd.erase(itp.first, itp.second);
58 }
59 
60 template<class T, class O>
61 void bimap<T,O>::remove(T const& pd, O const& ob) {
62  remove_from(pd, ob, pd2ob);
63  remove_from(ob, pd, ob2pd);
64 }
65 
66 template<class T, class O>
67 bool bimap<T,O>::find(T const& p, size_t n, T& pret, O& obret) {
68  bool result = false;
69  typename pd2ob_map::iterator it = pd2ob.upper_bound(p + n);
70  if (it != pd2ob.begin()) {
71  --it;
72  if ((it->first >= p) && (it->first < p + n)) {
73  result = true;
74  pret = it->first;
75  obret = it->second;
76  }
77  }
78  return result;
79 }
80 
81 template<class T, class O>
82 bool bimap<T,O>::find(T const& p, T& pret, O& obret) {
83  bool result = false;
84  typename pd2ob_map::iterator it = pd2ob.find(p);
85  if (it != pd2ob.end()) {
86  result = true;
87  pret = it->first;
88  obret = it->second;
89  }
90  return result;
91 }
92 
93 } // name space tool
94 } // end namespace nrn
95 #endif /* bimap_h */
double T
Definition: rbtqueue.cpp:25
ob2pd_map ob2pd
Definition: bimap.hpp:28
bool find(T const &p, size_t n, T &, O &)
Definition: bimap.hpp:67
Definition: bimap.hpp:13
size_t p
void remove_from(typename T::key_type const &a, typename T::mapped_type const &b, T &m)
Definition: bimap.hpp:33
pd2ob_map pd2ob
Definition: bimap.hpp:27
std::multimap< O, T > ob2pd_map
Definition: bimap.hpp:19
void obremove(O const &)
Definition: bimap.hpp:51
int const size_t const size_t n
Definition: nrngsl.h:12
std::multimap< T, O > pd2ob_map
Definition: bimap.hpp:18
void insert(T const &, O const &)
Definition: bimap.hpp:45
void remove(T const &, O const &)
Definition: bimap.hpp:61