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
00047 template <typename KEY,typename VALUE>
00048 class bimap
00049 {
00050 private:
00051 std::map<KEY,VALUE> m_k2v;
00052 std::map<VALUE,KEY> m_v2k;
00053
00054 public:
00055 typedef typename std::map<KEY,VALUE>::const_iterator const_iterator;
00056 typedef typename std::map<KEY,VALUE>::iterator iterator;
00057
00058 typedef typename std::map<VALUE,KEY>::const_iterator const_iterator_inverse;
00059 typedef typename std::map<VALUE,KEY>::iterator iterator_inverse;
00060
00061
00062 bimap() { }
00063
00064 inline const_iterator begin() const { return m_k2v.begin(); }
00065 inline iterator begin() { return m_k2v.begin(); }
00066 inline const_iterator end() const { return m_k2v.end(); }
00067 inline iterator end() { return m_k2v.end(); }
00068
00069 inline const_iterator_inverse inverse_begin() const { return m_v2k.begin(); }
00070 inline iterator_inverse inverse_begin() { return m_v2k.begin(); }
00071 inline const_iterator_inverse inverse_end() const { return m_v2k.end(); }
00072 inline iterator_inverse inverse_end() { return m_v2k.end(); }
00073
00074 inline size_t size() const { return m_k2v.size(); }
00075 inline bool empty() const { return m_k2v.empty(); }
00076
00077
00078 const std::map<KEY,VALUE> &getDirectMap() const { return m_k2v; }
00079
00080 const std::map<VALUE,KEY> &getInverseMap() const { return m_v2k; }
00081
00082 void clear()
00083 {
00084 m_k2v.clear();
00085 m_v2k.clear();
00086 }
00087
00088
00089 void insert(const KEY &k,const VALUE &v)
00090 {
00091 m_k2v[k]=v;
00092 m_v2k[v]=k;
00093 }
00094
00095
00096
00097
00098
00099 bool direct(const KEY &k, VALUE &out_v) const
00100 {
00101 const_iterator i=m_k2v.find(k);
00102 if (i==m_k2v.end()) return false;
00103 out_v = i->second;
00104 return true;
00105 }
00106
00107
00108 inline bool hasKey(const KEY& k) const {
00109 return m_k2v.find(k)!=m_k2v.end();
00110 }
00111
00112 inline bool hasValue(const VALUE& v) const {
00113 return m_v2k.find(v)!=m_v2k.end();
00114 }
00115
00116
00117
00118
00119
00120 VALUE direct(const KEY &k) const
00121 {
00122 const_iterator i=m_k2v.find(k);
00123 if (i==m_k2v.end()) THROW_EXCEPTION("Key not found.");
00124 return i->second;
00125 }
00126
00127
00128
00129
00130
00131 bool inverse(const VALUE &v, KEY &out_k) const
00132 {
00133 const_iterator_inverse i=m_v2k.find(v);
00134 if (i==m_v2k.end()) return false;
00135 out_k = i->second;
00136 return true;
00137 }
00138
00139
00140
00141
00142
00143 KEY inverse(const VALUE &v) const
00144 {
00145 const_iterator_inverse i=m_v2k.find(v);
00146 if (i==m_v2k.end()) THROW_EXCEPTION("Value not found.");
00147 return i->second;
00148 }
00149
00150
00151 inline const_iterator find_key(const KEY& k) const { return m_k2v.find(k); }
00152 inline iterator find_key(const KEY& k) { return m_k2v.find(k); }
00153
00154 inline const_iterator_inverse find_value(const VALUE& v) const { return m_v2k.find(v); }
00155 inline iterator_inverse find_value(const VALUE& v) { return m_v2k.find(v); }
00156
00157
00158 };
00159
00160 }
00161 }
00162 #endif