Gaudi Framework, version v24r2

Home   Generated: Wed Dec 4 2013
 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;
95 
96  typedef typename map_type::size_type size_type;
97 
98  typedef typename map_type::iterator 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  // ========================================================================
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 
159  { return m_map.equal_range(key); }
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); }
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 // ============================================================================

Generated at Wed Dec 4 2013 14:33:09 for Gaudi Framework, version v24r2 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004