00001
00002
00003
00004
00005
00006
00007 #ifndef BALL_CONCEPT_PROPERTY_H
00008 #define BALL_CONCEPT_PROPERTY_H
00009
00010 #ifndef BALL_COMMON_H
00011 # include <BALL/common.h>
00012 #endif
00013
00014 #ifndef BALL_DATATYPE_BITVECTOR_H
00015 # include <BALL/DATATYPE/bitVector.h>
00016 #endif
00017
00018 #ifndef BALL_CONCEPT_PERSISTENTOBJECT_H
00019 # include <BALL/CONCEPT/persistentObject.h>
00020 #endif
00021
00022 #include <iostream>
00023
00024 #include <boost/shared_ptr.hpp>
00025 #include <boost/any.hpp>
00026
00027 namespace BALL
00028 {
00029
00034
00038 class BALL_EXPORT NamedProperty
00039 : public PersistentObject
00040 {
00041 public:
00042
00043 BALL_CREATE(NamedProperty)
00044
00045
00051 enum Type
00052 {
00056 BOOL,
00057
00060 INT,
00061
00065 UNSIGNED_INT,
00066
00069 FLOAT,
00070
00073 DOUBLE,
00074
00078 STRING,
00079
00084 OBJECT,
00085
00091 NONE,
00092
00097 SMART_OBJECT
00098 };
00099
00101
00104
00105
00106
00107 NamedProperty();
00108
00115 NamedProperty(const string& name);
00116
00123 NamedProperty(const string& name, bool value);
00124
00131 NamedProperty(const string& name, int value);
00132
00139 NamedProperty(const string& name, unsigned int value);
00140
00147 NamedProperty(const string& name, float value);
00148
00155 NamedProperty(const string& name, double value);
00156
00164 NamedProperty(const string& name, const string& str);
00165
00173 NamedProperty(const string& name, PersistentObject& po);
00174
00182 NamedProperty(const string& name, boost::shared_ptr<PersistentObject>& po);
00183
00186 NamedProperty(const NamedProperty&);
00187
00191 NamedProperty(const NamedProperty&, const string& name);
00192
00197 ~NamedProperty();
00198
00201 virtual void clear();
00202
00204
00207
00211 virtual void persistentWrite(PersistenceManager& pm, const char* name = "") const;
00212
00216 virtual void persistentRead(PersistenceManager& pm);
00217
00219
00222
00224 Type getType() const;
00225
00227 const string& getName() const;
00228
00233 bool getBool() const;
00234
00239 int getInt() const;
00240
00245 float getFloat() const;
00246
00251 double getDouble() const;
00252
00257 unsigned int getUnsignedInt() const;
00258
00263 PersistentObject* getObject() const;
00264
00269 boost::shared_ptr<PersistentObject> getSmartObject() const;
00270
00275 String getString() const;
00276
00279 String toString() const;
00280
00282
00285
00289 bool operator == (const NamedProperty& np) const;
00290
00294 bool operator != (const NamedProperty& np) const;
00295
00297 void operator = (const NamedProperty& np);
00298
00300
00301 private:
00302
00303
00304
00305 Type type_;
00306
00307
00308
00309 string name_;
00310
00311
00312
00313 boost::any data_;
00314
00315 };
00316
00317 typedef std::vector<NamedProperty>::iterator NamedPropertyIterator;
00318
00343 class BALL_EXPORT PropertyManager
00344 {
00345 public:
00346
00347 BALL_CREATE(PropertyManager)
00348
00349
00351
00352 BALL_INLINE
00353
00355 PropertyManager();
00356
00357 BALL_INLINE
00359 PropertyManager(const PropertyManager& property_manager);
00360
00362 virtual ~PropertyManager();
00363
00365 virtual void clear();
00366
00368 virtual void destroy();
00369
00371
00374
00378 void set(const PropertyManager& property_manager);
00379
00386 const PropertyManager& operator = (const PropertyManager& property_manager);
00387
00393 void get(PropertyManager& property_manager) const;
00394
00398 void swap(PropertyManager& property_manager);
00399
00401
00404
00411 BitVector& getBitVector();
00412
00419 const BitVector& getBitVector() const;
00420
00422
00425
00432 operator BitVector& ();
00433
00435
00438
00444 void setProperty(Property property);
00445
00451 void clearProperty(Property property);
00452
00458 void toggleProperty(Property property);
00459
00465 Size countProperties() const;
00466
00468
00477
00481 const NamedProperty& getNamedProperty(Position index) const;
00482
00486 NamedProperty& getNamedProperty(Position index);
00487
00495 void setProperty(const NamedProperty& property);
00496
00503 void setProperty(const string& name);
00504
00512 void setProperty(const string& name, bool value);
00513
00521 void setProperty(const string& name, int value);
00522
00530 void setProperty(const string& name, unsigned int value);
00531
00539 void setProperty(const string& name, float value);
00540
00548 void setProperty(const string& name, double value);
00549
00557 void setProperty(const string& name, const string& value);
00558
00566 void setProperty(const string& name, const PersistentObject& value);
00567
00574 const NamedProperty& getProperty(const string& name) const;
00575
00577 NamedPropertyIterator beginNamedProperty();
00578
00580 NamedPropertyIterator endNamedProperty();
00581
00587 void clearProperty(const string& name);
00588
00592 Size countNamedProperties() const;
00594
00598
00599 bool hasProperty(Property property) const;
00600
00602 bool hasProperty(const string& name) const;
00603
00607 bool operator == (const PropertyManager& pm) const;
00608
00610 bool operator != (const PropertyManager& pm) const;
00611
00613
00614
00618
00619 void write(PersistenceManager& pm) const;
00620
00622 bool read(PersistenceManager& pm);
00624
00628
00633 bool isValid() const;
00634
00641 void dump(std::ostream& s = std::cout, Size depth = 0) const;
00642
00644
00645 private:
00646
00647 BitVector bitvector_;
00648 std::vector<NamedProperty> named_properties_;
00649 };
00650
00652
00653 # ifndef BALL_NO_INLINE_FUNCTIONS
00654 # include <BALL/CONCEPT/property.iC>
00655 # endif
00656
00657 }
00658
00659 #endif // BALL_CONCEPT_PROPERTY_H