00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef mrpt_bimap_H
00029 #define mrpt_bimap_H
00030
00031
00032
00033 #include <mrpt/utils/utils_defs.h>
00034 #include <map>
00035
00036 namespace mrpt
00037 {
00038 namespace utils
00039 {
00040
00041
00042
00043
00044
00045
00046 template <typename KEY,typename VALUE>
00047 class bimap
00048 {
00049 private:
00050 std::map<KEY,VALUE> m_k2v;
00051 std::map<VALUE,KEY> m_v2k;
00052
00053 public:
00054 typedef typename std::map<KEY,VALUE>::const_iterator const_iterator;
00055 typedef typename std::map<KEY,VALUE>::iterator iterator;
00056
00057 typedef typename std::map<VALUE,KEY>::const_iterator const_iterator_inverse;
00058 typedef typename std::map<VALUE,KEY>::iterator iterator_inverse;
00059
00060
00061 bimap() { }
00062
00063 inline const_iterator begin() const { return m_k2v.begin(); }
00064 inline iterator begin() { return m_k2v.begin(); }
00065 inline const_iterator end() const { return m_k2v.end(); }
00066 inline iterator end() { return m_k2v.end(); }
00067
00068 inline const_iterator_inverse inverse_begin() const { return m_v2k.begin(); }
00069 inline iterator_inverse inverse_begin() { return m_v2k.begin(); }
00070 inline const_iterator_inverse inverse_end() const { return m_v2k.end(); }
00071 inline iterator_inverse inverse_end() { return m_v2k.end(); }
00072
00073 inline size_t size() const { return m_k2v.size(); }
00074 inline bool empty() const { return m_k2v.empty(); }
00075
00076
00077 const std::map<KEY,VALUE> &getDirectMap() const { return m_k2v; }
00078
00079 const std::map<VALUE,KEY> &getInverseMap() const { return m_v2k; }
00080
00081 void clear()
00082 {
00083 m_k2v.clear();
00084 m_v2k.clear();
00085 }
00086
00087
00088 void insert(const KEY &k,const VALUE &v)
00089 {
00090 m_k2v[k]=v;
00091 m_v2k[v]=k;
00092 }
00093
00094
00095
00096
00097
00098 bool direct(const KEY &k, VALUE &out_v) const
00099 {
00100 const_iterator i=m_k2v.find(k);
00101 if (i==m_k2v.end()) return false;
00102 out_v = i->second;
00103 return true;
00104 }
00105
00106
00107 inline bool hasKey(const KEY& k) const {
00108 return m_k2v.find(k)!=m_k2v.end();
00109 }
00110
00111 inline bool hasValue(const VALUE& v) const {
00112 return m_v2k.find(v)!=m_v2k.end();
00113 }
00114
00115
00116
00117
00118
00119 VALUE direct(const KEY &k) const
00120 {
00121 const_iterator i=m_k2v.find(k);
00122 if (i==m_k2v.end()) THROW_EXCEPTION("Key not found.");
00123 return i->second;
00124 }
00125
00126
00127
00128
00129
00130 bool inverse(const VALUE &v, KEY &out_k) const
00131 {
00132 const_iterator_inverse i=m_v2k.find(v);
00133 if (i==m_v2k.end()) return false;
00134 out_k = i->second;
00135 return true;
00136 }
00137
00138
00139
00140
00141
00142 KEY inverse(const VALUE &v) const
00143 {
00144 const_iterator_inverse i=m_v2k.find(v);
00145 if (i==m_v2k.end()) THROW_EXCEPTION("Value not found.");
00146 return i->second;
00147 }
00148
00149
00150 inline const_iterator find_key(const KEY& k) const { return m_k2v.find(k); }
00151 inline iterator find_key(const KEY& k) { return m_k2v.find(k); }
00152
00153 inline const_iterator_inverse find_value(const VALUE& v) const { return m_v2k.find(v); }
00154 inline iterator_inverse find_value(const VALUE& v) { return m_v2k.find(v); }
00155
00156
00157 };
00158
00159 }
00160 }
00161 #endif