COOPY » Guide
version 0.6.5
|
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