Go to the documentation of this file.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