Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 7 additions & 45 deletions include/scratchcpp/value.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,18 @@ class LIBSCRATCHCPP_EXPORT Value
{
public:
/*! Constructs a number Value. */
Value(float numberValue)
{
value_init(&m_data);
value_assign_float(&m_data, numberValue);
}

/*! Constructs a number Value. */
Value(double numberValue)
Value(double numberValue = 0.0)
{
value_init(&m_data);
value_assign_double(&m_data, numberValue);
}

/*! Constructs a number Value. */
Value(int numberValue = 0)
{
value_init(&m_data);
value_assign_int(&m_data, numberValue);
}

/*! Constructs a number Value. */
Value(size_t numberValue)
{
value_init(&m_data);
value_assign_size_t(&m_data, numberValue);
}

/*! Constructs a number Value. */
Value(long numberValue)
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
Value(T numberValue)
{
value_init(&m_data);
value_assign_long(&m_data, numberValue);
value_assign_double(&m_data, numberValue);
}

/*! Constructs a boolean Value. */
Expand All @@ -77,13 +57,6 @@ class LIBSCRATCHCPP_EXPORT Value
value_assign_cstring(&m_data, stringValue);
}

/*! Constructs a special Value. */
Value(SpecialValue specialValue)
{
value_init(&m_data);
value_assign_special(&m_data, specialValue);
}

/*! Constructs value from ValueData. */
Value(const ValueData &v)
{
Expand Down Expand Up @@ -181,27 +154,16 @@ class LIBSCRATCHCPP_EXPORT Value
/*! Replaces the value with modulo of the value and the given value. */
void mod(const Value &v) { value_mod(&m_data, &v.m_data, &m_data); }

const Value &operator=(float v)
{
value_assign_float(&m_data, v);
return *this;
}

const Value &operator=(double v)
{
value_assign_double(&m_data, v);
return *this;
}

const Value &operator=(int v)
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
const Value &operator=(T v)
{
value_assign_int(&m_data, v);
return *this;
}

const Value &operator=(long v)
{
value_assign_long(&m_data, v);
value_assign_double(&m_data, v);
return *this;
}

Expand Down
5 changes: 0 additions & 5 deletions include/scratchcpp/value_functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,10 @@ extern "C"

LIBSCRATCHCPP_EXPORT void value_init(ValueData *v);

LIBSCRATCHCPP_EXPORT void value_assign_float(ValueData *v, float numberValue);
LIBSCRATCHCPP_EXPORT void value_assign_double(ValueData *v, double numberValue);
LIBSCRATCHCPP_EXPORT void value_assign_int(ValueData *v, int numberValue);
LIBSCRATCHCPP_EXPORT void value_assign_size_t(ValueData *v, size_t numberValue);
LIBSCRATCHCPP_EXPORT void value_assign_long(ValueData *v, long numberValue);
LIBSCRATCHCPP_EXPORT void value_assign_bool(ValueData *v, bool boolValue);
LIBSCRATCHCPP_EXPORT void value_assign_string(ValueData *v, const std::string &stringValue);
LIBSCRATCHCPP_EXPORT void value_assign_cstring(ValueData *v, const char *stringValue);
LIBSCRATCHCPP_EXPORT void value_assign_special(ValueData *v, SpecialValue specialValue);
LIBSCRATCHCPP_EXPORT void value_assign_copy(ValueData *v, const ValueData *another);

LIBSCRATCHCPP_EXPORT bool value_isInfinity(const ValueData *v);
Expand Down
12 changes: 1 addition & 11 deletions include/scratchcpp/valuedata.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,11 @@
namespace libscratchcpp
{

enum class LIBSCRATCHCPP_EXPORT SpecialValue
{
Infinity,
NegativeInfinity,
NaN
};

enum class LIBSCRATCHCPP_EXPORT ValueType
{
Number = 0,
Bool = 1,
String = 2,
Infinity = -1,
NegativeInfinity = -2,
NaN = -3
String = 2
};

extern "C"
Expand Down
16 changes: 10 additions & 6 deletions src/blocks/operatorblocks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,9 +261,9 @@ unsigned int OperatorBlocks::op_ln(VirtualMachine *vm)
{
const Value &v = *vm->getInput(0, 1);
if (v < 0)
vm->replaceReturnValue(Value(SpecialValue::NaN), 1);
vm->replaceReturnValue(std::numeric_limits<double>::quiet_NaN(), 1);
else if (v == 0 || v.isNaN())
vm->replaceReturnValue(Value(SpecialValue::NegativeInfinity), 1);
vm->replaceReturnValue(-std::numeric_limits<double>::infinity(), 1);
else if (!v.isInfinity())
vm->replaceReturnValue(std::log(v.toDouble()), 1);
return 0;
Expand All @@ -273,9 +273,9 @@ unsigned int OperatorBlocks::op_log(VirtualMachine *vm)
{
const Value &v = *vm->getInput(0, 1);
if (v < 0)
vm->replaceReturnValue(Value(SpecialValue::NaN), 1);
vm->replaceReturnValue(std::numeric_limits<double>::quiet_NaN(), 1);
else if (v == 0 || v.isNaN())
vm->replaceReturnValue(Value(SpecialValue::NegativeInfinity), 1);
vm->replaceReturnValue(-std::numeric_limits<double>::infinity(), 1);
else if (!v.isInfinity())
vm->replaceReturnValue(std::log10(v.toDouble()), 1);
return 0;
Expand All @@ -284,7 +284,9 @@ unsigned int OperatorBlocks::op_log(VirtualMachine *vm)
unsigned int OperatorBlocks::op_eexp(VirtualMachine *vm)
{
const Value *v = vm->getInput(0, 1);
if (v->isNegativeInfinity())
if (v->isNaN())
vm->replaceReturnValue(1, 1);
else if (v->isNegativeInfinity())
vm->replaceReturnValue(0, 1);
else if (!v->isInfinity())
vm->replaceReturnValue(std::exp(v->toDouble()), 1);
Expand All @@ -294,7 +296,9 @@ unsigned int OperatorBlocks::op_eexp(VirtualMachine *vm)
unsigned int OperatorBlocks::op_10exp(VirtualMachine *vm)
{
const Value *v = vm->getInput(0, 1);
if (v->isNegativeInfinity())
if (v->isNaN())
vm->replaceReturnValue(1, 1);
else if (v->isNegativeInfinity())
vm->replaceReturnValue(0, 1);
else if (!v->isInfinity())
vm->replaceReturnValue(std::pow(10, v->toDouble()), 1);
Expand Down
7 changes: 2 additions & 5 deletions src/dev/engine/internal/llvmcodebuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@

using namespace libscratchcpp;

static std::unordered_map<ValueType, Compiler::StaticType> TYPE_MAP = {
{ ValueType::Number, Compiler::StaticType::Number }, { ValueType::Bool, Compiler::StaticType::Bool },
{ ValueType::String, Compiler::StaticType::String }, { ValueType::Infinity, Compiler::StaticType::Number },
{ ValueType::NegativeInfinity, Compiler::StaticType::Number }, { ValueType::NaN, Compiler::StaticType::Number }
};
static std::unordered_map<ValueType, Compiler::StaticType>
TYPE_MAP = { { ValueType::Number, Compiler::StaticType::Number }, { ValueType::Bool, Compiler::StaticType::Bool }, { ValueType::String, Compiler::StaticType::String } };

LLVMCodeBuilder::LLVMCodeBuilder(const std::string &id, bool warp) :
m_id(id),
Expand Down
18 changes: 9 additions & 9 deletions src/engine/virtualmachine_p.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
{
const Value *v = READ_REG(0, 1);
if (v->isNegativeInfinity())
REPLACE_RET_VALUE(Value(SpecialValue::Infinity), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::infinity(), 1);
else if (!v->isInfinity())
REPLACE_RET_VALUE(std::abs(v->toDouble()), 1);
DISPATCH();
Expand All @@ -487,7 +487,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
{
const Value &v = *READ_REG(0, 1);
if (v < 0)
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::quiet_NaN(), 1);
else if (!v.isInfinity())
REPLACE_RET_VALUE(std::sqrt(v.toDouble()), 1);
DISPATCH();
Expand All @@ -497,7 +497,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
{
const Value *v = READ_REG(0, 1);
if (v->isInfinity() || v->isNegativeInfinity())
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::quiet_NaN(), 1);
else
REPLACE_RET_VALUE(std::sin(v->toDouble() * pi / 180), 1);
DISPATCH();
Expand All @@ -507,7 +507,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
{
const Value *v = READ_REG(0, 1);
if (v->isInfinity() || v->isNegativeInfinity())
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::quiet_NaN(), 1);
else
REPLACE_RET_VALUE(std::cos(v->toDouble() * pi / 180), 1);
DISPATCH();
Expand All @@ -517,17 +517,17 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
{
const Value *v = READ_REG(0, 1);
if (v->isInfinity() || v->isNegativeInfinity())
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::quiet_NaN(), 1);
else {
long mod;
if (v->toLong() < 0)
mod = (v->toLong() + 360) % 360;
else
mod = v->toLong() % 360;
if (mod == 90)
REPLACE_RET_VALUE(Value(SpecialValue::Infinity), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::infinity(), 1);
else if (mod == 270)
REPLACE_RET_VALUE(Value(SpecialValue::NegativeInfinity), 1);
REPLACE_RET_VALUE(-std::numeric_limits<double>::infinity(), 1);
else
REPLACE_RET_VALUE(std::tan(v->toDouble() * pi / 180), 1);
}
Expand All @@ -538,7 +538,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
{
const Value &v = *READ_REG(0, 1);
if (v < -1 || v > 1)
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::quiet_NaN(), 1);
else
REPLACE_RET_VALUE(std::asin(v.toDouble()) * 180 / pi, 1);
DISPATCH();
Expand All @@ -548,7 +548,7 @@ unsigned int *VirtualMachinePrivate::run(unsigned int *pos, bool reset)
{
const Value &v = *READ_REG(0, 1);
if (v < -1 || v > 1)
REPLACE_RET_VALUE(Value(SpecialValue::NaN), 1);
REPLACE_RET_VALUE(std::numeric_limits<double>::quiet_NaN(), 1);
else
REPLACE_RET_VALUE(std::acos(v.toDouble()) * 180 / pi, 1);
DISPATCH();
Expand Down
7 changes: 2 additions & 5 deletions src/scratch/inputvalue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,8 @@

using namespace libscratchcpp;

static const std::map<ValueType, InputValue::Type> VALUE_TYPE_MAP = {
{ ValueType::Number, InputValue::Type::Number }, { ValueType::Bool, InputValue::Type::String },
{ ValueType::String, InputValue::Type::String }, { ValueType::Infinity, InputValue::Type::String },
{ ValueType::NegativeInfinity, InputValue::Type::String }, { ValueType::NaN, InputValue::Type::String }
};
static const std::map<ValueType, InputValue::Type>
VALUE_TYPE_MAP = { { ValueType::Number, InputValue::Type::Number }, { ValueType::Bool, InputValue::Type::String }, { ValueType::String, InputValue::Type::String } };

/*! Constructs InputValue with the given type. */
InputValue::InputValue(Type type) :
Expand Down
Loading
Loading