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