source: XIOS/trunk/src/attribute_template_impl.hpp @ 445

Last change on this file since 445 was 445, checked in by ymipsl, 11 years ago

Add possibility to make inheritance of attributes and reference before closing the context definition.
New fortran fonction : xios_solve inheritance()
After this call, the value of attribute have the inherited value of their parent.

YM

File size: 10.6 KB
Line 
1#ifndef __XMLIO_CAttributeTemplate_impl__
2#define __XMLIO_CAttributeTemplate_impl__
3
4#include "type.hpp"
5#include "buffer_in.hpp"
6#include "buffer_out.hpp"
7#include "generate_interface.hpp"
8#include "attribute_template.hpp"
9
10 
11namespace xios
12{
13
14      /// ////////////////////// Définitions ////////////////////// ///
15      template <class T>
16         CAttributeTemplate<T>::CAttributeTemplate(const StdString & id)
17         : CAttribute(id)
18      { /* Ne rien faire de plus */ }
19
20      template <class T>
21         CAttributeTemplate<T>::CAttributeTemplate(const StdString & id, const T & value)
22         : CAttribute(id)
23      {
24         this->setValue(value);
25      }
26/*
27      template <class T>
28         CAttributeTemplate<T>::CAttributeTemplate(const CAttribute & attribut)
29         throw (CException)
30         : CAttribute(attribut)
31      {
32         if (!attribut.isEmpty() && !attribut.isType<T>())
33            ERROR("CAttributeTemplate", << "Invalid instantiation !");
34      }
35*/
36      template <class T>
37         CAttributeTemplate<T>::CAttributeTemplate(const StdString & id,
38                              xios_map<StdString, CAttribute*> & umap)
39         : CAttribute(id)
40      {
41         umap.insert(umap.end(), std::make_pair(id, this));
42      }
43
44      template <class T>
45         CAttributeTemplate<T>::CAttributeTemplate
46            (const StdString & id, const T & value,
47             xios_map<StdString, CAttribute*> & umap)
48         : CAttribute(id)
49      {
50         this->setValue(value);
51         umap.insert(umap.end(), std::make_pair(id, this));
52      }
53/*
54      template <class T>
55      CAttributeTemplate<T>::~CAttributeTemplate(void)
56      {
57//         this->CType<T>::reset() ;
58//         this->clear();
59      }
60*/
61      ///--------------------------------------------------------------
62
63      template <class T>
64         T CAttributeTemplate<T>::getValue(void) const
65      {
66         return CType<T>::get() ;
67/*
68         if (SuperClass::isEmpty())
69         {
70            ERROR("T CAttributeTemplate<T>::getValue(void) const",
71                  << "[ id = " << this->getId() << "]"
72                  << " L'attribut est requis mais n'est pas défini !");
73          }
74         return (SuperClass::getValue<T>());
75*/
76      }
77
78/*
79      template <class T>
80         T* CAttributeTemplate<T>::getRef(void)
81      {
82         if (SuperClass::isEmpty())
83         {
84            ERROR("T CAttributeTemplate<T>::getValue(void) const",
85                  << "[ id = " << this->getId() << "]"
86                  << " L'attribut est requis mais n'est pas défini !");
87          }
88         return (SuperClass::getRef<T>());
89      }
90*/
91
92      template <class T>
93         void CAttributeTemplate<T>::setValue(const T & value)
94      {
95         CType<T>::set(value) ;
96//         SuperClass::setValue<T>(value);
97      }
98
99    template <class T>
100    void CAttributeTemplate<T>::set(const CAttribute& attr)
101    {
102      this->set(dynamic_cast<const CAttributeTemplate<T>& >(attr)) ;
103    } 
104
105   template <class T>
106    void CAttributeTemplate<T>::set(const CAttributeTemplate& attr)
107    {
108      CType<T>::set(attr) ;
109    } 
110
111    template <class T>
112    void CAttributeTemplate<T>::setInheritedValue(const CAttribute& attr)
113    {
114      this->setInheritedValue(dynamic_cast<const CAttributeTemplate<T>& >(attr)) ;
115    } 
116
117    template <class T>
118    void CAttributeTemplate<T>::setInheritedValue(const CAttributeTemplate& attr)
119    {
120      if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()) ;
121    } 
122
123    template <class T>
124    T CAttributeTemplate<T>::getInheritedValue(void) const
125    {
126      if (this->isEmpty()) return inheritedValue.get() ;
127      else return getValue() ;
128    } 
129   
130    template <class T>
131    bool CAttributeTemplate<T>::hasInheritedValue(void) const
132    {
133      return !this->isEmpty() || !inheritedValue.isEmpty() ;
134    } 
135   
136      //---------------------------------------------------------------
137
138      template <class T>
139         CAttributeTemplate<T>& CAttributeTemplate<T>::operator=(const T & value)
140      {
141         this->setValue(value);
142//         return (this->getValue());
143         return *this;
144      }
145
146      //---------------------------------------------------------------
147
148      template <class T>
149         StdString CAttributeTemplate<T>::_toString(void) const
150      {
151         StdOStringStream oss;
152         if (!CType<T>::isEmpty() && this->hasId())
153            oss << this->getName() << "=\"" << CType<T>::toString() << "\"";
154         return (oss.str());
155      }
156
157      template <class T>
158         void CAttributeTemplate<T>::_fromString(const StdString & str)
159      {
160        CType<T>::fromString(str) ;
161      }
162
163      //---------------------------------------------------------------
164/*
165      template <class T>
166         void CAttributeTemplate<T>::toBinary (StdOStream & os) const
167      {
168         this->getValue()->toBinary(os);
169      }
170
171      template <class T>
172         void CAttributeTemplate<T>::fromBinary(StdIStream & is)
173      {
174         T value;
175         FromBinary(is, value);
176         this->setValue(value);
177      }
178*/
179      template <class T>
180         bool CAttributeTemplate<T>::_toBuffer (CBufferOut& buffer) const
181      {
182         return CType<T>::toBuffer(buffer) ;
183/*         
184         if (isEmpty()) return buffer.put(true) ;
185         else
186         {
187           bool ret=true ;
188           CType<T> val(*boost::any_cast<T>(&value)) ;
189           ret&=buffer.put(false) ;
190           ret&=val.toBuffer(buffer) ;
191           return ret ;
192         }
193*/
194      }
195
196      template <class T>
197      bool CAttributeTemplate<T>::_fromBuffer(CBufferIn& buffer)
198      {
199        return CType<T>::fromBuffer(buffer) ;
200/*       
201        bool empty ;
202        bool ret=true ;
203        ret&=buffer.get(empty) ;
204        if (empty)
205        {
206          clear() ;
207          return ret ;
208        }
209        else
210        {
211          if (isEmpty())
212          {
213            T val ;
214            setValue(val) ;
215          }
216          T* V=const_cast<T*>(boost::any_cast<T>(&value)) ;
217          CType<T> val(*V) ;
218          return val.fromBuffer(buffer) ;
219        }
220*/
221      }
222/*
223      template <class T>
224      size_t CAttributeTemplate<T>::size(void) const
225      {
226        return CType<T>::size() ;*/
227/*       
228        if (isEmpty()) return sizeof(bool) ;
229        else
230        {
231          CType<T> val(*const_cast<T*>(boost::any_cast<T>(&value))) ;
232          return val.size()+sizeof(bool) ;
233        }
234*/
235 /*     }*/
236
237      template <typename T>
238      void CAttributeTemplate<T>::generateCInterface(ostream& oss,const string& className)
239      {
240        CInterface::AttributeCInterface<T>(oss, className, this->getName()) ;
241//        CInterface::AttributeIsDefinedCInterface(oss, className, this->getName()) ;
242      }
243     
244      template <typename T>
245      void CAttributeTemplate<T>::generateFortran2003Interface(ostream& oss,const string& className)
246      {
247        CInterface::AttributeFortran2003Interface<T>(oss, className, this->getName()) ;
248//        CInterface::AttributeIsDefinedFortran2003Interface(oss, className, this->getName()) ;
249      }
250     
251      template <typename T>
252      void CAttributeTemplate<T>::generateFortranInterfaceDeclaration_(ostream& oss,const string& className)
253      {
254        CInterface::AttributeFortranInterfaceDeclaration<T>(oss, className, this->getName()+"_") ;
255      }
256 
257      template <typename T>
258      void CAttributeTemplate<T>::generateFortranInterfaceBody_(ostream& oss,const string& className)
259      {
260        CInterface::AttributeFortranInterfaceBody<T>(oss, className, this->getName()) ;
261      }
262
263      template <typename T>
264      void CAttributeTemplate<T>::generateFortranInterfaceDeclaration(ostream& oss,const string& className)
265      {
266        CInterface::AttributeFortranInterfaceDeclaration<T>(oss, className, this->getName()) ;
267      }
268     
269      template <typename T>
270      void CAttributeTemplate<T>::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className)
271      {
272        CInterface::AttributeFortranInterfaceGetDeclaration<T>(oss, className, this->getName()+"_") ;
273      }
274 
275 
276      template <typename T>
277      void CAttributeTemplate<T>::generateFortranInterfaceGetBody_(ostream& oss,const string& className)
278      {
279        CInterface::AttributeFortranInterfaceGetBody<T>(oss, className, this->getName()) ;
280      }
281
282      template <typename T>
283      void CAttributeTemplate<T>::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className)
284      {
285        CInterface::AttributeFortranInterfaceGetDeclaration<T>(oss, className, this->getName()) ;
286      }
287
288 
289/*     
290      //---------------------------------------------------------------
291
292      // Spécialisations des templates pour la fonction [toString]
293
294      template <>
295         StdString CAttributeTemplate<bool>::toString(void) const;
296
297      //---------------------------------------------------------------
298
299      // Spécialisations des templates pour la fonction [fromString]
300
301      template <> // Chaîne de caractÚres.
302         void CAttributeTemplate<StdString>::fromString(const StdString & str);
303
304      template <> // Entier
305         void CAttributeTemplate<int>::fromString(const StdString & str);
306
307      template <> // Booléen
308         void CAttributeTemplate<bool>::fromString(const StdString & str);
309
310      template <> // Double
311         void CAttributeTemplate<double>::fromString(const StdString & str);
312
313      template<> // Tableau
314         void CAttributeTemplate<ARRAY(double, 1)>::fromString(const StdString & str);
315
316      //---------------------------------------------------------------
317
318      // Spécialisations des templates pour la fonction [toBinary] //
319
320      template <> // Chaîne de caractÚres.
321         void CAttributeTemplate<StdString>::toBinary (StdOStream & os) const;
322
323      template <> // Entier
324         void CAttributeTemplate<int>::toBinary(StdOStream & os) const;
325
326      template <> // Booléen
327         void CAttributeTemplate<bool>::toBinary(StdOStream & os) const;
328         
329      template <> // Double
330         void CAttributeTemplate<double>::toBinary(StdOStream & os) const;
331
332      //---------------------------------------------------------------
333
334      // Spécialisations des templates pour la fonction [fromBinary] //
335
336      template <> // Chaîne de caractÚres.
337         void CAttributeTemplate<StdString>::fromBinary(StdIStream & is);
338
339      template <> // Entier
340         void CAttributeTemplate<int>::fromBinary(StdIStream & is);
341
342      template <> // Booléen
343         void CAttributeTemplate<bool>::fromBinary(StdIStream & is);
344         
345      template <> // Double
346         void CAttributeTemplate<double>::fromBinary(StdIStream & is);
347
348      ///--------------------------------------------------------------
349*/     
350} // namespace xios
351
352#endif // __XMLIO_CAttributeTemplate_impl__
Note: See TracBrowser for help on using the repository browser.