00001 #ifndef _BASE_MAP_H
00002 #define _BASE_MAP_H
00003
00004 #include <boost/shared_ptr.hpp>
00005 #include "Printable.h"
00006
00018 namespace mace {
00019
00025
00026 template<class Key, class Data>
00027 class Map : public virtual Printable {
00028
00029 public:
00041 class ScopedStorage {
00042 friend class Map<Key, Data>;
00043 public:
00044 ScopedStorage(Map<Key, Data>* m, const Key& k) :
00045 map(m), key(k), data(new Data()), hasData(false) {
00046
00047 hasData = map->get(key, *data);
00048 }
00049 virtual ~ScopedStorage() {
00050 map->put(key, *data);
00051 delete data;
00052 }
00053 Data& operator*() {
00054 return *data;
00055 }
00056 Data* operator->() {
00057 return data;
00058 }
00059 bool found() const {
00060 return hasData;
00061 }
00062
00063 protected:
00064 Map<Key, Data>* map;
00065 Key key;
00066 Data* data;
00067 bool hasData;
00068 };
00069
00072 public:
00073 typedef std::pair<Key, Data> ipair;
00074 typedef std::pair<const Key, Data> const_key_ipair;
00075
00076 public:
00077 class inner_iterator {
00078 friend class Map<Key, Data>::const_iterator;
00079 protected:
00080 virtual const const_key_ipair* arrow() const = 0;
00081 virtual const const_key_ipair& star() const = 0;
00082 virtual void next() const = 0;
00083 virtual bool equals(const inner_iterator& right) const = 0;
00084 virtual void assign(const inner_iterator& other) = 0;
00085 virtual inner_iterator* clone() const = 0;
00086 virtual void erase() = 0;
00087 public:
00088 virtual ~inner_iterator() { }
00089 };
00090
00091 class const_iterator {
00092 public:
00093 typedef boost::shared_ptr<inner_iterator> IteratorPtr;
00094
00095 private:
00096 IteratorPtr inner;
00097
00098 public:
00099 const_iterator() { }
00100 const_iterator(IteratorPtr i) : inner(i) { }
00101 const_iterator(const const_iterator& other) : inner(other.inner) { }
00102 const const_key_ipair* operator->() const {
00103 return inner->arrow();
00104 }
00105 const const_key_ipair& operator*() const {
00106 return inner->star();
00107 }
00108 const const_iterator& operator++() const {
00109 inner->next();
00110 return *this;
00111 }
00112 const const_iterator& operator++(int _i) const {
00113 inner->next();
00114 return *this;
00115 }
00116 bool operator==(const const_iterator& right) const {
00117 return inner->equals(*(right.inner));
00118 }
00119 bool operator!=(const const_iterator& right) const {
00120 return !inner->equals(*(right.inner));
00121 }
00122 const_iterator& operator=(const const_iterator& other) {
00123 if (inner == NULL) {
00124 inner = IteratorPtr(other.inner->clone());
00125 }
00126 else {
00127 inner->assign(*(other.inner));
00128 }
00129 return *this;
00130 }
00131 const_iterator& erase() {
00132 inner->erase();
00133 return *this;
00134 }
00135 };
00136
00137 public:
00138 virtual ~Map() { }
00139 virtual bool get(const Key& kt, Data& d) const = 0;
00140 virtual bool containsKey(const Key& kt) const = 0;
00141 virtual void put(const Key& kt, const Data& d) = 0;
00142 virtual size_t erase(const Key& kt) = 0;
00143 virtual bool empty() const = 0;
00144 virtual size_t size() const = 0;
00145 virtual void sync() = 0;
00146 virtual void close() = 0;
00147 virtual const_iterator erase(const_iterator i) = 0;
00148 virtual const_iterator begin() const = 0;
00149 virtual const_iterator end() const = 0;
00150 virtual const_iterator find(const Key& kt) const = 0;
00151 virtual const_iterator lower_bound(const Key& kt) const = 0;
00152 virtual void clear() = 0;
00153 virtual bool equals(const Map& other) const = 0;
00154 virtual Map<Key, Data>& assign(const Map<Key, Data>& other) = 0;
00155 bool operator==(const Map<Key, Data>& other) const {
00156 return this->equals(other);
00157 }
00158 bool operator!=(const Map<Key, Data>& other) const {
00159 return !this->equals(other);
00160 }
00161 Map<Key, Data>& operator=(const Map<Key, Data>& other) {
00162 return this->assign(other);
00163 }
00164 virtual void copy(const Map<Key, Data>& other) {
00165 clear();
00166 add(other);
00167 }
00168 virtual void add(const Map<Key, Data>& other) {
00169 for (const_iterator i = other.begin(); i != other.end(); i++) {
00170 put(i->first, i->second);
00171 }
00172 }
00173
00174 };
00175
00178 }
00179
00180 #endif // _BASE_MAP_H