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