pinapa-decoration-base.h

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * arch-tag: Matthieu Moy  June 24, 2003 (parser/include/scp-decoration-base.h)
00003  *------------------------------------------------------------------------------
00004  *         Copyright (c) STMicroelectronics,Verimag
00005  * Pinapa is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Lesser General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2 of the License, or (at your option) any later version.
00009  * 
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Library General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public
00016  * License along with this library; if not, write to the Free
00017  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00018  * MA 02111-1307, USA
00019  *------------------------------------------------------------------------------
00020  *                 System Platform Group - HPC
00021  *******************************************************************************/
00022 
00081 // // template<class deco, class parent, class grandparent>
00082 // // class st_deco;
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   
Generated by
Matthieu Moy <Matthieu.Moy@st.com>
Back to Pinapa Home Page