FAUST compiler  0.9.9.6b8
property.hh
Go to the documentation of this file.
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<double>
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, double x)
00129     {
00130         t->setProperty(fKey, tree(Node(x)));
00131     }
00132 
00133     bool get(Tree t, double& x)
00134     {
00135         Tree d = t->getProperty(fKey);
00136         if (d) {
00137             x = d->node().getDouble();
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