it_bus_pdk/qname_ordered_map.h

00001 //
00002 //  @Copyright (c) 2003 IONA Technologies PLC. All Rights Reserved.
00003 //
00004 
00005 #ifndef _QNAME_ORDERED_MAP_H_
00006 #define _QNAME_ORDERED_MAP_H_
00007 
00008 #include <it_bus/types.h>
00009 #include <it_dsa/vector.h>
00010 #include <it_bus/qname.h>
00011 
00012 // This class can be used to maintain an ordered mapping of QNames to
00013 // other objects, while still maintaining hash-based performance for
00014 // insertions. The mapping order is based on the order of insertions 
00015 // into the map.
00016 
00017 namespace IT_Bus
00018 {
00019     template <class T>
00020     class QNameOrderedMap
00021     {
00022       public:
00023 
00024         typedef IT_Vector<T>    ValueSet;       
00025         typedef QNameHashMap<T> QNameTable;
00026 
00027         QNameOrderedMap();
00028         ~QNameOrderedMap();
00029 
00030         IT_TYPENAME QNameTable::const_iterator 
00031         get(
00032             const QName& q
00033         ) const;
00034 
00035         void 
00036         put(
00037             const QName& q, 
00038             const T obj
00039         );
00040         
00041         void 
00042         remove(
00043             const QName& q
00044         );      
00045 
00046         ValueSet
00047         get_values() const;
00048 
00049         size_t
00050         get_size() const;               
00051 
00052         IT_TYPENAME QNameTable::const_iterator
00053         end() const;
00054 
00055       private:                  
00056 
00057         QNameTable m_map;
00058         IT_Vector<IT_TYPENAME QNameTable::iterator> m_ordering;
00059 
00060         // Not implemented:
00061         QNameOrderedMap&
00062         operator=(const QNameOrderedMap&);
00063 
00064         QNameOrderedMap(const QNameOrderedMap&);
00065     };
00066 }
00067 
00068 // Inline functions
00069 
00070 template <class T>
00071 IT_Bus::QNameOrderedMap<T>::QNameOrderedMap()
00072 {
00073     // complete
00074 }
00075 
00076 template <class T>
00077 IT_Bus::QNameOrderedMap<T>::~QNameOrderedMap()
00078 {
00079     IT_TYPENAME QNameTable::iterator iter = m_map.begin();    
00080 
00081     while (iter != m_map.end())
00082     {
00083         m_map.erase(iter++);
00084     }
00085 }
00086 
00087 template <class T>
00088 IT_TYPENAME IT_Bus::QNameOrderedMap<T>::QNameTable::const_iterator
00089 IT_Bus::QNameOrderedMap<T>::get(
00090     const QName& q
00091 ) const
00092 {
00093     IT_TYPENAME QNameTable::const_iterator i = m_map.find(q);    
00094     return i;
00095 }
00096 
00097 template <class T>
00098 void
00099 IT_Bus::QNameOrderedMap<T>::put(
00100     const QName& q,
00101     const T obj
00102 )
00103 {
00104     m_map[q] = obj;
00105     m_ordering.push_back(m_map.find(q));
00106 }
00107 
00108 template <class T>
00109 void
00110 IT_Bus::QNameOrderedMap<T>::remove(
00111     const QName& q
00112 )
00113 {
00114     IT_TYPENAME QNameTable::iterator i = m_map.find(q);
00115 
00116     IT_TYPENAME IT_Vector<IT_TYPENAME QNameTable::iterator>::iterator k =
00117         m_ordering.begin();
00118     for ( ; k != m_ordering.end(); ++k)
00119     {
00120         if (*k == i)
00121         {
00122             m_ordering.erase(k);            
00123         }
00124     }
00125     m_map.erase(i);
00126 }
00127 
00128 template <class T>
00129 IT_Vector<T>
00130 IT_Bus::QNameOrderedMap<T>::get_values() const
00131 {
00132     ValueSet values;
00133 
00134     IT_TYPENAME IT_Vector<IT_TYPENAME QNameTable::iterator>::const_iterator k =
00135         m_ordering.begin();
00136 
00137     for ( ; k != m_ordering.end(); ++k)
00138     {
00139         values.push_back((*(*k)).second);
00140     }
00141     return values;
00142 }
00143 
00144 template <class T>
00145 size_t
00146 IT_Bus::QNameOrderedMap<T>::get_size() const
00147 {
00148     return m_map.size();
00149 }
00150 
00151 template <class T>
00152 IT_TYPENAME IT_Bus::QNameOrderedMap<T>::QNameTable::const_iterator
00153 IT_Bus::QNameOrderedMap<T>::end() const
00154 {
00155     return m_map.end();
00156 }
00157 
00158 #endif 

Generated on Thu Sep 7 11:39:36 2006 for Artix by  doxygen 1.4.7