00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <map>
00034 #include "mdeque.h"
00035 #include "mpair.h"
00036 #include "CollectionSerializers.h"
00037 #include "RandomUtil.h"
00038 #include "mace_constants.h"
00039 #include "StrUtil.h"
00040
00046 #ifndef _MACE_MULTIMAP_H
00047 #define _MACE_MULTIMAP_H
00048
00049 namespace mace {
00050
00056
00057
00061 template<class Key, class Data, class Serial = SerializeMap<Key, Data>, class Compare = std::less<Key>, class Alloc = std::allocator<std::pair<const Key, Data> > >
00062 class multimap : public std::multimap<Key, Data, Compare, Alloc>, public virtual Serial, public PrintPrintable {
00063
00064 BOOST_CLASS_REQUIRE2(Serial, Serializer, boost, ConvertibleConcept);
00065
00066 public:
00067 typedef typename std::multimap<Key, Data, Compare, Alloc> baseType;
00068 typedef typename baseType::iterator iterator;
00069 typedef typename baseType::const_iterator const_iterator;
00070 typedef typename baseType::size_type size_type;
00071 typedef typename baseType::key_compare key_compare;
00072
00073 multimap() : baseType() {
00074 }
00075
00076 multimap(const key_compare& comp) : baseType(comp) {
00077 }
00078
00079 virtual ~multimap() { }
00080
00082 void clear() {
00083 baseType::clear();
00084 }
00085
00087 size_t size() const {
00088 return baseType::size();
00089 }
00090
00092 bool containsKey(const Key& k) const {
00093 return find(k) != this->end();
00094 }
00095
00097 deque<Data> get(const Key& k) const {
00098 deque<Data> l;
00099 for (const_iterator i = find(k); i != this->end() && i->first == k; i++) {
00100 l.push_back(i->second);
00101 }
00102 return l;
00103 }
00104
00106 const_iterator random() const {
00107 if(this->size()==0) { return this->end(); }
00108 int rand = RandomUtil::randInt(this->size());
00109 const_iterator i;
00110 int position;
00111 for(i = this->begin(), position=0; i != this->end() && position < rand; i++, position++);
00112 return i;
00113 }
00114
00116 const std::string& getTypeName() const {
00117 const char* types[] = { "Key", "Data", "Compare", "Alloc", 0 };
00118 static const StrUtilNamespace::StdStringList myTypes = StrUtilNamespace::getTypeFromTemplate(__PRETTY_FUNCTION__, types);
00119 static string ret = myTypes[0]+"->"+myTypes[1];
00120 return ret;
00121 }
00122
00123 void print(std::ostream& out) const {
00124 if(mace::PRINT_TYPE_NAMES) {
00125 out << "mace::MultiMap<" << getTypeName() << ">";
00126 }
00127 mace::printMap(out, this->begin(), this->end());
00128 }
00129 void printState(std::ostream& out) const {
00130 if(mace::PRINT_TYPE_NAMES) {
00131 out << "mace::MultiMap<" << getTypeName() << ">";
00132 }
00133 mace::printMapState(out, this->begin(), this->end());
00134 }
00135
00136 private:
00137 class v_const_iterator : public _SerializeMap<Key, Data>::const_iterator {
00138 private:
00139 const_iterator i;
00140 const_iterator end;
00141
00142 public:
00143 bool isValid() {
00144 return i != end;
00145 }
00146 void next() {
00147 ASSERT(i != end);
00148 i++;
00149 }
00150 const Key& getKey() {
00151 return i->first;
00152 }
00153 const Data& getValue() {
00154 return i->second;
00155 }
00156
00157 v_const_iterator(const_iterator beg, const_iterator end) : i(beg), end(end) {}
00158 ~v_const_iterator() {}
00159 };
00160
00161 protected:
00162 typename _SerializeMap<Key, Data>::const_iterator* getIterator() const {
00163 return new v_const_iterator(this->begin(), this->end());
00164 }
00165 Data& insertKey(const Key& k) {
00166 iterator i = insert(std::pair<Key, Data>(k, Data()));
00167 return i->second;
00168 }
00169
00170 };
00171
00174 }
00175 #endif // _MACE_MULTIMAP_H