00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00081
00082
00083
00084 #include "pinapa-parser-all.h"
00085
00086 namespace pinapa {
00087
00088 class st_deco_b;
00089 typedef st_deco_b * deco_b;
00090
00091 }
00092
00093 #ifndef PINAPA_DECORATION_BASE_H
00094 #define PINAPA_DECORATION_BASE_H
00095
00096 #include "pinapa-tree.h"
00097 #include "pinapa-hash.h"
00098
00099 namespace pinapa {
00100
00104 class st_deco_b {
00105 public:
00106 deco_b get_deco() {return static_cast<deco_b>(pinapa_decoration);}
00107 void set_deco(deco_b d) {pinapa_decoration = d;}
00108 st_deco_b() : pinapa_decoration (NULL) {}
00109
00110 void * pinapa_decoration;
00111 };
00112
00120 template<class parent>
00121 void * get_decoration(parent & p) {
00122 return reinterpret_cast<void *>(p.pinapa_decoration);
00123 }
00124
00128 template<class parent>
00129 void set_decoration(parent & p, void * c) {
00130 p.pinapa_decoration = tree(c);
00131 }
00132
00133 template<class deco, class parent>
00134 class st_deco_first : public st_deco_b {
00135 public:
00136 st_deco_first<deco,parent>() {}
00137 st_deco_first<deco,parent>(deco d) : m_deco(d) {}
00138 static st_deco_first<deco,parent> & get(parent * p);
00139 static st_deco_first<deco,parent> & get(parent p);
00140 static st_deco_first<deco,parent> * get_deco(parent * p);
00141 static bool is_null(parent * p) {
00142 return reinterpret_cast<st_deco_first<deco,parent> *>(get_decoration<parent>(p)) == NULL;}
00143 void attach(parent * p);
00144 deco * operator -> () {return & m_deco;}
00145 deco * get_deco() {return & m_deco;}
00146 private:
00147 deco m_deco;
00148 };
00149
00150 template <class deco, class parent>
00151 inline st_deco_first<deco,parent> &
00152 st_deco_first<deco,parent>::get(parent * p) {
00153 st_deco_first<deco,parent> * res =
00154 (st_deco_first<deco,parent> *)
00155 get_decoration<parent>(*p);
00156 if (res == NULL) {
00157 res = new st_deco_first<deco,parent>();
00158 set_decoration<parent>(*p, res);
00159 }
00160 return *res;
00161 }
00162
00163 template <class deco, class parent>
00164 inline st_deco_first<deco,parent> &
00165 st_deco_first<deco,parent>::get(parent p) {
00166 st_deco_first<deco,parent> * res =
00167 static_cast<st_deco_first<deco,parent> *>
00168 (get_decoration<parent>(p));
00169 if (res == NULL) {
00170 res = new st_deco_first<deco,parent>();
00171 set_decoration<parent>(p, res);
00172 }
00173 return *res;
00174 }
00175
00176 template <class deco, class parent>
00177 inline st_deco_first<deco,parent> *
00178 st_deco_first<deco,parent>::get_deco(parent * p) {
00179 st_deco_first<deco,parent> * res =
00180 static_cast<st_deco_first<deco,parent> *>
00181 (get_decoration<parent>(*p));
00182 return res;
00183 }
00184
00185 template <class deco, class parent>
00186 void st_deco_first<deco,parent>::attach(parent * p){
00187 set_decoration<parent>(p, this);
00188 }
00189
00192 template<class deco, class parent, class grandparent>
00193 class st_deco : public st_deco_b {
00194 public:
00195 st_deco<deco,parent,grandparent>() : m_deco() {}
00196 st_deco<deco,parent,grandparent>(deco d) : m_deco(d) {}
00197 static st_deco<deco,parent,grandparent> & get(grandparent * p);
00198 static st_deco<deco,parent,grandparent> * get_deco(grandparent * p);
00199 static bool is_null(grandparent * p) {return parent::is_null(p);}
00200 void attach(parent * p);
00201 deco * operator -> () {return & m_deco;}
00202 deco * get_deco() {return & m_deco;}
00203 private:
00204 deco m_deco;
00205 };
00206
00207 template <class deco, class parent, class grandparent>
00208 inline st_deco<deco,parent,grandparent> &
00209 st_deco<deco,parent,grandparent>::get(grandparent * p) {
00210 st_deco_b parent_deco = parent::get(p);
00211 st_deco<deco,parent,grandparent> * res =
00212 static_cast<st_deco<deco,parent,grandparent> *>
00213 (get_decoration<st_deco_b>(parent_deco));
00214
00215 if (res == NULL) {
00216 res = new st_deco();
00217 set_decoration<st_deco_b>(parent::get(p), res);
00218 }
00219 return *res;
00220 }
00221
00222 template <class deco, class parent, class grandparent>
00223 inline st_deco<deco,parent,grandparent> *
00224 st_deco<deco,parent,grandparent>::get_deco(grandparent * p) {
00225 st_deco_b parent_deco = parent::get(p);
00226 st_deco<deco,parent,grandparent> * res =
00227 static_cast<st_deco<deco,parent,grandparent> *>
00228 (get_decoration<parent>(parent_deco));
00229 return res;
00230 }
00231
00232
00233 template <class deco, class parent, class grandparent>
00234 void st_deco<deco,parent,grandparent>::attach(parent * p){
00235 get_decoration<parent>(p, this);
00236 }
00237
00238 }
00239
00240 #endif // PINAPA_DECORATION_H
00241
00242