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