00001
00002
00003
00004
00005 #ifndef GAUDIKERNEL_MAP_H
00006 #define GAUDIKERNEL_MAP_H 1
00007
00008
00009
00010
00011
00012 #include <map>
00013
00014
00015
00016 namespace GaudiUtils
00017 {
00029 template <typename K, typename T, typename M = std::map<K,T> >
00030 class Map
00031 {
00032 public:
00033
00034
00035 typedef M map_type;
00036 typedef K key_type;
00037 typedef T mapped_type;
00038
00039
00040 typedef K argument_type;
00041 typedef T result_type;
00042 typedef std::pair<const K,T> value_type;
00043
00044 typedef typename map_type::size_type size_type;
00045
00046 typedef typename map_type::iterator iterator;
00047 typedef typename map_type::const_iterator const_iterator;
00048
00049
00050
00051 protected:
00052
00053 map_type m_map;
00054 static const result_type s_null_value;
00055
00056 public:
00057
00058
00060 Map(): m_map() {}
00061
00063 Map(const map_type& other): m_map(other) {}
00064
00065
00066
00068 template <typename In>
00069 Map(In first, In last): m_map(first,last) {}
00070
00072 virtual ~Map() {}
00073
00074
00075
00076
00077
00078 inline iterator begin() { return m_map.begin(); }
00079 inline iterator end() { return m_map.end(); }
00080
00081 inline const_iterator begin() const { return m_map.begin(); }
00082 inline const_iterator end() const { return m_map.end(); }
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 inline mapped_type &operator[] (const key_type &key) { return m_map[key]; }
00093
00094
00095
00096 inline iterator find(const key_type &key) { return m_map.find(key); }
00097 inline const_iterator find(const key_type &key) const { return m_map.find(key); }
00098
00099 inline size_type count(const key_type &key) const { return m_map.count(key); }
00100
00101 inline iterator lower_bound(const key_type &key) { return m_map.lower_bound(key); }
00102 inline const_iterator lower_bound(const key_type &key) const { return m_map.lower_bound(key); }
00103 inline iterator upper_bound(const key_type &key) { return m_map.upper_bound(key); }
00104 inline const_iterator upper_bound(const key_type &key) const { return m_map.upper_bound(key); }
00105
00106 inline std::pair<iterator,iterator> equal_range(const key_type &key)
00107 { return m_map.equal_range(key); }
00108 inline std::pair<const_iterator,const_iterator> equal_range(const key_type &key) const
00109 { return m_map.equal_range(key); }
00110
00111
00112
00113 inline std::pair<iterator,bool> insert(const value_type &val) { return m_map.insert(val); }
00114 inline iterator insert(iterator pos, const value_type &val) { return m_map.insert(pos,val); }
00115 template <typename In>
00116 inline void insert(In first, In last) { m_map.insert(first,last); }
00117
00118 inline void erase(iterator pos) { m_map.erase(pos); }
00119 inline size_type erase(const key_type &key) { return m_map.erase(key); }
00120 inline void erase(iterator first, iterator last) { m_map.erase(first,last); }
00121 inline void clear() { m_map.clear(); }
00122
00123
00124
00125 inline size_type size() const { return m_map.size(); }
00126 inline size_type max_size() const { return m_map.max_size(); }
00127 inline bool empty() const { return size() == 0; }
00128 inline void swap(map_type& other) { m_map.swap(other); }
00129
00130
00131
00154 inline const result_type &operator() ( const argument_type &key ) const
00155 {
00156
00157 const_iterator it = m_map.find(key);
00158 if ( it != m_map.end() ) { return it->second ; }
00159
00160 return s_null_value;
00161 }
00162
00185 inline const mapped_type &operator[] ( const key_type &key ) const
00186 { return (*this)(key); }
00187
00189 inline Map& merge ( const map_type& other )
00190 {
00191 for ( typename map_type::const_iterator it = other.begin() ;
00192 other.end() != it ; ++it ) { (*this)[it->first] = it->second ; }
00193 return *this;
00194 }
00195
00197 inline operator map_type &() { return m_map ; }
00198 inline operator const map_type &() const { return m_map ; }
00199 };
00200
00201 template <typename K, typename T, typename M>
00202 const typename Map<K,T,M>::result_type Map<K,T,M>::s_null_value = typename Map<K,T,M>::result_type();
00203
00204 }
00205
00206
00208
00209 #endif // GAUDIKERNEL_MAP_H
00210