1 #include <ail/string.hpp>
2 #include <frith/symbol.hpp>
8 std::string
const zero_division_error_message
= "Zero division error";
11 unary_argument::unary_argument(variable
& output
, std::string
& error_message
):
13 error_message(error_message
)
17 binary_argument::binary_argument(variable
const & other
, variable
& output
, std::string
& error_message
):
20 error_message(error_message
)
25 type(variable_type_identifier::undefined
)
29 variable::variable(variable
const & other
):
34 case variable_type_identifier::boolean
:
35 boolean
= other
.boolean
;
38 case variable_type_identifier::signed_integer
:
39 signed_integer
= other
.signed_integer
;
42 case variable_type_identifier::unsigned_integer
:
43 unsigned_integer
= other
.unsigned_integer
;
46 case variable_type_identifier::floating_point_value
:
47 floating_point_value
= other
.floating_point_value
;
50 case variable_type_identifier::string
:
51 string
= new std::string(*other
.string
);
54 case variable_type_identifier::array
:
55 array
= new types::vector(*other
.array
);
58 case variable_type_identifier::map
:
59 map
= new types::map(*other
.map
);
68 case variable_type_identifier::string
:
72 case variable_type_identifier::array
:
76 case variable_type_identifier::map
:
82 types::floating_point_value
variable::get_floating_point_value() const
86 case variable_type_identifier::signed_integer
:
87 return signed_integer
;
89 case variable_type_identifier::unsigned_integer
:
90 return unsigned_integer
;
92 case variable_type_identifier::floating_point_value
:
93 return floating_point_value
;
96 throw ail::exception("Failed to retrieve floating point value");
99 bool variable::get_string_representation(std::string
& output
) const
103 case variable_type_identifier::boolean
:
104 output
= ail::bool_to_string(boolean
);
107 case variable_type_identifier::signed_integer
:
108 output
= ail::number_to_string
<types::signed_integer
>(signed_integer
);
111 case variable_type_identifier::unsigned_integer
:
112 output
= ail::number_to_string
<types::unsigned_integer
>(unsigned_integer
);
115 case variable_type_identifier::floating_point_value
:
116 output
= ail::number_to_string
<types::floating_point_value
>(floating_point_value
);
126 bool variable::get_boolean_value(bool & output
) const
130 case variable_type_identifier::boolean
:
134 case variable_type_identifier::signed_integer
:
135 output
= signed_integer
!= 0;
138 case variable_type_identifier::unsigned_integer
:
139 output
= unsigned_integer
!= 0;
149 bool variable::is_zero() const
153 case variable_type_identifier::signed_integer
:
154 return signed_integer
== 0;
156 case variable_type_identifier::unsigned_integer
:
157 return unsigned_integer
== 0;
159 case variable_type_identifier::floating_point_value
:
160 return floating_point_value
== 0.0;
163 throw ail::exception("Unable to check if variable is zero");
166 bool variable::operator<(variable
const & other
) const
168 if(is_numeric_type() && other
.is_numeric_type())
172 type
== variable_type_identifier::floating_point_value
||
173 other
.type
== variable_type_identifier::floating_point_value
175 return get_floating_point_value() < other
.get_floating_point_value();
178 type
== variable_type_identifier::unsigned_integer
&&
179 other
.type
== variable_type_identifier::unsigned_integer
181 return unsigned_integer
< other
.unsigned_integer
;
183 return signed_integer
< other
.signed_integer
;
185 else if(type
!= other
.type
)
186 return static_cast<word
>(type
) < static_cast<word
>(other
.type
);
189 if(type
== variable_type_identifier::string
)
190 return *string
< *other
.string
;
192 return hash() < other
.hash();
196 std::string
get_type_string(variable_type type
)
200 case variable_type_identifier::undefined
:
203 case variable_type_identifier::nil
:
206 case variable_type_identifier::none
:
209 case variable_type_identifier::boolean
:
212 case variable_type_identifier::signed_integer
:
215 case variable_type_identifier::unsigned_integer
:
216 return "unsigned-integer";
218 case variable_type_identifier::floating_point_value
:
221 case variable_type_identifier::string
:
224 case variable_type_identifier::array
:
227 case variable_type_identifier::map
:
230 case variable_type_identifier::function
:
233 case variable_type_identifier::object
: