COOPY » Guide  version 0.6.5
/home/paulfitz/cvs/coopy_scm/coopy/src/libcoopy_core/include/coopy/Property.h
Go to the documentation of this file.
00001 #ifndef COOPY_PROPERTY
00002 #define COOPY_PROPERTY
00003 
00004 #include <coopy/RefCount.h>
00005 
00006 #include <map>
00007 #include <string>
00008 
00009 #include <stdio.h>
00010 
00011 namespace coopy {
00012   namespace store {
00013     class Value;
00014     class PolyValue;
00015     class Property;
00016   }
00017 }
00018 
00019 class coopy::store::Value : public RefCount {
00020 public:
00021   virtual ~Value() {}
00022 
00023   virtual int asInt() const { return 0; }
00024   virtual bool asBoolean() const { return false; }
00025   virtual std::string asString() const { return ""; }
00026   virtual Property& asMap();
00027   virtual const Property& asMap() const;
00028 
00029   virtual bool isInt() const { return false; }
00030   virtual bool isBoolean() const { return false; }
00031   virtual bool isString() const { return false; }    
00032   virtual bool isMap() const { return false; }    
00033 
00034   virtual bool isNull() const { return true; }
00035 
00036   virtual std::string toString() const = 0;
00037 };
00038 
00039 class coopy::store::PolyValue : public Value {
00040 private:
00041   Value *value;
00042 public:
00043 
00044   PolyValue() {
00045     value = 0/*NULL*/;
00046   }
00047 
00048   PolyValue(const PolyValue& alt) {
00049     value = alt.value;
00050     if (value!=0/*NULL*/) {
00051       value->addReference();
00052     }
00053   }
00054 
00055   virtual ~PolyValue() {
00056     clear();
00057   }
00058 
00059   const PolyValue& operator=(const PolyValue& alt) {
00060     clear();
00061     value = alt.value;
00062     if (value!=0/*NULL*/) {
00063       value->addReference();
00064     }
00065     return *this;
00066   }
00067 
00068   void clear() {
00069     if (value==0/*NULL*/) return;
00070     int ref = value->removeReference();
00071     if (ref==0) {
00072       delete value;
00073     }
00074     value = 0/*NULL*/;
00075   }
00076   
00077   bool setInt(int x);
00078   bool setBoolean(bool x);
00079   bool setString(const char *str);
00080   bool setString(const std::string& str);
00081   bool setNull();
00082   bool setMap();
00083 
00084   virtual int asInt() const { 
00085     if (value!=0/*NULL*/) return value->asInt();
00086     return 0; 
00087   }
00088 
00089   virtual bool asBoolean() const { 
00090     if (value!=0/*NULL*/) return value->asBoolean();
00091     return 0; 
00092   }
00093 
00094   virtual std::string asString() const { 
00095     if (value!=0/*NULL*/) return value->asString();
00096     return ""; 
00097   }
00098 
00099   virtual bool isInt() const { 
00100     if (value!=0/*NULL*/) return value->isInt();
00101     return false; 
00102   }
00103 
00104   virtual bool isBoolean() const { 
00105     if (value!=0/*NULL*/) return value->isBoolean();
00106     return false; 
00107   }
00108 
00109   virtual bool isString() const { 
00110     if (value!=0/*NULL*/) return value->isString();
00111     return false; 
00112   }    
00113 
00114   virtual bool isNull() const { 
00115     if (value!=0/*NULL*/) return value->isNull();
00116     return true; 
00117   }
00118 
00119   virtual std::string toString() const {
00120     if (value!=0/*NULL*/) return value->toString();
00121     return "None"; 
00122   }
00123 
00124 
00125   static PolyValue makeInt(int x) {
00126     PolyValue v;
00127     v.setInt(x);
00128     return v;
00129   }
00130 
00131   static PolyValue makeBoolean(bool x) {
00132     PolyValue v;
00133     v.setBoolean(x);
00134     return v;
00135   }
00136 
00137   static PolyValue makeString(const char *str) {
00138     PolyValue v;
00139     v.setString(str);
00140     return v;
00141   }
00142 
00143   static PolyValue makeString(const std::string& str) {
00144     PolyValue v;
00145     v.setString(str);
00146     return v;
00147   }
00148 
00149   static PolyValue makeMap() {
00150     PolyValue v;
00151     v.setMap();
00152     return v;
00153   }
00154 };
00155 
00156 class coopy::store::Property : public Value {
00157 private:
00158   std::map<std::string,PolyValue> data;
00159   PolyValue nullValue;
00160   static Property nullProperty;
00161 
00162 public:
00163   virtual bool isMap() const { return true; }
00164   virtual bool isNull() const { return false; }
00165   virtual Property& asMap() { return *this; }
00166   virtual const Property& asMap() const { return *this; }
00167 
00168   bool put(const char *key, int val) {
00169     data[key] = PolyValue();
00170     return data[key].setInt(val);
00171   }
00172 
00173   bool put(const char *key, bool val) {
00174     data[key] = PolyValue();
00175     return data[key].setBoolean(val);
00176   }
00177 
00178   bool put(const char *key, const char *str) {
00179     data[key] = PolyValue();
00180     return data[key].setString(str);
00181   }
00182 
00183   bool put(const char *key, const std::string& str) {
00184     data[key] = PolyValue();
00185     return data[key].setString(str);
00186   }
00187 
00188   Property& nest(const char *key) {
00189     data[key] = PolyValue();
00190     if (!data[key].setMap()) {
00191       return nullProperty;
00192     }
00193     return data[key].asMap();
00194   }
00195 
00196   bool check(const char *key) const {
00197     std::map<std::string,PolyValue>::const_iterator it = data.find(key);    
00198     return (it!=data.end());
00199   }
00200 
00201   bool flag(const char *key, bool def) const {
00202     std::map<std::string,PolyValue>::const_iterator it = data.find(key);    
00203     if (it==data.end()) return def;
00204     return it->second.asBoolean();
00205   }
00206 
00207   const Value& get(const char *key) const {
00208     std::map<std::string,PolyValue>::const_iterator it = data.find(key);    
00209     if (it==data.end()) return nullValue;
00210     return it->second;
00211   }
00212 
00213   PolyValue get(const char *key, PolyValue default_value) const {
00214     std::map<std::string,PolyValue>::const_iterator it = data.find(key);    
00215     if (it==data.end()) return default_value;
00216     return it->second;
00217   }
00218 
00219   std::string toString() const;
00220 
00221   static Property& getNullProperty() {
00222     return nullProperty;
00223   }
00224 };
00225 
00226 #endif
00227 
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines