35 #define snprintf _snprintf
41 : m_have_bool(false), m_have_int(false), m_have_double(false),
42 m_have_string(false), m_val_bool(false), m_val_int(0), m_val_double(0.0),
43 m_val(
""), m_scope(GLOBAL)
47 VarBase::VarBase(
const VarBase& c)
48 : sigc::trackable(c), m_have_bool(c.m_have_bool), m_have_int(c.m_have_int),
49 m_have_double(c.m_have_double), m_have_string(c.m_have_string),
50 m_val_bool(c.m_val_bool), m_val_int(c.m_val_int),
51 m_val_double(c.m_val_double), m_val(c.m_val), m_scope(GLOBAL)
55 VarBase::VarBase(
bool b)
56 : m_have_bool(true), m_have_int(false), m_have_double(false),
57 m_have_string(true), m_val_bool(b), m_val_int(0), m_val_double(0.0),
60 m_val = (b ?
"true" :
"false");
63 VarBase::VarBase(
int i)
64 : m_have_bool(false), m_have_int(true), m_have_double(false),
65 m_have_string(true), m_val_bool(false), m_val_int(i), m_val_double(0.0),
69 snprintf(buf, 1024,
"%d", i);
73 VarBase::VarBase(
double d)
74 : m_have_bool(false), m_have_int(false), m_have_double(true),
75 m_have_string(true), m_val_bool(false), m_val_int(0), m_val_double(d),
79 snprintf(buf, 1024,
"%lf", d);
83 VarBase::VarBase(std::string s)
84 : m_have_bool(false), m_have_int(false), m_have_double(false),
85 m_have_string(true), m_val_bool(false), m_val_int(0), m_val_double(0.0),
86 m_val(std::move(s)), m_scope(GLOBAL)
90 VarBase::VarBase(
const char* s)
91 : m_have_bool(false), m_have_int(false), m_have_double(false),
92 m_have_string(true), m_val_bool(false), m_val_int(0), m_val_double(0.0),
93 m_val(s), m_scope(GLOBAL)
97 VarBase::~VarBase() =
default;
99 std::ostream& operator<<( std::ostream& out,
const VarBase& v)
101 for (
char i : v.m_val) {
102 if (i ==
'"') out <<
'\\';
103 else if (i ==
'\\') out <<
'\\';
109 bool operator ==(
const VarBase& one,
const VarBase& two)
111 return one.m_val == two.m_val;
116 bool operator !=(
const VarBase& one,
const VarBase& two)
118 return !(one == two);
121 VarBase& VarBase::operator=(
const VarBase& c)
123 if (&c ==
this)
return (*
this);
124 m_have_bool = c.m_have_bool; m_have_int = c.m_have_int;
125 m_have_double = c.m_have_double; m_have_string = c.m_have_string;
126 m_val_bool = c.m_val_bool; m_val_int = c.m_val_int;
127 m_val_double = c.m_val_double; m_val = c.m_val;
132 VarBase& VarBase::operator=(
bool b)
134 m_have_bool =
true; m_have_int =
false;
135 m_have_double =
false; m_have_string =
true;
136 m_val_bool = b; m_val_int = 0;
137 m_val_double = 0.0; m_val = (b ?
"true" :
"false");
142 VarBase& VarBase::operator=(
int i)
144 m_have_bool =
false; m_have_int =
true;
145 m_have_double =
false; m_have_string =
true;
146 m_val_bool =
false; m_val_int = i;
148 char buf[1024]; snprintf(buf, 1024,
"%d", i);
154 VarBase& VarBase::operator=(
double d)
156 m_have_bool =
false; m_have_int =
false;
157 m_have_double =
true; m_have_string =
true;
158 m_val_bool =
false; m_val_int = 0;
160 char buf[1024]; snprintf(buf, 1024,
"%lf", d);
166 VarBase& VarBase::operator=(
const std::string& s)
168 m_have_bool =
false; m_have_int =
false;
169 m_have_double =
false; m_have_string =
true;
170 m_val_bool =
false; m_val_int = 0;
171 m_val_double = 0.0; m_val = s;
176 VarBase& VarBase::operator=(
const char* s)
178 m_have_bool =
false; m_have_int =
false;
179 m_have_double =
false; m_have_string =
true;
180 m_val_bool =
false; m_val_int = 0;
181 m_val_double = 0.0; m_val = s;
186 VarBase::operator bool()
const
189 m_val_bool = (m_val ==
"on") ||
199 VarBase::operator int()
const
202 m_val_int = atoi(m_val.c_str());
208 VarBase::operator double()
const
210 if (!m_have_double) {
211 m_val_double = atof(m_val.c_str());
212 m_have_double =
true;
217 VarBase::operator std::string()
const
222 bool VarBase::is_bool()
224 if (!is_string())
return false;
225 return (m_val ==
"on") || (m_val ==
"off")
226 || (m_val ==
"1") || (m_val ==
"0")
227 || (m_val ==
"true") || (m_val ==
"false")
228 || (m_val ==
"yes") || (m_val ==
"no")
229 || (m_val ==
"y") || (m_val ==
"n");
232 bool VarBase::is_int()
234 if (!is_string())
return false;
235 for (
char i : m_val)
if (!isdigit(i))
240 bool VarBase::is_double()
242 if (!is_string())
return false;
249 strtod(m_val.c_str(), &p);
251 return p == m_val.c_str() + m_val.size();
254 bool VarBase::is_string()
256 return m_have_string;
259 Variable::Variable (
const Variable& c) : VarPtr(c.is_array()
260 ? VarPtr(new VarArray(*(c.array()))) : static_cast<const VarPtr&>(c))
265 Variable::Variable(
const int n,
const Variable& v)
266 : VarPtr(new VarArray(n, v))
271 Variable::Variable(
const VarList& v) : VarPtr(new VarArray(v))
276 Variable::~Variable() =
default;
278 Variable& Variable::operator=(
const Variable& c)
280 VarList *array_val = c.array();
283 VarPtr::operator=(
new VarArray(*array_val));
285 VarPtr::operator=(c);
289 Variable& Variable::operator=( VarBase* vb)
291 VarPtr::operator=(vb);
295 Variable& Variable::operator=(
const bool b)
297 VarPtr::operator=(
new VarBase(b));
301 Variable& Variable::operator=(
const int i)
303 VarPtr::operator=(
new VarBase(i));
307 Variable& Variable::operator=(
const double d)
309 VarPtr::operator=(
new VarBase(d));
313 Variable& Variable::operator=(
const std::string& s)
315 VarPtr::operator=(
new VarBase(s));
319 Variable& Variable::operator=(
const char* s)
321 VarPtr::operator=(
new VarBase(s));
325 Variable& Variable::operator=(
const VarList& v)
327 VarPtr::operator=(
new VarArray(v));
331 Variable& Variable::operator[](
const int i)
333 std::vector<Variable> *the_array = array();
336 auto *new_array =
new VarArray(i + 1);
337 (*new_array)[0] = *
this;
338 VarPtr::operator=(new_array);
339 the_array = new_array;
341 else if ((
int)the_array->size() < i + 1)
342 the_array->resize(i + 1);
344 return (*the_array)[i];
348 VarArray::~VarArray() =
default;
350 std::ostream& operator<<( std::ostream& out,
const VarArray& v)
366 bool operator ==(
const VarArray& one,
const VarArray& two)
368 if(one.size() != two.size())
371 VarArray::const_iterator i1, i2;
373 for(i1 = one.begin(), i2 = two.begin(); i1 != one.end(); ++i1, ++i2)
374 if(i1->elem() != i2->elem())
380 VarArray::operator bool()
const
385 VarArray::operator int()
const
390 VarArray::operator double()
const
395 VarArray::operator std::string()
const
401 bool VarArray::is_bool()
406 bool VarArray::is_int()
411 bool VarArray::is_double()
416 bool VarArray::is_string()