libscratchcpp
A library for C++ based Scratch project players
Loading...
Searching...
No Matches
value.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4
5#include <algorithm>
6#include <limits>
7#include <ctgmath>
8#include <cassert>
9#include <iomanip>
10#include <iostream>
11#include <clocale>
12
13#include "value_functions.h"
14
15// NOTE: Put all logic in value functions so we can keep using this class in unit tests
16
17namespace libscratchcpp
18{
19
22{
23 public:
25 Value(double numberValue = 0.0)
26 {
27 value_init(&m_data);
28 value_assign_double(&m_data, numberValue);
29 }
30
32 template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
33 Value(T numberValue)
34 {
35 value_init(&m_data);
36 value_assign_double(&m_data, numberValue);
37 }
38
40 Value(bool boolValue)
41 {
42 value_init(&m_data);
43 value_assign_bool(&m_data, boolValue);
44 }
45
47 Value(const std::string &stringValue)
48 {
49 value_init(&m_data);
50 value_assign_string(&m_data, stringValue);
51 }
52
54 Value(const char *stringValue)
55 {
56 value_init(&m_data);
57 value_assign_cstring(&m_data, stringValue);
58 }
59
61 Value(const void *pointerValue)
62 {
63 value_init(&m_data);
64 value_assign_pointer(&m_data, pointerValue);
65 }
66
68 Value(const ValueData &v)
69 {
70 value_init(&m_data);
71 value_assign_copy(&m_data, &v);
72 }
73
74 Value(const Value &v)
75 {
76 value_init(&m_data);
77 value_assign_copy(&m_data, &v.m_data);
78 }
79
80 ~Value() { value_free(&m_data); }
81
86 const ValueData &data() const { return m_data; };
87
92 ValueData &data() { return m_data; }
93
95 ValueType type() const { return m_data.type; }
96
98 bool isInfinity() const { return value_isInfinity(&m_data); }
99
101 bool isNegativeInfinity() const { return value_isNegativeInfinity(&m_data); }
102
104 bool isNaN() const { return value_isNaN(&m_data); }
105
107 bool isNumber() const { return value_isNumber(&m_data); }
108
110 bool isValidNumber() const { return value_isValidNumber(&m_data); }
111
113 bool isInt() const { return value_isInt(&m_data); }
114
116 bool isBool() const { return value_isBool(&m_data); }
117
119 bool isString() const { return value_isString(&m_data); }
120
122 bool isPointer() const { return value_isPointer(&m_data); }
123
125 int toInt() const { return value_toInt(&m_data); }
126
128 long toLong() const { return value_toLong(&m_data); }
129
131 double toDouble() const { return value_toDouble(&m_data); };
132
134 bool toBool() const { return value_toBool(&m_data); };
135
137 std::string toString() const
138 {
139 std::string ret;
140 value_toString(&m_data, &ret);
141 return ret;
142 };
143
145 std::u16string toUtf16() const
146 {
147 std::u16string ret;
148 value_toUtf16(&m_data, &ret);
149 return ret;
150 }
151
153 Rgb toRgba() const { return value_toRgba(&m_data); }
154
156 const void *toPointer() const { return value_toPointer(&m_data); };
157
159 void add(const Value &v) { value_add(&m_data, &v.m_data, &m_data); }
160
162 void subtract(const Value &v) { value_subtract(&m_data, &v.m_data, &m_data); }
163
165 void multiply(const Value &v) { value_multiply(&m_data, &v.m_data, &m_data); }
166
168 void divide(const Value &v) { value_divide(&m_data, &v.m_data, &m_data); }
169
171 void mod(const Value &v) { value_mod(&m_data, &v.m_data, &m_data); }
172
173 const Value &operator=(double v)
174 {
175 value_assign_double(&m_data, v);
176 return *this;
177 }
178
179 template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
180 const Value &operator=(T v)
181 {
182 value_assign_double(&m_data, v);
183 return *this;
184 }
185
186 const Value &operator=(bool v)
187 {
188 value_assign_bool(&m_data, v);
189 return *this;
190 }
191
192 const Value &operator=(const std::string &v)
193 {
194 value_assign_string(&m_data, v);
195 return *this;
196 }
197
198 const Value &operator=(const char *v)
199 {
200 value_assign_cstring(&m_data, v);
201 return *this;
202 }
203
204 const Value &operator=(const void *v)
205 {
206 value_assign_pointer(&m_data, v);
207 return *this;
208 }
209
210 const Value &operator=(const ValueData &v)
211 {
212 value_assign_copy(&m_data, &v);
213 return *this;
214 }
215
216 const Value &operator=(const Value &v)
217 {
218 value_assign_copy(&m_data, &v.m_data);
219 return *this;
220 }
221
222 private:
223 ValueData m_data;
224
225 friend bool operator==(const Value &v1, const Value &v2) { return value_equals(&v1.m_data, &v2.m_data); }
226
227 friend bool operator!=(const Value &v1, const Value &v2) { return !value_equals(&v1.m_data, &v2.m_data); }
228
229 friend bool operator>(const Value &v1, const Value &v2) { return value_greater(&v1.m_data, &v2.m_data); }
230
231 friend bool operator<(const Value &v1, const Value &v2) { return value_lower(&v1.m_data, &v2.m_data); }
232
233 friend bool operator>=(const Value &v1, const Value &v2) { return v1 > v2 || v1 == v2; }
234
235 friend bool operator<=(const Value &v1, const Value &v2) { return v1 < v2 || v1 == v2; }
236
237 friend Value operator+(const Value &v1, const Value &v2)
238 {
239 Value ret;
240 value_add(&v1.m_data, &v2.m_data, &ret.m_data);
241 return ret;
242 }
243
244 friend Value operator-(const Value &v1, const Value &v2)
245 {
246 Value ret;
247 value_subtract(&v1.m_data, &v2.m_data, &ret.m_data);
248 return ret;
249 }
250
251 friend Value operator*(const Value &v1, const Value &v2)
252 {
253 Value ret;
254 value_multiply(&v1.m_data, &v2.m_data, &ret.m_data);
255 return ret;
256 }
257
258 friend Value operator/(const Value &v1, const Value &v2)
259 {
260 Value ret;
261 value_divide(&v1.m_data, &v2.m_data, &ret.m_data);
262 return ret;
263 }
264
265 friend Value operator%(const Value &v1, const Value &v2)
266 {
267 Value ret;
268 value_mod(&v1.m_data, &v2.m_data, &ret.m_data);
269 return ret;
270 }
271};
272
273} // namespace libscratchcpp
friend Value operator-(const Value &v1, const Value &v2)
Definition value.h:244
bool isString() const
Definition value.h:119
const Value & operator=(T v)
Definition value.h:180
~Value()
Definition value.h:80
friend Value operator/(const Value &v1, const Value &v2)
Definition value.h:258
friend bool operator>(const Value &v1, const Value &v2)
Definition value.h:229
friend Value operator*(const Value &v1, const Value &v2)
Definition value.h:251
std::string toString() const
Definition value.h:137
const Value & operator=(const std::string &v)
Definition value.h:192
friend bool operator>=(const Value &v1, const Value &v2)
Definition value.h:233
friend Value operator+(const Value &v1, const Value &v2)
Definition value.h:237
void subtract(const Value &v)
Definition value.h:162
long toLong() const
Definition value.h:128
void mod(const Value &v)
Definition value.h:171
Value(T numberValue)
Definition value.h:33
Value(const void *pointerValue)
Definition value.h:61
friend Value operator%(const Value &v1, const Value &v2)
Definition value.h:265
ValueType type() const
Definition value.h:95
const ValueData & data() const
Definition value.h:86
const void * toPointer() const
Definition value.h:156
int toInt() const
Definition value.h:125
const Value & operator=(const char *v)
Definition value.h:198
const Value & operator=(const Value &v)
Definition value.h:216
friend bool operator<=(const Value &v1, const Value &v2)
Definition value.h:235
bool isNegativeInfinity() const
Definition value.h:101
bool isInfinity() const
Definition value.h:98
bool isInt() const
Definition value.h:113
void add(const Value &v)
Definition value.h:159
void multiply(const Value &v)
Definition value.h:165
Value(bool boolValue)
Definition value.h:40
Value(const Value &v)
Definition value.h:74
friend bool operator!=(const Value &v1, const Value &v2)
Definition value.h:227
bool isNaN() const
Definition value.h:104
bool toBool() const
Definition value.h:134
friend bool operator<(const Value &v1, const Value &v2)
Definition value.h:231
bool isBool() const
Definition value.h:116
Rgb toRgba() const
Definition value.h:153
ValueData & data()
Definition value.h:92
const Value & operator=(bool v)
Definition value.h:186
const Value & operator=(const ValueData &v)
Definition value.h:210
Value(double numberValue=0.0)
Definition value.h:25
bool isPointer() const
Definition value.h:122
const Value & operator=(const void *v)
Definition value.h:204
Value(const char *stringValue)
Definition value.h:54
std::u16string toUtf16() const
Definition value.h:145
bool isValidNumber() const
Definition value.h:110
void divide(const Value &v)
Definition value.h:168
Value(const ValueData &v)
Definition value.h:68
bool isNumber() const
Definition value.h:107
const Value & operator=(double v)
Definition value.h:173
double toDouble() const
Definition value.h:131
friend bool operator==(const Value &v1, const Value &v2)
Definition value.h:225
Value(const std::string &stringValue)
Definition value.h:47
#define LIBSCRATCHCPP_EXPORT
Definition global.h:17
The main namespace of the library.
Definition asset.h:10
void value_mod(const ValueData *v1, const ValueData *v2, ValueData *dst)
Definition value_functions.cpp:526
bool value_isInfinity(const ValueData *v)
Definition value_functions.cpp:121
bool value_isNaN(const ValueData *v)
Definition value_functions.cpp:147
unsigned int Rgb
Definition value_functions.h:11
int value_toInt(const ValueData *v)
Definition value_functions.cpp:240
void value_assign_copy(ValueData *v, const ValueData *another)
Definition value_functions.cpp:94
void value_assign_pointer(ValueData *v, const void *pointerValue)
Definition value_functions.cpp:85
double value_toDouble(const ValueData *v)
Definition value_functions.cpp:253
bool value_lower(const ValueData *v1, const ValueData *v2)
Definition value_functions.cpp:548
void value_free(ValueData *v)
Definition value_functions.cpp:18
void value_toString(const ValueData *v, std::string *dst)
Definition value_functions.cpp:282
void value_multiply(const ValueData *v1, const ValueData *v2, ValueData *dst)
Definition value_functions.cpp:514
void value_toUtf16(const ValueData *v, std::u16string *dst)
Definition value_functions.cpp:305
bool value_isValidNumber(const ValueData *v)
Definition value_functions.cpp:166
void value_init(ValueData *v)
Definition value_functions.cpp:30
void value_assign_bool(ValueData *v, bool boolValue)
Definition value_functions.cpp:48
bool value_toBool(const ValueData *v)
Definition value_functions.cpp:266
void value_assign_string(ValueData *v, const std::string &stringValue)
Definition value_functions.cpp:57
bool value_isPointer(const ValueData *v)
Definition value_functions.cpp:207
bool value_isString(const ValueData *v)
Definition value_functions.cpp:219
const void * value_toPointer(const ValueData *v)
Definition value_functions.cpp:366
void value_divide(const ValueData *v1, const ValueData *v2, ValueData *dst)
Definition value_functions.cpp:520
bool value_isNumber(const ValueData *v)
Definition value_functions.cpp:160
bool value_isBool(const ValueData *v)
Definition value_functions.cpp:213
bool value_isInt(const ValueData *v)
Definition value_functions.cpp:186
void value_subtract(const ValueData *v1, const ValueData *v2, ValueData *dst)
Definition value_functions.cpp:508
bool value_isNegativeInfinity(const ValueData *v)
Definition value_functions.cpp:134
void value_add(const ValueData *v1, const ValueData *v2, ValueData *dst)
Definition value_functions.cpp:502
void value_assign_double(ValueData *v, double numberValue)
Definition value_functions.cpp:39
long value_toLong(const ValueData *v)
Definition value_functions.cpp:227
bool value_greater(const ValueData *v1, const ValueData *v2)
Definition value_functions.cpp:542
Rgb value_toRgba(const ValueData *v)
Definition value_functions.cpp:314
void value_assign_cstring(ValueData *v, const char *stringValue)
Definition value_functions.cpp:63
bool value_equals(const ValueData *v1, const ValueData *v2)
Definition value_functions.cpp:536
The ValueData struct holds the data of Value. It's used in compiled Scratch code for better performan...
Definition valuedata.h:26