00001
00002 #ifndef INCLUDED_plistCollections_h_
00003 #define INCLUDED_plistCollections_h_
00004
00005 #include "plistPrimitives.h"
00006 #include <map>
00007 #include <vector>
00008 #include <set>
00009
00010 namespace plist {
00011
00012
00013 class Collection : public ObjectBase {
00014 public:
00015
00016 virtual void addCollectionListener(CollectionListener* l);
00017
00018 virtual void removeCollectionListener(CollectionListener* l);
00019
00020 virtual bool isCollectionListener(CollectionListener* l);
00021
00022
00023 virtual void setEntry(const std::string& name, ObjectBase& val, bool warnExists=false)=0;
00024
00025 virtual void addEntry(const std::string& name, ObjectBase& val, const std::string& comment="")=0;
00026
00027 virtual void setEntry(const std::string& name, ObjectBase* val, bool warnExists=false)=0;
00028
00029 virtual void addEntry(const std::string& name, ObjectBase* val, const std::string& comment="")=0;
00030
00031
00032 virtual void removeEntry(const std::string& name)=0;
00033
00034 virtual ObjectBase* getEntry(const std::string& name) const=0;
00035
00036 virtual ObjectBase* operator[](const std::string& name) const { return getEntry(name); }
00037
00038 virtual void clear()=0;
00039
00040
00041 virtual void setComment(const std::string& name, const std::string& comment)=0;
00042
00043 virtual const std::string& getComment(const std::string& name) const=0;
00044
00045 void setUnusedWarning(bool b) { warnUnused=b; }
00046 bool getUnusedWarning() { return warnUnused; }
00047
00048 virtual bool getTrimExtraLoad() const { return trimExtraLoad; }
00049 virtual bool getTrimExtraSave() const { return trimExtraSave; }
00050 virtual void setTrimExtra(bool trim) { trimExtraLoad=trimExtraSave=trim; }
00051 virtual void setTrimExtra(bool trimLoad, bool trimSave) { trimExtraLoad=trimLoad; trimExtraSave=trimSave; }
00052
00053 protected:
00054
00055 explicit Collection(bool bl, bool bs) : ObjectBase(), collectionListeners(), warnUnused(true), trimExtraLoad(bl), trimExtraSave(bs) {autoFormat=false;}
00056
00057 Collection(const Collection& d) : ObjectBase(d), collectionListeners(), warnUnused(d.warnUnused), trimExtraLoad(d.trimExtraLoad), trimExtraSave(d.trimExtraSave) {autoFormat=false;}
00058
00059 Collection& operator=(const Collection& d) { if(&d==this) return *this; ObjectBase::operator=(d); return *this; }
00060
00061 ~Collection();
00062
00063
00064 virtual void fireEntryAdded(ObjectBase& val);
00065
00066 virtual void fireEntryRemoved(ObjectBase& val);
00067
00068 virtual void fireEntriesChanged();
00069
00070 std::list<CollectionListener*>* collectionListeners;
00071
00072
00073 virtual unsigned int getLongestKeyLen() const=0;
00074
00075 static unsigned int getLongestKeyLenOther(const Collection& c) { return c.getLongestKeyLen(); }
00076
00077
00078 bool warnUnused;
00079
00080 bool trimExtraLoad;
00081
00082 bool trimExtraSave;
00083
00084
00085
00086 static const std::string& Collection::emptyStr() {
00087 static std::string mt;
00088 return mt;
00089 }
00090
00091
00092 static const std::string& Collection::subCollectionSep() {
00093 static std::string sep=".";
00094 return sep;
00095 }
00096 };
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 class Dictionary : public Collection {
00116 friend std::ostream& operator<<(std::ostream& os, const Dictionary& d);
00117 public:
00118
00119 typedef std::map<std::string,ObjectBase*> storage_t;
00120
00121 typedef storage_t::iterator iterator;
00122
00123 typedef storage_t::const_iterator const_iterator;
00124
00125
00126 Dictionary() : Collection(false,false), dict(), myRef(), comments() {}
00127
00128 explicit Dictionary(bool growable) : Collection(growable,growable), dict(), myRef(), comments() {}
00129
00130 Dictionary(const Dictionary& d) : Collection(d), dict(d.dict), myRef(d.myRef), comments(d.comments) { cloneMyRef(); }
00131
00132 Dictionary& operator=(const Dictionary& d) { if(&d==this) return *this; clear(); Collection::operator=(d); dict=d.dict; myRef=d.myRef; comments=d.comments; cloneMyRef(); fireEntriesChanged(); return *this; }
00133
00134 ~Dictionary() { clear(); }
00135
00136
00137 template<typename T>
00138 void setValue(const std::string& name, const T& val, bool warnExists=false) { setEntry(name,new Primitive<T>(val),warnExists); }
00139
00140 template<typename T>
00141 void addValue(const std::string& name, const T& val, const std::string& comment="", bool warnExists=true) { addEntry(name,new Primitive<T>(val),comment,warnExists); }
00142
00143 virtual void setValue(const std::string& name, const char val[], bool warnExists=false) { setEntry(name,new Primitive<std::string>(val),warnExists); }
00144
00145 virtual void addValue(const std::string& name, const char val[], const std::string& comment="") { addEntry(name,new Primitive<std::string>(val),comment,true); }
00146
00147 virtual void addValue(const std::string& name, const char val[], const std::string& comment, bool warnExists) { addEntry(name,new Primitive<std::string>(val),comment,warnExists); }
00148
00149
00150 virtual void setEntry(const std::string& name, ObjectBase& val, bool warnExists=false);
00151
00152 virtual void addEntry(const std::string& name, ObjectBase& val, const std::string& comment="") { addEntry(name,val,comment,true); }
00153
00154 virtual void addEntry(const std::string& name, ObjectBase& val, const std::string& comment, bool warnExists);
00155 virtual void setEntry(const std::string& name, ObjectBase* val, bool warnExists=false);
00156 virtual void addEntry(const std::string& name, ObjectBase* val, const std::string& comment="") { addEntry(name,val,comment,true); }
00157
00158 virtual void addEntry(const std::string& name, ObjectBase* val, const std::string& comment, bool warnExists);
00159
00160
00161 virtual void removeEntry(const std::string& name);
00162
00163 virtual ObjectBase* getEntry(const std::string& name) const;
00164
00165 virtual void clear();
00166
00167
00168 const_iterator begin() const { return dict.begin(); }
00169
00170 const_iterator end() const { return dict.end(); }
00171
00172 size_t size() const { return dict.size(); }
00173
00174
00175 void setComment(const std::string& name, const std::string& comment);
00176
00177 const std::string& getComment(const std::string& name) const;
00178
00179 virtual void loadXML(xmlNode* node);
00180 virtual void saveXML(xmlNode* node) const;
00181
00182 virtual std::string toString() const;
00183
00184
00185 PLIST_CLONE_DEF(Dictionary,new Dictionary(*this));
00186
00187 protected:
00188 virtual void fireEntryRemoved(ObjectBase& val);
00189
00190
00191 virtual void takeObject(const std::string& name, ObjectBase* obj);
00192
00193
00194 virtual bool loadXMLNode(const std::string& key, xmlNode* val, const std::string& comment);
00195
00196 virtual unsigned int getLongestKeyLen() const;
00197
00198
00199
00200
00201
00202 iterator getSubEntry(const std::string& name, std::string::size_type& seppos);
00203
00204
00205
00206
00207 const_iterator getSubEntry(const std::string& name, std::string::size_type& seppos) const;
00208
00209
00210 virtual void cloneMyRef();
00211
00212
00213 storage_t dict;
00214
00215
00216 std::set<ObjectBase*> myRef;
00217
00218
00219 typedef std::map<std::string,std::string> comments_t;
00220
00221
00222 comments_t comments;
00223 };
00224
00225 std::ostream& operator<<(std::ostream& os, const Dictionary& d);
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237 class Array : public Collection {
00238 friend std::ostream& operator<<(std::ostream& os, const Array& d);
00239 public:
00240
00241 typedef std::vector<ObjectBase*> storage_t;
00242
00243 typedef storage_t::iterator iterator;
00244
00245 typedef storage_t::const_iterator const_iterator;
00246
00247
00248 Array() : Collection(false,false), arr(), myRef(), comments() {}
00249
00250 explicit Array(bool growable) : Collection(growable,growable), arr(), myRef(), comments() {}
00251
00252 Array(const Array& d) : Collection(d), arr(d.arr), myRef(d.myRef), comments(d.comments) { cloneMyRef(); }
00253
00254 Array& operator=(const Array& d) { if(&d==this) return *this; clear(); Collection::operator=(d); arr=d.arr; myRef=d.myRef; comments=d.comments; cloneMyRef(); return *this; }
00255
00256 ~Array() { clear(); }
00257
00258
00259 template<typename T>
00260 void addValue(const T& val, const std::string& comment="") { addEntry(new Primitive<T>(val),comment); }
00261
00262 virtual void addValue(const char val[], const std::string& comment="") { if(comment.size()>0) setComment(size(),comment); arr.push_back(new Primitive<std::string>(val)); takeObject(size()-1,arr.back()); fireEntryAdded(*arr.back()); }
00263
00264
00265 virtual void addEntry(ObjectBase& val, const std::string& comment="") { if(comment.size()>0) setComment(size(),comment); arr.push_back(&val); fireEntryAdded(*arr.back()); }
00266
00267 virtual void addEntry(ObjectBase* val, const std::string& comment="") { if(comment.size()>0) setComment(size(),comment); arr.push_back(val); takeObject(size()-1,val); fireEntryAdded(*arr.back()); }
00268
00269
00270 template<typename T>
00271 void setValue(size_t index, const T& val, bool warnExists=false) { setEntry(index,new Primitive<T>(val),warnExists); }
00272
00273 template<typename T>
00274 void addValue(size_t index, const T& val, const std::string& comment="") { addEntry(index,new Primitive<T>(val),comment); }
00275
00276 virtual void setValue(size_t index, const char val[], bool warnExists=false) { setEntry(index,new Primitive<std::string>(val),warnExists); }
00277
00278 virtual void addValue(size_t index, const char val[], const std::string& comment="") { addEntry(index,new Primitive<std::string>(val),comment); }
00279
00280
00281 virtual void setEntry(size_t index, ObjectBase& val, bool warnExists=false);
00282
00283 virtual void addEntry(size_t index, ObjectBase& val, const std::string& comment="");
00284
00285 virtual void setEntry(size_t index, ObjectBase* val, bool warnExists=false);
00286
00287 virtual void addEntry(size_t index, ObjectBase* val, const std::string& comment="");
00288
00289
00290 template<typename T>
00291 void setValue(const std::string& name, const T& val,bool warnExists=false) { setEntry(name,new Primitive<T>(val),warnExists); }
00292
00293 template<typename T>
00294 void addValue(const std::string& name, const T& val, const std::string& comment="") { addEntry(name,new Primitive<T>(val),comment); }
00295
00296 virtual void setValue(const std::string& name, const char val[], bool warnExists=false) { setEntry(name,new Primitive<std::string>(val),warnExists); }
00297
00298 virtual void addValue(const std::string& name, const char val[], const std::string& comment="") { addEntry(name,new Primitive<std::string>(val),comment); }
00299
00300
00301 virtual void setEntry(const std::string& name, ObjectBase& val, bool warnExists=false);
00302
00303 virtual void addEntry(const std::string& name, ObjectBase& val, const std::string& comment="");
00304
00305 virtual void setEntry(const std::string& name, ObjectBase* val, bool warnExists=false);
00306
00307 virtual void addEntry(const std::string& name, ObjectBase* val, const std::string& comment="");
00308
00309
00310 virtual void removeEntry(size_t index);
00311
00312 ObjectBase& getEntry(size_t index) const { return *arr[index]; }
00313
00314 ObjectBase& operator[](size_t index) const { return *arr[index]; }
00315
00316 virtual void removeEntry(const std::string& name);
00317 virtual ObjectBase* getEntry(const std::string& name) const;
00318 virtual ObjectBase* operator[](const std::string& name) const { return getEntry(name); }
00319
00320 virtual void clear();
00321
00322
00323 const_iterator begin() const { return arr.begin(); }
00324
00325 const_iterator end() const { return arr.end(); }
00326
00327 size_t size() const { return arr.size(); }
00328
00329
00330 virtual void setComment(size_t index, const std::string& comment);
00331
00332 virtual const std::string& getComment(size_t index) const;
00333
00334
00335 virtual void setComment(const std::string& name, const std::string& comment);
00336
00337 virtual const std::string& getComment(const std::string& name) const;
00338
00339 virtual void loadXML(xmlNode* node);
00340 virtual void saveXML(xmlNode* node) const;
00341
00342
00343 size_t getIndex(const std::string& name) const;
00344
00345 virtual std::string toString() const;
00346
00347
00348 PLIST_CLONE_DEF(Array,new Array(*this));
00349
00350 protected:
00351 virtual void fireEntryRemoved(ObjectBase& val);
00352
00353
00354 virtual void takeObject(size_t index, ObjectBase* obj);
00355
00356
00357 virtual bool loadXMLNode(size_t index, xmlNode* val, const std::string& comment);
00358
00359 virtual unsigned int getLongestKeyLen() const;
00360
00361
00362
00363
00364
00365 iterator getSubEntry(const std::string& name, std::string::size_type& seppos);
00366
00367
00368
00369
00370 const_iterator getSubEntry(const std::string& name, std::string::size_type& seppos) const;
00371
00372
00373 virtual void cloneMyRef();
00374
00375
00376 storage_t arr;
00377
00378
00379 std::set<ObjectBase*> myRef;
00380
00381
00382 typedef std::map<size_t,std::string> comments_t;
00383
00384
00385 comments_t comments;
00386 };
00387
00388 std::ostream& operator<<(std::ostream& os, const Array& d);
00389
00390
00391 template<>
00392 inline void Dictionary::setValue(const std::string& name, const ObjectBase& val, bool warnExists) { setEntry(name,dynamic_cast<ObjectBase*>(val.clone()),warnExists); }
00393
00394 template<>
00395 inline void Dictionary::addValue(const std::string& name, const ObjectBase& val, const std::string& comment, bool warnExists) { addEntry(name,dynamic_cast<ObjectBase*>(val.clone()),comment,warnExists); }
00396
00397 template<>
00398 inline void Dictionary::setValue(const std::string& name, const char* const& val, bool warnExists) { setEntry(name,new Primitive<std::string>(val),warnExists); }
00399
00400 template<>
00401 inline void Dictionary::addValue(const std::string& name, const char* const& val, const std::string& comment, bool warnExists) { addEntry(name,new Primitive<std::string>(val),comment,warnExists); }
00402
00403 template<>
00404 inline void Dictionary::setValue(const std::string& name, char* const& val, bool warnExists) { setEntry(name,new Primitive<std::string>(val),warnExists); }
00405
00406 template<>
00407 inline void Dictionary::addValue(const std::string& name, char* const& val, const std::string& comment, bool warnExists) { addEntry(name,new Primitive<std::string>(val),comment,warnExists); }
00408
00409
00410 template<>
00411 inline void Array::addValue(const ObjectBase& val, const std::string& comment) { addEntry(dynamic_cast<ObjectBase*>(val.clone()),comment); }
00412
00413 template<>
00414 inline void Array::addValue(const char* const& val, const std::string& comment) { addEntry(new Primitive<std::string>(val),comment); }
00415
00416 template<>
00417 inline void Array::addValue(char* const& val, const std::string& comment) { addEntry(new Primitive<std::string>(val),comment); }
00418
00419
00420 template<>
00421 inline void Array::setValue(size_t index, const ObjectBase& val, bool warnExists) { setEntry(index,dynamic_cast<ObjectBase*>(val.clone()),warnExists); }
00422
00423 template<>
00424 inline void Array::setValue(size_t index, const char* const& val, bool warnExists) { setEntry(index,new Primitive<std::string>(val),warnExists); }
00425
00426 template<>
00427 inline void Array::setValue(size_t index, char* const& val, bool warnExists) { setEntry(index,new Primitive<std::string>(val),warnExists); }
00428
00429 template<>
00430 inline void Array::addValue(size_t index, const ObjectBase& val, const std::string& comment) { addEntry(index,dynamic_cast<ObjectBase*>(val.clone()),comment); }
00431
00432 template<>
00433 inline void Array::addValue(size_t index, const char* const& val, const std::string& comment) { addEntry(index,new Primitive<std::string>(val),comment); }
00434
00435 template<>
00436 inline void Array::addValue(size_t index, char* const& val, const std::string& comment) { addEntry(index,new Primitive<std::string>(val),comment); }
00437
00438
00439 template<>
00440 inline void Array::setValue(const std::string& name, const ObjectBase& val, bool warnExists) { setEntry(name,dynamic_cast<ObjectBase*>(val.clone()),warnExists); }
00441
00442 template<>
00443 inline void Array::setValue(const std::string& name, const char* const& val, bool warnExists) { setEntry(name,new Primitive<std::string>(val),warnExists); }
00444
00445 template<>
00446 inline void Array::setValue(const std::string& name, char* const& val, bool warnExists) { setEntry(name,new Primitive<std::string>(val),warnExists); }
00447
00448 template<>
00449 inline void Array::addValue(const std::string& name, const ObjectBase& val, const std::string& comment) { addEntry(name,dynamic_cast<ObjectBase*>(val.clone()),comment); }
00450
00451 template<>
00452 inline void Array::addValue(const std::string& name, const char* const& val, const std::string& comment) { addEntry(name,new Primitive<std::string>(val),comment); }
00453
00454 template<>
00455 inline void Array::addValue(const std::string& name, char* const& val, const std::string& comment) { addEntry(name,new Primitive<std::string>(val),comment); }
00456
00457 }
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 #endif