| # Gaudi Framework, version v25r0 |

Home |  | Generated: Mon Feb 17 2014

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Map.h
Go to the documentation of this file.
1 #ifndef GAUDIKERNEL_MAP_H
2 #define GAUDIKERNEL_MAP_H 1
3 // ============================================================================
4 // Include files
5 // ============================================================================
6 // STD & STL
7 // ============================================================================
8 #include <map>
9 // ============================================================================
10 // GaudiKernel
11 // ============================================================================
12 #include "GaudiKernel/MapBase.h"
13 // ============================================================================
14 namespace GaudiUtils
15 {
16 // ==========================================================================
81 template <typename K, typename T, typename M = std::map<K,T> >
82 class Map : public Gaudi::Utils::MapBase
83 {
84 public:
85 // ========================================================================
86 // ---- types
87 typedef M map_type;
88 typedef K key_type;
89 typedef T mapped_type;
90
91 // -- from unary_function
92 typedef K argument_type;
93 typedef T result_type;
94 typedef std::pair<const K,T> value_type;
95
96 typedef typename map_type::size_type size_type;
97
98 typedef typename map_type::iterator iterator;
99 typedef typename map_type::const_iterator const_iterator;
100 // typedef typename map_type::reverse_iterator reverse_iterator;
101 // typedef typename map_type::const_reverse_iterator const_reverse_iterator;
102 // ========================================================================
103 protected:
104 // ========================================================================
105 map_type m_map;
106 static const result_type s_null_value;
107 // ========================================================================
108 public:
109 // ---- Constructors
110
112 Map(): m_map() {}
113
115 Map(const map_type& other): m_map(other) {}
116
117 // /// Copy Constructor
118 // Map(const Map& other): m_map(other.m_map) {}
120 template <typename In>
121 Map(In first, In last): m_map(first,last) {}
122
124 virtual ~Map() {}
125
126 // ---- std::map interface
127
128 // -- iterators
129
130 inline iterator begin() { return m_map.begin(); }
131 inline iterator end() { return m_map.end(); }
132
133 inline const_iterator begin() const { return m_map.begin(); }
134 inline const_iterator end() const { return m_map.end(); }
135
136 // inline reverse_iterator rbegin() { return m_map.rbegin(); }
137 // inline reverse_iterator rend() { return m_map.rend(); }
138
139 // inline const_reverse_iterator rbegin() const { return m_map.rbegin(); }
140 // inline const_reverse_iterator rend() const { return m_map.rend(); }
141
142 // -- subscription
143
144 inline mapped_type &operator[] (const key_type &key) { return m_map[key]; }
145
146 // -- map operations
147
148 inline iterator find(const key_type &key) { return m_map.find(key); }
149 inline const_iterator find(const key_type &key) const { return m_map.find(key); }
150
151 inline size_type count(const key_type &key) const { return m_map.count(key); }
152
153 inline iterator lower_bound(const key_type &key) { return m_map.lower_bound(key); }
154 inline const_iterator lower_bound(const key_type &key) const { return m_map.lower_bound(key); }
155 inline iterator upper_bound(const key_type &key) { return m_map.upper_bound(key); }
156 inline const_iterator upper_bound(const key_type &key) const { return m_map.upper_bound(key); }
157
158 inline std::pair<iterator,iterator> equal_range(const key_type &key)
159 { return m_map.equal_range(key); }
160 inline std::pair<const_iterator,const_iterator> equal_range(const key_type &key) const
161 { return m_map.equal_range(key); }
162
163 // -- list operations
164
165 inline std::pair<iterator,bool> insert(const value_type &val) { return m_map.insert(val); }
166 inline std::pair<iterator,bool> insert
167 ( const key_type & key ,
168 const mapped_type & val ) { return insert ( value_type ( key , val ) ) ; }
169 template <typename In>
170 inline void insert(In first, In last) { m_map.insert(first,last); }
171 inline iterator insert( iterator /* pos */ , const value_type &val)
172 { return m_map.insert( /* pos, */ val ).first ; }
173 inline void erase(iterator pos) { m_map.erase(pos); }
174 inline size_type erase(const key_type &key) { return m_map.erase(key); }
175 inline void erase(iterator first, iterator last) { m_map.erase(first,last); }
176 inline void clear() { m_map.clear(); }
177
178 // -- container operations
179
180 inline size_type size() const { return m_map.size(); }
181 inline size_type max_size() const { return m_map.max_size(); }
182 inline bool empty() const { return size() == 0; }
183 inline void swap(map_type& other) { m_map.swap(other); }
184
185 // ---- extra functionalities
186
209 inline const result_type &operator() ( const argument_type &key ) const
210 {
211 // static const result_type s_null_value;
212 const_iterator it = m_map.find(key);
213 if ( it != m_map.end() ) { return it->second ; }
215 return s_null_value; // return the default value
216 }
217 // ========================================================================
240 inline const mapped_type &operator[] ( const key_type &key ) const
241 { return (*this)(key); }
242 // ========================================================================
248 inline const result_type & at ( const argument_type &key ) const
249 {
250 const_iterator it = m_map.find ( key ) ;
251 if ( it == m_map.end() ) { this->throw_out_of_range_exception () ; }
252 return it->second ;
253 }
254 // ========================================================================
256 inline Map& merge ( const map_type& other )
257 {
258 for ( typename map_type::const_iterator it = other.begin() ;
259 other.end() != it ; ++it ) { (*this)[it->first] = it->second ; }
260 return *this;
261 }
263 inline Map& merge ( const Map& other )
264 {
265 for ( const_iterator it = other.begin() ;
266 other.end() != it ; ++it ) { (*this)[it->first] = it->second ; }
267 return *this;
268 }
270 template <class K1,class K2, class K3>
271 inline Map& merge ( const Map<K1,K2,K3>& other )
272 {
273 for ( typename Map<K1,K2,K3>::const_iterator it = other.begin() ;
274 other.end() != it ; ++it ) { (*this)[it->first] = it->second ; }
275 return *this;
276 }
277 // update the key
278 void update
279 ( const key_type& key ,
280 const mapped_type& mapped ) { (*this)[ key ] = mapped ; }
281 // ========================================================================
282 public:
283 // ========================================================================
285 inline operator map_type &() { return m_map ; }
286 inline operator const map_type &() const { return m_map ; }
287 // ========================================================================
288 public:
289 // ========================================================================
295 const key_type& key_at ( const size_type index ) const
296 {
297 if ( index >= size() )
298 { this->throw_out_of_range_exception () ; }
299 const_iterator it = this->begin() ;
300 std::advance ( it , index ) ;
301 return it -> first ;
302 }
308 const mapped_type& value_at ( const size_type index ) const
309 {
310 if ( index >= size() )
311 { this->throw_out_of_range_exception () ; }
312 const_iterator it = this->begin() ;
313 std::advance ( it , index ) ;
314 return it -> second ;
315 }
316 // ========================================================================
317 };
318 // ==========================================================================
319 template <typename K, typename T, typename M>
320 const typename Map<K,T,M>::result_type Map<K,T,M>::s_null_value = typename Map<K,T,M>::result_type();
321 // ==========================================================================
322 } // end of GaudiUtils namespace
323 // ============================================================================
324
325 // ============================================================================
326 // The END
327 // ============================================================================
328 #endif // GAUDIKERNEL_MAP_H
329 // ============================================================================