00001
00002
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
00013
00014
00015
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
00061 QNameOrderedMap&
00062 operator=(const QNameOrderedMap&);
00063
00064 QNameOrderedMap(const QNameOrderedMap&);
00065 };
00066 }
00067
00068
00069
00070 template <class T>
00071 IT_Bus::QNameOrderedMap<T>::QNameOrderedMap()
00072 {
00073
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