00001 #ifndef DBALLE_CPP_VAR_H 00002 #define DBALLE_CPP_VAR_H 00003 00004 #include <dballe/core/var.h> 00005 00006 #include <dballe++/error.h> 00007 00008 namespace dballe { 00009 00013 class Varinfo 00014 { 00015 dba_varinfo m_info; 00016 00017 public: 00018 Varinfo(dba_varinfo info) : m_info(info) {} 00019 Varinfo(dba_varcode code); 00020 00022 dba_varcode var() const { return m_info->var; } 00024 const char* desc() const { return m_info->desc; } 00026 const char* unit() const { return m_info->unit; } 00029 int scale() const { return m_info->scale; } 00032 int ref() const { return m_info->ref; } 00035 int len() const { return m_info->len; } 00038 int bit_ref() const { return m_info->bit_ref; } 00041 int bit_len() const { return m_info->bit_len; } 00043 bool is_string() const { return m_info->is_string != 0; } 00045 int imin() const { return m_info->imin; } 00047 int imax() const { return m_info->imax; } 00049 double dmin() const { return m_info->dmin; } 00051 double dmax() const { return m_info->dmax; } 00052 00053 dba_varinfo raw() const { return m_info; } 00054 00056 static Varinfo create(dba_varcode code); 00057 }; 00058 00062 class Var 00063 { 00064 dba_var m_var; 00065 00066 public: 00068 Var(dba_var var) : m_var(var) {} 00069 00071 static Var clone(dba_var var); 00072 00074 Var(const Var& var) 00075 { 00076 checked(dba_var_copy(var.var(), &m_var)); 00077 } 00079 Var(dba_varcode code) 00080 { 00081 checked(dba_var_create_local(code, &m_var)); 00082 } 00084 Var(Varinfo info) 00085 { 00086 checked(dba_var_create(info.raw(), &m_var)); 00087 } 00089 Var(dba_varcode code, int val) 00090 { 00091 Varinfo info(code); 00092 checked(dba_var_createi(info.raw(), val, &m_var)); 00093 } 00095 Var(Varinfo info, int val) 00096 { 00097 checked(dba_var_createi(info.raw(), val, &m_var)); 00098 } 00100 Var(dba_varcode code, double val) 00101 { 00102 Varinfo info(code); 00103 checked(dba_var_created(info.raw(), val, &m_var)); 00104 } 00106 Var(Varinfo info, double val) 00107 { 00108 checked(dba_var_created(info.raw(), val, &m_var)); 00109 } 00111 Var(dba_varcode code, const char* val) 00112 { 00113 Varinfo info(code); 00114 checked(dba_var_createc(info.raw(), val, &m_var)); 00115 } 00117 Var(Varinfo info, const char* val) 00118 { 00119 checked(dba_var_createc(info.raw(), val, &m_var)); 00120 } 00122 Var(dba_varcode code, const std::string& val) 00123 { 00124 Varinfo info(code); 00125 checked(dba_var_createc(info.raw(), val.c_str(), &m_var)); 00126 } 00128 Var(Varinfo info, const std::string& val) 00129 { 00130 checked(dba_var_createc(info.raw(), val.c_str(), &m_var)); 00131 } 00132 ~Var() 00133 { 00134 if (m_var) 00135 dba_var_delete(m_var); 00136 } 00137 00139 Var& operator=(const Var& var) 00140 { 00141 dba_var_delete(m_var); 00142 m_var = 0; 00143 checked(dba_var_copy(var.var(), &m_var)); 00144 return *this; 00145 } 00146 00148 bool operator==(int val) const { return enqi() == val; } 00150 bool operator==(double val) const { return enqd() == val; } 00152 bool operator==(const char* val) const; 00154 bool operator==(const std::string& val) const { return enqs() == val; } 00156 bool operator==(const Var& var) const { return dba_var_equals(m_var, var.m_var) == 1; } 00157 00159 Var copy() const 00160 { 00161 dba_var res; 00162 checked(dba_var_copy(m_var, &res)); 00163 return Var(res); 00164 } 00165 00167 bool equals(const Var& var) const 00168 { 00169 return dba_var_equals(m_var, var.var()) == 1; 00170 } 00171 00173 int enqi() const 00174 { 00175 int res; 00176 checked(dba_var_enqi(m_var, &res)); 00177 return res; 00178 } 00180 double enqd() const 00181 { 00182 double res; 00183 checked(dba_var_enqd(m_var, &res)); 00184 return res; 00185 } 00187 const char* enqc() const 00188 { 00189 const char* res; 00190 checked(dba_var_enqc(m_var, &res)); 00191 return res; 00192 } 00194 std::string enqs() const 00195 { 00196 const char* res; 00197 checked(dba_var_enqc(m_var, &res)); 00198 return res; 00199 } 00200 00202 void set(int val) 00203 { 00204 checked(dba_var_seti(m_var, val)); 00205 } 00207 void set(double val) 00208 { 00209 checked(dba_var_setd(m_var, val)); 00210 } 00212 void set(const char* val) 00213 { 00214 checked(dba_var_setc(m_var, val)); 00215 } 00217 void set(const std::string& val) 00218 { 00219 checked(dba_var_setc(m_var, val.c_str())); 00220 } 00221 00223 bool isset() const 00224 { 00225 return dba_var_value(m_var) != NULL; 00226 } 00227 00229 void unset() 00230 { 00231 checked(dba_var_unset(m_var)); 00232 } 00233 00235 dba_varcode code() const 00236 { 00237 return dba_var_code(m_var); 00238 } 00239 00241 Varinfo info() const 00242 { 00243 return Varinfo(dba_var_info(m_var)); 00244 } 00245 00247 std::string format(const std::string& nullValue = "(undef)") const 00248 { 00249 if (dba_var_value(m_var) == NULL) 00250 return nullValue; 00251 else if (dba_var_info(m_var)->is_string) 00252 return dba_var_value(m_var); 00253 else 00254 { 00255 dba_varinfo info = dba_var_info(m_var); 00256 char buf[20]; 00257 snprintf(buf, 20, "%.*f", info->scale > 0 ? info->scale : 0, enqd()); 00258 return buf; 00259 } 00260 } 00261 00263 const char* raw() const 00264 { 00265 return dba_var_value(m_var); 00266 } 00267 00269 const dba_var var() const 00270 { 00271 return m_var; 00272 } 00274 dba_var var() 00275 { 00276 return m_var; 00277 } 00278 }; 00279 00280 } 00281 00282 #endif