source: XIOS/dev/dev_ym/XIOS_COUPLING/src/attribute_template_impl.hpp @ 2338

Last change on this file since 2338 was 2305, checked in by ymipsl, 2 years ago

Fix bug when calling to "xios_solve_inheritance" that inhibit transformation chaining.

YM

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 12.0 KB
RevLine 
[591]1#ifndef __XIOS_CAttributeTemplate_impl__
2#define __XIOS_CAttributeTemplate_impl__
[219]3
[300]4#include "type.hpp"
5#include "buffer_in.hpp"
6#include "buffer_out.hpp"
[352]7#include "generate_interface.hpp"
8#include "attribute_template.hpp"
[219]9
[775]10
[335]11namespace xios
[219]12{
[313]13
[219]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      }
[369]26/*
[219]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      }
[369]35*/
[219]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      }
[369]53/*
[219]54      template <class T>
[369]55      CAttributeTemplate<T>::~CAttributeTemplate(void)
[775]56      {
[369]57//         this->CType<T>::reset() ;
58//         this->clear();
[219]59      }
[369]60*/
[219]61      ///--------------------------------------------------------------
[460]62      template <class T>
63      void CAttributeTemplate<T>::reset(void)
64      {
65        CType<T>::reset() ;
66        inheritedValue.reset() ;
67      }
[219]68
69      template <class T>
[1478]70      void CAttributeTemplate<T>::checkEmpty(void) const
[219]71      {
[1478]72        if (CType<T>::empty)
[1477]73        {
74          StdString msg("On checking attribute with id=");
75          msg.append(this->getId());
76          msg.append(" : ");
77          msg.append("data is not initialized\n");
78          ERROR("template <typename T> void CType<T>::checkEmpty(void) const", << msg);
79        }
[1478]80      }
[1477]81
[1478]82
83      template <class T>
84         T CAttributeTemplate<T>::getValue(void) const
85      {
86        return CType<T>::get() ;
87
[369]88/*
[1158]89        if (SuperClass::isEmpty())
90        {
91           ERROR("T CAttributeTemplate<T>::getValue(void) const",
92                 << "[ id = " << this->getId() << "]"
93                 << " L'attribut est requis mais n'est pas défini !");
94         }
95        return (SuperClass::getValue<T>());
[369]96*/
[219]97      }
98
[369]99/*
[219]100      template <class T>
[300]101         T* CAttributeTemplate<T>::getRef(void)
102      {
103         if (SuperClass::isEmpty())
104         {
105            ERROR("T CAttributeTemplate<T>::getValue(void) const",
106                  << "[ id = " << this->getId() << "]"
107                  << " L'attribut est requis mais n'est pas défini !");
108          }
109         return (SuperClass::getRef<T>());
110      }
[369]111*/
[300]112
113      template <class T>
[219]114         void CAttributeTemplate<T>::setValue(const T & value)
115      {
[369]116         CType<T>::set(value) ;
117//         SuperClass::setValue<T>(value);
[219]118      }
119
[369]120    template <class T>
121    void CAttributeTemplate<T>::set(const CAttribute& attr)
122    {
123      this->set(dynamic_cast<const CAttributeTemplate<T>& >(attr)) ;
[775]124    }
[369]125
126   template <class T>
127    void CAttributeTemplate<T>::set(const CAttributeTemplate& attr)
128    {
129      CType<T>::set(attr) ;
[775]130    }
[369]131
[445]132    template <class T>
133    void CAttributeTemplate<T>::setInheritedValue(const CAttribute& attr)
134    {
135      this->setInheritedValue(dynamic_cast<const CAttributeTemplate<T>& >(attr)) ;
[775]136    }
[445]137
138    template <class T>
139    void CAttributeTemplate<T>::setInheritedValue(const CAttributeTemplate& attr)
140    {
[1158]141      if (this->isEmpty() && _canInherite && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()) ;
[775]142    }
[445]143
144    template <class T>
145    T CAttributeTemplate<T>::getInheritedValue(void) const
146    {
147      if (this->isEmpty()) return inheritedValue.get() ;
148      else return getValue() ;
[775]149    }
150
[445]151    template <class T>
152    bool CAttributeTemplate<T>::hasInheritedValue(void) const
153    {
154      return !this->isEmpty() || !inheritedValue.isEmpty() ;
[775]155    }
156
[1158]157    template <class T>
158    bool CAttributeTemplate<T>::isEqual(const CAttribute& attr)
159    {
160      const CAttributeTemplate<T>& tmp = dynamic_cast<const CAttributeTemplate<T>& >(attr);
161      return this->isEqual_(tmp);
162    }
163
164    template <class T>
165    bool CAttributeTemplate<T>::isEqual_(const CAttributeTemplate& attr)
166    {
[2305]167      if (this->isEmpty() && attr.isEmpty()) return true ;
168      if (!this->isEmpty() && !attr.isEmpty())  return (this->getValue() == attr.getValue());
169      else return false;
[1158]170    }
171
[219]172      //---------------------------------------------------------------
173
174      template <class T>
[369]175         CAttributeTemplate<T>& CAttributeTemplate<T>::operator=(const T & value)
[219]176      {
177         this->setValue(value);
[369]178//         return (this->getValue());
179         return *this;
[219]180      }
181
182      //---------------------------------------------------------------
183
184      template <class T>
[369]185         StdString CAttributeTemplate<T>::_toString(void) const
[219]186      {
187         StdOStringStream oss;
[369]188         if (!CType<T>::isEmpty() && this->hasId())
189            oss << this->getName() << "=\"" << CType<T>::toString() << "\"";
[219]190         return (oss.str());
191      }
192
193      template <class T>
[369]194         void CAttributeTemplate<T>::_fromString(const StdString & str)
[219]195      {
[369]196        CType<T>::fromString(str) ;
[219]197      }
198
199      //---------------------------------------------------------------
[1622]200
201      template <class T>
202         StdString CAttributeTemplate<T>::_dump(void) const
203      {
204         StdOStringStream oss;
205         if (!CType<T>::isEmpty() && this->hasId())
206            oss << this->getName() << "=\"" << CType<T>::dump() << "\"";
207         return (oss.str());
208      }
[2146]209     
210      template <class T>
211         StdString CAttributeTemplate<T>::_dumpGraph(void) const
212      {
213         StdOStringStream oss;
214         if (!CType<T>::isEmpty() && this->hasId())
215            oss << this->getName() << "=" << CType<T>::dump() << "</br>";
216         return (oss.str());
217      }
[1622]218
219
220      //---------------------------------------------------------------
[369]221/*
[219]222      template <class T>
223         void CAttributeTemplate<T>::toBinary (StdOStream & os) const
224      {
225         this->getValue()->toBinary(os);
226      }
227
228      template <class T>
229         void CAttributeTemplate<T>::fromBinary(StdIStream & is)
230      {
231         T value;
232         FromBinary(is, value);
233         this->setValue(value);
234      }
[369]235*/
[300]236      template <class T>
[369]237         bool CAttributeTemplate<T>::_toBuffer (CBufferOut& buffer) const
[300]238      {
[369]239         return CType<T>::toBuffer(buffer) ;
[775]240/*
[300]241         if (isEmpty()) return buffer.put(true) ;
242         else
243         {
244           bool ret=true ;
245           CType<T> val(*boost::any_cast<T>(&value)) ;
246           ret&=buffer.put(false) ;
247           ret&=val.toBuffer(buffer) ;
248           return ret ;
249         }
[369]250*/
[300]251      }
252
253      template <class T>
[369]254      bool CAttributeTemplate<T>::_fromBuffer(CBufferIn& buffer)
[300]255      {
[369]256        return CType<T>::fromBuffer(buffer) ;
[775]257/*
[300]258        bool empty ;
259        bool ret=true ;
260        ret&=buffer.get(empty) ;
[775]261        if (empty)
[300]262        {
263          clear() ;
264          return ret ;
265        }
266        else
267        {
268          if (isEmpty())
269          {
270            T val ;
271            setValue(val) ;
272          }
273          T* V=const_cast<T*>(boost::any_cast<T>(&value)) ;
274          CType<T> val(*V) ;
275          return val.fromBuffer(buffer) ;
276        }
[369]277*/
[300]278      }
[369]279/*
[300]280      template <class T>
281      size_t CAttributeTemplate<T>::size(void) const
[775]282      {
[369]283        return CType<T>::size() ;*/
[775]284/*
[300]285        if (isEmpty()) return sizeof(bool) ;
286        else
287        {
288          CType<T> val(*const_cast<T*>(boost::any_cast<T>(&value))) ;
289          return val.size()+sizeof(bool) ;
290        }
[369]291*/
292 /*     }*/
[300]293
[313]294      template <typename T>
295      void CAttributeTemplate<T>::generateCInterface(ostream& oss,const string& className)
296      {
[778]297        CInterface::AttributeCInterface<T>(oss, className, this->getName());
[313]298      }
[775]299
[313]300      template <typename T>
301      void CAttributeTemplate<T>::generateFortran2003Interface(ostream& oss,const string& className)
302      {
[778]303        CInterface::AttributeFortran2003Interface<T>(oss, className, this->getName());
[313]304      }
[775]305
[313]306      template <typename T>
307      void CAttributeTemplate<T>::generateFortranInterfaceDeclaration_(ostream& oss,const string& className)
308      {
[778]309        CInterface::AttributeFortranInterfaceDeclaration<T>(oss, className, this->getName() + "_");
[313]310      }
[775]311
[313]312      template <typename T>
313      void CAttributeTemplate<T>::generateFortranInterfaceBody_(ostream& oss,const string& className)
314      {
[778]315        CInterface::AttributeFortranInterfaceBody<T>(oss, className, this->getName());
[313]316      }
317
318      template <typename T>
319      void CAttributeTemplate<T>::generateFortranInterfaceDeclaration(ostream& oss,const string& className)
320      {
[778]321        CInterface::AttributeFortranInterfaceDeclaration<T>(oss, className, this->getName());
[313]322      }
[775]323
[313]324      template <typename T>
325      void CAttributeTemplate<T>::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className)
326      {
[778]327        CInterface::AttributeFortranInterfaceGetDeclaration<T>(oss, className, this->getName() + "_");
[313]328      }
[775]329
330
[313]331      template <typename T>
332      void CAttributeTemplate<T>::generateFortranInterfaceGetBody_(ostream& oss,const string& className)
333      {
[778]334        CInterface::AttributeFortranInterfaceGetBody<T>(oss, className, this->getName());
[313]335      }
336
337      template <typename T>
338      void CAttributeTemplate<T>::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className)
339      {
[778]340        CInterface::AttributeFortranInterfaceGetDeclaration<T>(oss, className, this->getName());
[313]341      }
[432]342
[775]343
344/*
[219]345      //---------------------------------------------------------------
346
[775]347      // Spécialisations des templates pour la fonction [toString]
[219]348
349      template <>
350         StdString CAttributeTemplate<bool>::toString(void) const;
351
352      //---------------------------------------------------------------
353
[775]354      // Spécialisations des templates pour la fonction [fromString]
[219]355
356      template <> // Chaîne de caractÚres.
357         void CAttributeTemplate<StdString>::fromString(const StdString & str);
358
359      template <> // Entier
360         void CAttributeTemplate<int>::fromString(const StdString & str);
361
362      template <> // Booléen
363         void CAttributeTemplate<bool>::fromString(const StdString & str);
364
365      template <> // Double
366         void CAttributeTemplate<double>::fromString(const StdString & str);
367
368      template<> // Tableau
369         void CAttributeTemplate<ARRAY(double, 1)>::fromString(const StdString & str);
370
371      //---------------------------------------------------------------
372
[369]373      // Spécialisations des templates pour la fonction [toBinary] //
[219]374
375      template <> // Chaîne de caractÚres.
376         void CAttributeTemplate<StdString>::toBinary (StdOStream & os) const;
377
378      template <> // Entier
379         void CAttributeTemplate<int>::toBinary(StdOStream & os) const;
380
381      template <> // Booléen
382         void CAttributeTemplate<bool>::toBinary(StdOStream & os) const;
[775]383
[219]384      template <> // Double
385         void CAttributeTemplate<double>::toBinary(StdOStream & os) const;
386
387      //---------------------------------------------------------------
388
[369]389      // Spécialisations des templates pour la fonction [fromBinary] //
[219]390
391      template <> // Chaîne de caractÚres.
392         void CAttributeTemplate<StdString>::fromBinary(StdIStream & is);
393
394      template <> // Entier
395         void CAttributeTemplate<int>::fromBinary(StdIStream & is);
396
397      template <> // Booléen
398         void CAttributeTemplate<bool>::fromBinary(StdIStream & is);
[775]399
[219]400      template <> // Double
401         void CAttributeTemplate<double>::fromBinary(StdIStream & is);
402
403      ///--------------------------------------------------------------
[775]404*/
[335]405} // namespace xios
[219]406
[591]407#endif // __XIOS_CAttributeTemplate_impl__
Note: See TracBrowser for help on using the repository browser.