Gaudi Framework, version v23r2

Home   Generated: Thu Jun 28 2012

Map.h

Go to the documentation of this file.
00001 #ifndef GAUDIKERNEL_MAP_H
00002 #define GAUDIKERNEL_MAP_H 1
00003 // ============================================================================
00004 // Include files
00005 // ============================================================================
00006 // STD & STL
00007 // ============================================================================
00008 #include <map>
00009 // ============================================================================
00010 // GaudiKernel
00011 // ============================================================================
00012 #include "GaudiKernel/MapBase.h"
00013 // ============================================================================
00014 namespace GaudiUtils
00015 {
00016   // ==========================================================================
00081   template <typename K, typename T, typename M = std::map<K,T> >
00082   class Map : public Gaudi::Utils::MapBase
00083   {
00084   public:
00085     // ========================================================================
00086     // ---- types
00087     typedef M                      map_type;
00088     typedef K                      key_type;
00089     typedef T                      mapped_type;
00090 
00091     // -- from unary_function
00092     typedef K                      argument_type;
00093     typedef T                      result_type;
00094     typedef std::pair<const K,T>   value_type;
00095 
00096     typedef typename map_type::size_type size_type;
00097 
00098     typedef typename map_type::iterator iterator;
00099     typedef typename map_type::const_iterator const_iterator;
00100     // typedef typename map_type::reverse_iterator reverse_iterator;
00101     // typedef typename map_type::const_reverse_iterator const_reverse_iterator;
00102     // ========================================================================
00103   protected:
00104     // ========================================================================
00105     map_type m_map;
00106     static const result_type s_null_value;
00107     // ========================================================================
00108   public:
00109     // ---- Constructors
00110 
00112     Map(): m_map() {}
00113 
00115     Map(const map_type& other): m_map(other) {}
00116 
00117     // /// Copy Constructor
00118     // Map(const Map& other): m_map(other.m_map) {}
00120     template <typename In>
00121     Map(In first, In last): m_map(first,last) {}
00122 
00124     virtual ~Map() {}
00125 
00126     // ---- std::map interface
00127 
00128     //    -- iterators
00129 
00130     inline iterator begin() { return m_map.begin(); }
00131     inline iterator end()   { return m_map.end(); }
00132 
00133     inline const_iterator begin() const { return m_map.begin(); }
00134     inline const_iterator end()   const { return m_map.end(); }
00135 
00136     // inline reverse_iterator rbegin() { return m_map.rbegin(); }
00137     // inline reverse_iterator rend()   { return m_map.rend(); }
00138 
00139     // inline const_reverse_iterator rbegin() const { return m_map.rbegin(); }
00140     // inline const_reverse_iterator rend()   const { return m_map.rend(); }
00141 
00142     //    -- subscription
00143 
00144     inline mapped_type &operator[] (const key_type &key) { return m_map[key]; }
00145 
00146     //    -- map operations
00147 
00148     inline iterator find(const key_type &key) { return m_map.find(key); }
00149     inline const_iterator find(const key_type &key) const { return m_map.find(key); }
00150 
00151     inline size_type count(const key_type &key) const { return m_map.count(key); }
00152 
00153     inline iterator lower_bound(const key_type &key) { return m_map.lower_bound(key); }
00154     inline const_iterator lower_bound(const key_type &key) const { return m_map.lower_bound(key); }
00155     inline iterator upper_bound(const key_type &key) { return m_map.upper_bound(key); }
00156     inline const_iterator upper_bound(const key_type &key) const { return m_map.upper_bound(key); }
00157 
00158     inline std::pair<iterator,iterator> equal_range(const key_type &key)
00159     { return m_map.equal_range(key); }
00160     inline std::pair<const_iterator,const_iterator> equal_range(const key_type &key) const
00161     { return m_map.equal_range(key); }
00162 
00163     //    -- list operations
00164 
00165     inline std::pair<iterator,bool> insert(const value_type &val) { return m_map.insert(val); }
00166     inline std::pair<iterator,bool> insert
00167     ( const key_type    & key ,
00168       const mapped_type & val ) { return insert ( value_type ( key , val ) ) ; }
00169     template <typename In>
00170     inline void insert(In first, In last) { m_map.insert(first,last); }
00171     inline iterator insert( iterator /* pos */ , const value_type &val)
00172     { return m_map.insert( /* pos, */ val ).first ; }
00173     inline void erase(iterator pos) { m_map.erase(pos); }
00174     inline size_type erase(const key_type &key) { return m_map.erase(key); }
00175     inline void erase(iterator first, iterator last) { m_map.erase(first,last); }
00176     inline void clear() { m_map.clear(); }
00177 
00178     //    -- container operations
00179 
00180     inline size_type size() const { return m_map.size(); }
00181     inline size_type max_size() const { return m_map.max_size(); }
00182     inline bool empty() const { return size() == 0; }
00183     inline void swap(map_type& other) { m_map.swap(other); }
00184 
00185     // ---- extra functionalities
00186 
00209     inline const result_type &operator() ( const argument_type &key ) const
00210     {
00211       // static const result_type s_null_value;
00212       const_iterator it = m_map.find(key);
00213       if ( it != m_map.end() ) { return it->second ; }
00215       return s_null_value;  // return the default value
00216     }
00217     // ========================================================================
00240     inline const mapped_type &operator[] ( const key_type &key ) const
00241     { return (*this)(key); }
00242     // ========================================================================
00248     inline const result_type & at ( const argument_type &key ) const
00249     {
00250       const_iterator it = m_map.find ( key ) ;
00251       if ( it == m_map.end() ) { this->throw_out_of_range_exception () ; }
00252       return it->second ;
00253     }
00254     // ========================================================================
00256     inline Map& merge ( const map_type& other )
00257     {
00258       for ( typename map_type::const_iterator it = other.begin() ;
00259             other.end() != it ; ++it ) { (*this)[it->first] = it->second ; }
00260       return *this;
00261     }
00263     inline Map& merge ( const Map& other )
00264     {
00265       for ( const_iterator it = other.begin() ;
00266             other.end() != it ; ++it ) { (*this)[it->first] = it->second ; }
00267       return *this;
00268     }
00270     template <class K1,class K2, class K3>
00271     inline Map& merge ( const Map<K1,K2,K3>& other )
00272     {
00273       for ( typename Map<K1,K2,K3>::const_iterator it = other.begin() ;
00274             other.end() != it ; ++it ) { (*this)[it->first] = it->second ; }
00275       return *this;
00276     }
00277     // update the key
00278     void update
00279     ( const key_type&    key    ,
00280       const mapped_type& mapped ) { (*this)[ key ] = mapped ; }
00281     // ========================================================================
00282   public:
00283     // ========================================================================
00285     inline operator       map_type &()       { return m_map ; }
00286     inline operator const map_type &() const { return m_map ; }
00287     // ========================================================================
00288   public:
00289     // ========================================================================
00295     const key_type&    key_at   ( const size_type index ) const
00296     {
00297       if ( index >= size() )
00298       { this->throw_out_of_range_exception () ; }
00299       const_iterator it = this->begin() ;
00300       std::advance ( it , index ) ;
00301       return it -> first ;
00302     }
00308     const mapped_type& value_at ( const size_type index ) const
00309     {
00310       if ( index >= size() )
00311       { this->throw_out_of_range_exception () ; }
00312       const_iterator it = this->begin() ;
00313       std::advance ( it , index ) ;
00314       return it -> second ;
00315     }
00316     // ========================================================================
00317   };
00318   // ==========================================================================
00319   template <typename K, typename T, typename M>
00320   const typename Map<K,T,M>::result_type Map<K,T,M>::s_null_value = typename Map<K,T,M>::result_type();
00321   // ==========================================================================
00322 } //                                                end of GaudiUtils namespace
00323 // ============================================================================
00324 
00325 // ============================================================================
00326 // The END
00327 // ============================================================================
00328 #endif // GAUDIKERNEL_MAP_H
00329 // ============================================================================
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Thu Jun 28 2012 23:27:21 for Gaudi Framework, version v23r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004