Skip to content

Commit 18654df

Browse files
authored
Merge pull request #575 from scratchcpp/refactor_value
LLVM: Refactor Value class
2 parents 400c1f2 + 494fe3a commit 18654df

File tree

16 files changed

+5708
-1070
lines changed

16 files changed

+5708
-1070
lines changed

include/scratchcpp/value.h

Lines changed: 90 additions & 923 deletions
Large diffs are not rendered by default.

include/scratchcpp/value_functions.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#pragma once
2+
3+
#include "valuedata.h"
4+
5+
namespace libscratchcpp
6+
{
7+
8+
extern "C"
9+
{
10+
LIBSCRATCHCPP_EXPORT void value_free(ValueData *v);
11+
12+
LIBSCRATCHCPP_EXPORT void value_init(ValueData *v);
13+
14+
LIBSCRATCHCPP_EXPORT void value_assign_float(ValueData *v, float numberValue);
15+
LIBSCRATCHCPP_EXPORT void value_assign_double(ValueData *v, double numberValue);
16+
LIBSCRATCHCPP_EXPORT void value_assign_int(ValueData *v, int numberValue);
17+
LIBSCRATCHCPP_EXPORT void value_assign_size_t(ValueData *v, size_t numberValue);
18+
LIBSCRATCHCPP_EXPORT void value_assign_long(ValueData *v, long numberValue);
19+
LIBSCRATCHCPP_EXPORT void value_assign_bool(ValueData *v, bool boolValue);
20+
LIBSCRATCHCPP_EXPORT void value_assign_string(ValueData *v, const std::string &stringValue);
21+
LIBSCRATCHCPP_EXPORT void value_assign_cstring(ValueData *v, const char *stringValue);
22+
LIBSCRATCHCPP_EXPORT void value_assign_special(ValueData *v, SpecialValue specialValue);
23+
LIBSCRATCHCPP_EXPORT void value_assign_copy(ValueData *v, const ValueData *another);
24+
25+
LIBSCRATCHCPP_EXPORT bool value_isInfinity(const ValueData *v);
26+
LIBSCRATCHCPP_EXPORT bool value_isNegativeInfinity(const ValueData *v);
27+
LIBSCRATCHCPP_EXPORT bool value_isNaN(const ValueData *v);
28+
LIBSCRATCHCPP_EXPORT bool value_isNumber(const ValueData *v);
29+
LIBSCRATCHCPP_EXPORT bool value_isValidNumber(const ValueData *v);
30+
LIBSCRATCHCPP_EXPORT bool value_isInt(const ValueData *v);
31+
LIBSCRATCHCPP_EXPORT bool value_isBool(const ValueData *v);
32+
LIBSCRATCHCPP_EXPORT bool value_isString(const ValueData *v);
33+
34+
LIBSCRATCHCPP_EXPORT long value_toLong(const ValueData *v);
35+
LIBSCRATCHCPP_EXPORT int value_toInt(const ValueData *v);
36+
LIBSCRATCHCPP_EXPORT double value_toDouble(const ValueData *v);
37+
LIBSCRATCHCPP_EXPORT bool value_toBool(const ValueData *v);
38+
LIBSCRATCHCPP_EXPORT void value_toString(const ValueData *v, std::string *dst);
39+
LIBSCRATCHCPP_EXPORT void value_toUtf16(const ValueData *v, std::u16string *dst);
40+
41+
LIBSCRATCHCPP_EXPORT void value_add(const ValueData *v1, const ValueData *v2, ValueData *dst);
42+
LIBSCRATCHCPP_EXPORT void value_subtract(const ValueData *v1, const ValueData *v2, ValueData *dst);
43+
LIBSCRATCHCPP_EXPORT void value_multiply(const ValueData *v1, const ValueData *v2, ValueData *dst);
44+
LIBSCRATCHCPP_EXPORT void value_divide(const ValueData *v1, const ValueData *v2, ValueData *dst);
45+
LIBSCRATCHCPP_EXPORT void value_mod(const ValueData *v1, const ValueData *v2, ValueData *dst);
46+
47+
LIBSCRATCHCPP_EXPORT bool value_equals(const ValueData *v1, const ValueData *v2);
48+
LIBSCRATCHCPP_EXPORT bool value_greater(const ValueData *v1, const ValueData *v2);
49+
LIBSCRATCHCPP_EXPORT bool value_lower(const ValueData *v1, const ValueData *v2);
50+
}
51+
52+
} // namespace libscratchcpp

include/scratchcpp/valuedata.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
#pragma once
4+
5+
#include <string>
6+
7+
#include "global.h"
8+
9+
namespace libscratchcpp
10+
{
11+
12+
enum class LIBSCRATCHCPP_EXPORT SpecialValue
13+
{
14+
Infinity,
15+
NegativeInfinity,
16+
NaN
17+
};
18+
19+
enum class LIBSCRATCHCPP_EXPORT ValueType
20+
{
21+
Integer = 0,
22+
Double = 1,
23+
Bool = 2,
24+
String = 3,
25+
Infinity = -1,
26+
NegativeInfinity = -2,
27+
NaN = -3
28+
};
29+
30+
extern "C"
31+
{
32+
/*! \brief The ValueData struct holds the data of Value. It's used in compiled Scratch code for better performance. */
33+
struct LIBSCRATCHCPP_EXPORT ValueData
34+
{
35+
union
36+
{
37+
long intValue;
38+
double doubleValue;
39+
bool boolValue;
40+
char *stringValue;
41+
};
42+
43+
ValueType type;
44+
size_t stringSize; // allocated size, not length
45+
};
46+
}
47+
48+
} // namespace libscratchcpp

src/blocks/operatorblocks.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,9 @@ unsigned int OperatorBlocks::op_ln(VirtualMachine *vm)
256256
{
257257
const Value &v = *vm->getInput(0, 1);
258258
if (v < 0)
259-
vm->replaceReturnValue(Value(Value::SpecialValue::NaN), 1);
259+
vm->replaceReturnValue(Value(SpecialValue::NaN), 1);
260260
else if (v == 0 || v.isNaN())
261-
vm->replaceReturnValue(Value(Value::SpecialValue::NegativeInfinity), 1);
261+
vm->replaceReturnValue(Value(SpecialValue::NegativeInfinity), 1);
262262
else if (!v.isInfinity())
263263
vm->replaceReturnValue(std::log(v.toDouble()), 1);
264264
return 0;
@@ -268,9 +268,9 @@ unsigned int OperatorBlocks::op_log(VirtualMachine *vm)
268268
{
269269
const Value &v = *vm->getInput(0, 1);
270270
if (v < 0)
271-
vm->replaceReturnValue(Value(Value::SpecialValue::NaN), 1);
271+
vm->replaceReturnValue(Value(SpecialValue::NaN), 1);
272272
else if (v == 0 || v.isNaN())
273-
vm->replaceReturnValue(Value(Value::SpecialValue::NegativeInfinity), 1);
273+
vm->replaceReturnValue(Value(SpecialValue::NegativeInfinity), 1);
274274
else if (!v.isInfinity())
275275
vm->replaceReturnValue(std::log10(v.toDouble()), 1);
276276
return 0;

src/engine/virtualmachine_p.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
460460
{
461461
const Value *v = READ_REG(0, 1);
462462
if (v->isNegativeInfinity())
463-
REPLACE_RET_VALUE(Value(Value::SpecialValue::Infinity), 1);
463+
REPLACE_RET_VALUE(Value(SpecialValue::Infinity), 1);
464464
else if (!v->isInfinity())
465465
REPLACE_RET_VALUE(std::abs(v->toDouble()), 1);
466466
DISPATCH();
@@ -486,7 +486,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
486486
{
487487
const Value &v = *READ_REG(0, 1);
488488
if (v < 0)
489-
REPLACE_RET_VALUE(Value(Value::SpecialValue::NaN), 1);
489+
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
490490
else if (!v.isInfinity())
491491
REPLACE_RET_VALUE(std::sqrt(v.toDouble()), 1);
492492
DISPATCH();
@@ -496,7 +496,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
496496
{
497497
const Value *v = READ_REG(0, 1);
498498
if (v->isInfinity() || v->isNegativeInfinity())
499-
REPLACE_RET_VALUE(Value(Value::SpecialValue::NaN), 1);
499+
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
500500
else
501501
REPLACE_RET_VALUE(std::sin(v->toDouble() * pi / 180), 1);
502502
DISPATCH();
@@ -506,7 +506,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
506506
{
507507
const Value *v = READ_REG(0, 1);
508508
if (v->isInfinity() || v->isNegativeInfinity())
509-
REPLACE_RET_VALUE(Value(Value::SpecialValue::NaN), 1);
509+
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
510510
else
511511
REPLACE_RET_VALUE(std::cos(v->toDouble() * pi / 180), 1);
512512
DISPATCH();
@@ -516,17 +516,17 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
516516
{
517517
const Value *v = READ_REG(0, 1);
518518
if (v->isInfinity() || v->isNegativeInfinity())
519-
REPLACE_RET_VALUE(Value(Value::SpecialValue::NaN), 1);
519+
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
520520
else {
521521
long mod;
522522
if (v->toLong() < 0)
523523
mod = (v->toLong() + 360) % 360;
524524
else
525525
mod = v->toLong() % 360;
526526
if (mod == 90)
527-
REPLACE_RET_VALUE(Value(Value::SpecialValue::Infinity), 1);
527+
REPLACE_RET_VALUE(Value(SpecialValue::Infinity), 1);
528528
else if (mod == 270)
529-
REPLACE_RET_VALUE(Value(Value::SpecialValue::NegativeInfinity), 1);
529+
REPLACE_RET_VALUE(Value(SpecialValue::NegativeInfinity), 1);
530530
else
531531
REPLACE_RET_VALUE(std::tan(v->toDouble() * pi / 180), 1);
532532
}
@@ -537,7 +537,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
537537
{
538538
const Value &v = *READ_REG(0, 1);
539539
if (v < -1 || v > 1)
540-
REPLACE_RET_VALUE(Value(Value::SpecialValue::NaN), 1);
540+
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
541541
else
542542
REPLACE_RET_VALUE(std::asin(v.toDouble()) * 180 / pi, 1);
543543
DISPATCH();
@@ -547,7 +547,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
547547
{
548548
const Value &v = *READ_REG(0, 1);
549549
if (v < -1 || v > 1)
550-
REPLACE_RET_VALUE(Value(Value::SpecialValue::NaN), 1);
550+
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
551551
else
552552
REPLACE_RET_VALUE(std::acos(v.toDouble()) * 180 / pi, 1);
553553
DISPATCH();

src/scratch/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
target_sources(scratchcpp
22
PRIVATE
3-
value.cpp
3+
value_functions.cpp
4+
value_functions_p.h
45
target.cpp
56
target_p.cpp
67
target_p.h

src/scratch/inputvalue.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414
using namespace libscratchcpp;
1515

16-
static const std::map<Value::Type, InputValue::Type> VALUE_TYPE_MAP = {
17-
{ Value::Type::Integer, InputValue::Type::Number }, { Value::Type::Double, InputValue::Type::Number }, { Value::Type::Bool, InputValue::Type::String },
18-
{ Value::Type::String, InputValue::Type::String }, { Value::Type::Infinity, InputValue::Type::String }, { Value::Type::NegativeInfinity, InputValue::Type::String },
19-
{ Value::Type::NaN, InputValue::Type::String }
16+
static const std::map<ValueType, InputValue::Type> VALUE_TYPE_MAP = {
17+
{ ValueType::Integer, InputValue::Type::Number }, { ValueType::Double, InputValue::Type::Number }, { ValueType::Bool, InputValue::Type::String },
18+
{ ValueType::String, InputValue::Type::String }, { ValueType::Infinity, InputValue::Type::String }, { ValueType::NegativeInfinity, InputValue::Type::String },
19+
{ ValueType::NaN, InputValue::Type::String }
2020
};
2121

2222
/*! Constructs InputValue with the given type. */

0 commit comments

Comments
 (0)