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