source: XIOS/branchs/xios-1.0/src/node/variable.hpp @ 530

Last change on this file since 530 was 530, checked in by rlacroix, 7 years ago

Fix: String variable with whitespaces were incorrectly parsed.

The strings were only parsed until the first whitespace was encountered. Note that leading and trailing whitespaces are removed by design.

Also backport that fix to XIOS 1.0.

This commit fixes ticket #60.

  • 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: 4.3 KB
Line 
1#ifndef __XMLIO_CVariable__
2#define __XMLIO_CVariable__
3
4/// xios headers ///
5#include "xmlioserver_spl.hpp"
6#include "declare_group.hpp"
7#include "group_template.hpp"
8#include "array_new.hpp"
9
10namespace xios
11{
12      /// ////////////////////// Déclarations ////////////////////// ///
13
14      class CVariableGroup;
15      class CVariableAttributes;
16      class CVariable;
17      class CContext;
18      ///--------------------------------------------------------------
19
20      // Declare/Define CVarAttribute
21      BEGIN_DECLARE_ATTRIBUTE_MAP(CVariable)
22#include "var_attribute.conf"
23      END_DECLARE_ATTRIBUTE_MAP(CVariable)
24
25      ///--------------------------------------------------------------
26
27      class CVariable
28         : public CObjectTemplate<CVariable>
29         , public CVariableAttributes
30      {
31            enum EEventId
32            {
33             EVENT_ID_VARIABLE_VALUE
34            };
35
36            /// typedef ///
37            typedef CObjectTemplate<CVariable>   SuperClass;
38            typedef CVariableAttributes SuperClassAttribute;
39
40            friend class CVariableGroup;
41
42         public :
43
44            typedef CVariableAttributes RelAttributes;
45            typedef CVariableGroup      RelGroup;
46
47            /// Constructeurs ///
48            CVariable(void);
49            explicit CVariable(const StdString & id);
50            CVariable(const CVariable & var);       // Not implemented yet.
51            CVariable(const CVariable * const var); // Not implemented yet.
52
53            /// Destructeur ///
54            virtual ~CVariable(void);
55
56         public :
57            enum EVarType
58            {  t_int, t_short_int, t_long_int, t_float, t_double, t_long_double, t_bool, t_string, t_undefined } ;
59
60
61            /// Autres ///
62            virtual void parse(xml::CXMLNode & node);
63            virtual StdString toString(void) const;
64
65            /// Accesseur ///
66            const StdString & getContent (void) const;
67
68            void setContent(const StdString& content);
69
70
71            template <typename T> inline T getData(void) const;
72            template <typename T> inline void setData(T data);
73
74            template <typename T, StdSize N>
75            inline void getData(CArray<T, N>& _data_array) const;
76
77            EVarType getVarType(void) const ;
78
79            static bool dispatchEvent(CEventServer& event) ;
80
81            //! Sending a request to set up variable data
82            void sendValue();
83
84            static void recvValue(CEventServer& event) ;
85            void recvValue(CBufferIn& buffer) ;
86
87         public :
88
89            /// Accesseurs statiques ///
90            static StdString GetName(void);
91            static StdString GetDefName(void);
92            static ENodeType GetType(void);
93
94         private :
95
96            StdString content;
97
98      }; // class CVar
99
100      template <typename T>
101      inline T CVariable::getData(void) const
102      {
103         T retval ;
104         std::stringstream sstr(std::stringstream::in | std::stringstream::out);
105         sstr<<content ;
106         sstr>>retval ;
107         if (sstr.fail()) ERROR("CVariable::getdata()",
108               << "Cannot convert string <" << content << "> into type required" );
109         return retval ;
110      }
111
112      template<>
113      inline bool CVariable::getData(void) const
114      {
115         if (content.compare("true")==0 || content.compare(".true.")==0 || content.compare(".TRUE.")==0) return true ;
116         else if (content.compare("false")==0 || content.compare(".false.")==0 || content.compare(".FALSE.")==0) return false ;
117         else ERROR("CVariable::getdata()",
118               << "Cannot convert string <" << content << "> into type required" );
119         return false ;
120      }
121
122      template<>
123      inline std::string CVariable::getData(void) const
124      { return content; }
125
126      template<>
127      inline void CVariable::setData(bool data)
128      {
129        if (true == data) content.assign("true");
130        else content.assign("false");
131      }
132
133      template <typename T>
134      inline void CVariable::setData(T data)
135      {
136        std::stringstream sstr;
137        sstr<<data;
138        content = sstr.str();
139      }
140
141      ///--------------------------------------------------------------
142
143      // Declare/Define CVarGroup and CVarDefinition
144      DECLARE_GROUP_PARSE_REDEF(CVariable);
145
146
147
148} // namespace xios
149
150#endif // __XMLIO_CVariable__
Note: See TracBrowser for help on using the repository browser.