00001 #ifndef __PROPERTY__ 00002 #define __PROPERTY__ 00003 00004 #include "tree.hh" 00005 00006 template<class P> class property 00007 { 00008 Tree fKey; 00009 00010 P* access(Tree t) 00011 { 00012 Tree d = t->getProperty(fKey); 00013 return d ? (P*)(d->node().getPointer()) : 0; 00014 } 00015 00016 public: 00017 00018 property () : fKey(tree(Node(unique("property_")))) {} 00019 00020 property (const char* keyname) : fKey(tree(Node(keyname))) {} 00021 00022 void set(Tree t, const P& data) 00023 { 00024 P* p = access(t); 00025 if (p) { 00026 *p = data; 00027 } else { 00028 t->setProperty(fKey, tree(Node(new P(data)))); 00029 } 00030 } 00031 00032 bool get(Tree t, P& data) 00033 { 00034 P* p = access(t); 00035 if (p) { 00036 data = *p; 00037 return true; 00038 } else { 00039 return false; 00040 } 00041 } 00042 00043 void clear(Tree t) 00044 { 00045 P* p = access(t); 00046 if (p) { delete p; } 00047 t->clearProperty(fKey); 00048 } 00049 }; 00050 00051 00052 template<> class property<Tree> 00053 { 00054 Tree fKey; 00055 00056 public: 00057 00058 property () : fKey(tree(Node(unique("property_")))) {} 00059 00060 property (const char* keyname) : fKey(tree(Node(keyname))) {} 00061 00062 void set(Tree t, Tree data) 00063 { 00064 t->setProperty(fKey, data); 00065 } 00066 00067 bool get(Tree t, Tree& data) 00068 { 00069 Tree d = t->getProperty(fKey); 00070 if (d) { 00071 data = d; 00072 return true; 00073 } else { 00074 return false; 00075 } 00076 } 00077 00078 void clear(Tree t) 00079 { 00080 t->clearProperty(fKey); 00081 } 00082 }; 00083 00084 00085 template<> class property<int> 00086 { 00087 Tree fKey; 00088 00089 public: 00090 00091 property () : fKey(tree(Node(unique("property_")))) {} 00092 00093 property (const char* keyname) : fKey(tree(Node(keyname))) {} 00094 00095 void set(Tree t, int i) 00096 { 00097 t->setProperty(fKey, tree(Node(i))); 00098 } 00099 00100 bool get(Tree t, int& i) 00101 { 00102 Tree d = t->getProperty(fKey); 00103 if (d) { 00104 i = d->node().getInt(); 00105 return true; 00106 } else { 00107 return false; 00108 } 00109 } 00110 00111 void clear(Tree t) 00112 { 00113 t->clearProperty(fKey); 00114 } 00115 }; 00116 00117 00118 template<> class property<float> 00119 { 00120 Tree fKey; 00121 00122 public: 00123 00124 property () : fKey(tree(Node(unique("property_")))) {} 00125 00126 property (const char* keyname) : fKey(tree(Node(keyname))) {} 00127 00128 void set(Tree t, float x) 00129 { 00130 t->setProperty(fKey, tree(Node(x))); 00131 } 00132 00133 bool get(Tree t, float& x) 00134 { 00135 Tree d = t->getProperty(fKey); 00136 if (d) { 00137 x = d->node().getFloat(); 00138 return true; 00139 } else { 00140 return false; 00141 } 00142 } 00143 00144 void clear(Tree t) 00145 { 00146 t->clearProperty(fKey); 00147 } 00148 }; 00149 00150 00151 00152 #endif