36 : m_have_bool(false), m_have_int(false), m_have_double(false),
37 m_have_string(false), m_val_bool(false), m_val_int(0), m_val_double(0.0),
38 m_val(
""), m_scope(GLOBAL)
42 VarBase::VarBase(
const VarBase& c)
43 : sigc::trackable(c), m_have_bool(c.m_have_bool), m_have_int(c.m_have_int),
44 m_have_double(c.m_have_double), m_have_string(c.m_have_string),
45 m_val_bool(c.m_val_bool), m_val_int(c.m_val_int),
46 m_val_double(c.m_val_double), m_val(c.m_val), m_scope(GLOBAL)
50 VarBase::VarBase(
bool b)
51 : m_have_bool(true), m_have_int(false), m_have_double(false),
52 m_have_string(true), m_val_bool(b), m_val_int(0), m_val_double(0.0),
55 m_val = (b ?
"true" :
"false");
58 VarBase::VarBase(
int i)
59 : m_have_bool(false), m_have_int(true), m_have_double(false),
60 m_have_string(true), m_val_bool(false), m_val_int(i), m_val_double(0.0),
61 m_val(
std::to_string(i)), m_scope(GLOBAL)
65 VarBase::VarBase(
double d)
66 : m_have_bool(false), m_have_int(false), m_have_double(true),
67 m_have_string(true), m_val_bool(false), m_val_int(0), m_val_double(d),
68 m_val(
std::to_string(d)), m_scope(GLOBAL)
72 VarBase::VarBase(std::string s)
73 : m_have_bool(false), m_have_int(false), m_have_double(false),
74 m_have_string(true), m_val_bool(false), m_val_int(0), m_val_double(0.0),
75 m_val(
std::move(s)), m_scope(GLOBAL)
79 VarBase::VarBase(
const char* s)
80 : m_have_bool(false), m_have_int(false), m_have_double(false),
81 m_have_string(true), m_val_bool(false), m_val_int(0), m_val_double(0.0),
82 m_val(s), m_scope(GLOBAL)
86 VarBase::~VarBase() =
default;
88 std::ostream& operator<<( std::ostream& out,
const VarBase& v)
90 for (
char i : v.m_val) {
91 if (i ==
'"' || i ==
'\\') {
99 bool operator ==(
const VarBase& one,
const VarBase& two)
101 return one.m_val == two.m_val;
106 bool operator !=(
const VarBase& one,
const VarBase& two)
108 return !(one == two);
111 VarBase& VarBase::operator=(
const VarBase& c)
113 if (&c ==
this)
return (*
this);
114 m_have_bool = c.m_have_bool; m_have_int = c.m_have_int;
115 m_have_double = c.m_have_double; m_have_string = c.m_have_string;
116 m_val_bool = c.m_val_bool; m_val_int = c.m_val_int;
117 m_val_double = c.m_val_double; m_val = c.m_val;
122 VarBase& VarBase::operator=(
bool b)
124 m_have_bool =
true; m_have_int =
false;
125 m_have_double =
false; m_have_string =
true;
126 m_val_bool = b; m_val_int = 0;
127 m_val_double = 0.0; m_val = (b ?
"true" :
"false");
132 VarBase& VarBase::operator=(
int i)
134 m_have_bool =
false; m_have_int =
true;
135 m_have_double =
false; m_have_string =
true;
136 m_val_bool =
false; m_val_int = i;
138 m_val = std::to_string(i);
143 VarBase& VarBase::operator=(
double d)
145 m_have_bool =
false; m_have_int =
false;
146 m_have_double =
true; m_have_string =
true;
147 m_val_bool =
false; m_val_int = 0;
149 m_val = std::to_string(d);
154 VarBase& VarBase::operator=(
const std::string& s)
156 m_have_bool =
false; m_have_int =
false;
157 m_have_double =
false; m_have_string =
true;
158 m_val_bool =
false; m_val_int = 0;
159 m_val_double = 0.0; m_val = s;
164 VarBase& VarBase::operator=(
const char* s)
166 m_have_bool =
false; m_have_int =
false;
167 m_have_double =
false; m_have_string =
true;
168 m_val_bool =
false; m_val_int = 0;
169 m_val_double = 0.0; m_val = s;
174 VarBase::operator bool()
const 177 m_val_bool = (m_val ==
"on") ||
187 VarBase::operator int()
const 190 m_val_int = atoi(m_val.c_str());
196 VarBase::operator double()
const 198 if (!m_have_double) {
199 m_val_double = atof(m_val.c_str());
200 m_have_double =
true;
205 VarBase::operator std::string()
const 210 bool VarBase::is_bool()
212 if (!is_string())
return false;
213 return (m_val ==
"on") || (m_val ==
"off")
214 || (m_val ==
"1") || (m_val ==
"0")
215 || (m_val ==
"true") || (m_val ==
"false")
216 || (m_val ==
"yes") || (m_val ==
"no")
217 || (m_val ==
"y") || (m_val ==
"n");
220 bool VarBase::is_int()
222 if (!is_string())
return false;
223 for (
char i : m_val)
if (!isdigit(i))
228 bool VarBase::is_double()
230 if (!is_string())
return false;
237 strtod(m_val.c_str(), &p);
239 return p == m_val.c_str() + m_val.size();
242 bool VarBase::is_string()
244 return m_have_string;
247 Variable::Variable (
const Variable& c) : VarPtr(c.is_array()
248 ? VarPtr(new VarArray(*(c.array()))) : static_cast<const VarPtr&>(c))
253 Variable::Variable(
const int n,
const Variable& v)
254 : VarPtr(new VarArray(n, v))
259 Variable::Variable(
const VarList& v) : VarPtr(new VarArray(v))
264 Variable::~Variable() =
default;
266 Variable& Variable::operator=(
const Variable& c)
268 VarList *array_val = c.array();
271 VarPtr::operator=(
new VarArray(*array_val));
273 VarPtr::operator=(c);
277 Variable& Variable::operator=( VarBase* vb)
279 VarPtr::operator=(vb);
283 Variable& Variable::operator=(
const bool b)
285 VarPtr::operator=(
new VarBase(b));
289 Variable& Variable::operator=(
const int i)
291 VarPtr::operator=(
new VarBase(i));
295 Variable& Variable::operator=(
const double d)
297 VarPtr::operator=(
new VarBase(d));
301 Variable& Variable::operator=(
const std::string& s)
303 VarPtr::operator=(
new VarBase(s));
307 Variable& Variable::operator=(
const char* s)
309 VarPtr::operator=(
new VarBase(s));
313 Variable& Variable::operator=(
const VarList& v)
315 VarPtr::operator=(
new VarArray(v));
319 Variable& Variable::operator[](
const int i)
321 std::vector<Variable> *the_array = array();
324 auto *new_array =
new VarArray(i + 1);
325 (*new_array)[0] = *
this;
326 VarPtr::operator=(new_array);
327 the_array = new_array;
329 else if ((
int)the_array->size() < i + 1)
330 the_array->resize(i + 1);
332 return (*the_array)[i];
336 VarArray::~VarArray() =
default;
338 std::ostream& operator<<( std::ostream& out,
const VarArray& v)
354 bool operator ==(
const VarArray& one,
const VarArray& two)
356 if(one.size() != two.size())
359 VarArray::const_iterator i1, i2;
361 for(i1 = one.begin(), i2 = two.begin(); i1 != one.end(); ++i1, ++i2)
362 if(i1->elem() != i2->elem())
368 VarArray::operator bool()
const 373 VarArray::operator int()
const 378 VarArray::operator double()
const 383 VarArray::operator std::string()
const 389 bool VarArray::is_bool()
394 bool VarArray::is_int()
399 bool VarArray::is_double()
404 bool VarArray::is_string()