source: XIOS/branchs/xios-1.0/src/attribute_enum_impl.hpp @ 580

Last change on this file since 580 was 580, checked in by rlacroix, 6 years ago

Fix: getInheritedStringValue could return an incorrect value.

The non-inherited value was always used even when it was empty and inheritence should have been used.

  • 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: 5.5 KB
Line 
1#ifndef __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__
2#define __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__
3
4#include "enum.hpp"
5#include "buffer_in.hpp"
6#include "buffer_out.hpp"
7#include "generate_interface.hpp"
8#include "attribute_enum.hpp"
9
10
11namespace xios
12{
13  /// ////////////////////// Définitions ////////////////////// ///
14  template <class T>
15  CAttributeEnum<T>::CAttributeEnum(const StdString & id)
16     : CAttribute(id)
17  { /* Ne rien faire de plus */ }
18
19  template <class T>
20  CAttributeEnum<T>::CAttributeEnum(const StdString & id, const T_enum & value)
21     : CAttribute(id)
22  {
23     this->setValue(value);
24  }
25
26  template <class T>
27  CAttributeEnum<T>::CAttributeEnum(const StdString & id,
28                                    xios_map<StdString, CAttribute*> & umap)
29     : CAttribute(id)
30  {
31     umap.insert(umap.end(), std::make_pair(id, this));
32  }
33
34  template <class T>
35  CAttributeEnum<T>::CAttributeEnum
36        (const StdString & id, const T_enum & value,
37         xios_map<StdString, CAttribute*> & umap)
38     : CAttribute(id)
39  {
40     this->setValue(value);
41     umap.insert(umap.end(), std::make_pair(id, this));
42  }
43
44  ///--------------------------------------------------------------
45  template <class T>
46  void CAttributeEnum<T>::reset(void)
47  {
48     CEnum<T>::reset();
49     inheritedValue.reset();
50  }
51
52  template <class T>
53  typename T::t_enum CAttributeEnum<T>::getValue(void) const
54  {
55     return CEnum<T>::get();
56  }
57
58  template <class T>
59  string CAttributeEnum<T>::getStringValue(void) const
60  {
61     return CEnum<T>::toString();
62  }
63
64  template <class T>
65  void CAttributeEnum<T>::setValue(const typename T::t_enum & value)
66  {
67     CEnum<T>::set(value);
68  }
69
70  template <class T>
71  void CAttributeEnum<T>::set(const CAttribute& attr)
72  {
73    this->set(dynamic_cast<const CAttributeEnum<T>& >(attr));
74  }
75
76  template <class T>
77  void CAttributeEnum<T>::set(const CAttributeEnum& attr)
78  {
79    CEnum<T>::set(attr);
80  }
81
82  template <class T>
83  void CAttributeEnum<T>::setInheritedValue(const CAttribute& attr)
84  {
85    this->setInheritedValue(dynamic_cast<const CAttributeEnum<T>& >(attr));
86  }
87
88  template <class T>
89  void CAttributeEnum<T>::setInheritedValue(const CAttributeEnum& attr)
90  {
91    if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue());
92  }
93
94  template <class T>
95  typename T::t_enum CAttributeEnum<T>::getInheritedValue(void) const
96  {
97    if (this->isEmpty()) return inheritedValue.get();
98    else return getValue();
99  }
100
101  template <class T>
102  string CAttributeEnum<T>::getInheritedStringValue(void) const
103  {
104     if (this->isEmpty()) return inheritedValue.toString();
105     else return CEnum<T>::toString();
106  }
107
108  template <class T>
109  bool CAttributeEnum<T>::hasInheritedValue(void) const
110  {
111    return !this->isEmpty() || !inheritedValue.isEmpty();
112  }
113
114  //---------------------------------------------------------------
115
116  template <class T>
117  CAttributeEnum<T>& CAttributeEnum<T>::operator=(const T_enum & value)
118  {
119     this->setValue(value);
120     return *this;
121  }
122
123  //---------------------------------------------------------------
124
125  template <class T>
126  StdString CAttributeEnum<T>::_toString(void) const
127  {
128     StdOStringStream oss;
129     if (!CEnum<T>::isEmpty() && this->hasId())
130        oss << this->getName() << "=\"" << CEnum<T>::toString() << "\"";
131     return (oss.str());
132  }
133
134  template <class T>
135  void CAttributeEnum<T>::_fromString(const StdString & str)
136  {
137    CEnum<T>::fromString(str);
138  }
139
140  template <class T>
141  bool CAttributeEnum<T>::_toBuffer (CBufferOut& buffer) const
142  {
143     return CEnum<T>::toBuffer(buffer);
144  }
145
146  template <class T>
147  bool CAttributeEnum<T>::_fromBuffer(CBufferIn& buffer)
148  {
149    return CEnum<T>::fromBuffer(buffer);
150  }
151
152  template <typename T>
153  void CAttributeEnum<T>::generateCInterface(ostream& oss,const string& className)
154  {
155    CInterface::AttributeCInterface<CEnumBase>(oss, className, this->getName());
156  }
157
158  template <typename T>
159  void CAttributeEnum<T>::generateFortran2003Interface(ostream& oss,const string& className)
160  {
161    CInterface::AttributeFortran2003Interface<string>(oss, className, this->getName());
162  }
163
164  template <typename T>
165  void CAttributeEnum<T>::generateFortranInterfaceDeclaration_(ostream& oss,const string& className)
166  {
167    CInterface::AttributeFortranInterfaceDeclaration<string>(oss, className, this->getName()+"_");
168  }
169
170  template <typename T>
171  void CAttributeEnum<T>::generateFortranInterfaceBody_(ostream& oss,const string& className)
172  {
173    CInterface::AttributeFortranInterfaceBody<string>(oss, className, this->getName());
174  }
175
176  template <typename T>
177  void CAttributeEnum<T>::generateFortranInterfaceDeclaration(ostream& oss,const string& className)
178  {
179    CInterface::AttributeFortranInterfaceDeclaration<string>(oss, className, this->getName());
180  }
181
182  template <typename T>
183  void CAttributeEnum<T>::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className)
184  {
185    CInterface::AttributeFortranInterfaceGetDeclaration<string>(oss, className, this->getName()+"_");
186  }
187
188  template <typename T>
189  void CAttributeEnum<T>::generateFortranInterfaceGetBody_(ostream& oss,const string& className)
190  {
191    CInterface::AttributeFortranInterfaceGetBody<string>(oss, className, this->getName());
192  }
193
194  template <typename T>
195  void CAttributeEnum<T>::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className)
196  {
197    CInterface::AttributeFortranInterfaceGetDeclaration<string>(oss, className, this->getName());
198  }
199} // namespace xios
200
201#endif // __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__
Note: See TracBrowser for help on using the repository browser.