00001 #ifndef PMMAP_H
00002 #define PMMAP_H
00003
00004 #include <Structs/Arrays/packedMemoryArray.h>
00005
00006 template <typename KeyType, typename DataType>
00007 class PMMapItem;
00008
00018 template <typename KeyType, typename DataType>
00019 class PMMap
00020 {
00021 public:
00022 typedef PMMapItem<KeyType,DataType> MapItem;
00023 typedef typename PackedMemoryArray<MapItem>::Iterator Iterator;
00024 typedef typename PackedMemoryArray<MapItem>::SizeType SizeType;
00025
00026 PMMap()
00027 {
00028 }
00029
00030 Iterator begin()
00031 {
00032 return m_pool.begin();
00033 }
00034
00035 void clear()
00036 {
00037 m_pool.clear();
00038 }
00039
00040 Iterator end()
00041 {
00042 return m_pool.end();
00043 }
00044
00045 void erase( const Iterator& it)
00046 {
00047 m_pool.erase(it);
00048 }
00049
00050 Iterator find( const KeyType& key)
00051 {
00052 MapItem item(key,DataType());
00053 return m_pool.find( item);
00054 }
00055
00056 DataType& operator[]( const KeyType& key)
00057 {
00058 Iterator it = find(key);
00059 if( it == m_pool.end())
00060 {
00061 it = unmanagedInsert( MapItem(key, DataType()));
00062 }
00063 return it->m_data;
00064 }
00065
00066 SizeType size()
00067 {
00068 return m_pool.size();
00069 }
00070
00071 private:
00072 PackedMemoryArray<MapItem> m_pool;
00073
00074 Iterator unmanagedInsert( const MapItem& newItem)
00075 {
00076 Iterator it = m_pool.lower_bound(newItem);
00077 return m_pool.insert( it, newItem);
00078 }
00079 };
00080
00081
00082 template <typename KeyType, typename DataType>
00083 class PMMapItem
00084 {
00085 public:
00086
00087 PMMapItem( unsigned int init = 0):m_key(),m_data(0)
00088 {
00089 }
00090
00091 PMMapItem( const KeyType& key, const DataType& data):m_key(key),m_data(data)
00092 {
00093 }
00094
00095 bool operator < ( const PMMapItem& other) const
00096 {
00097 return m_key < other.m_key;
00098 }
00099
00100 bool operator > ( const PMMapItem& other) const
00101 {
00102 return m_key > other.m_key;
00103 }
00104
00105 bool operator == ( const PMMapItem& other) const
00106 {
00107 return (m_key == other.m_key);
00108 }
00109
00110 bool operator != ( const PMMapItem& other) const
00111 {
00112 return (m_key != other.m_key);
00113 }
00114
00115 KeyType m_key;
00116 DataType m_data;
00117 };
00118
00119
00120
00121 #endif //PMMAP_H