Skip to content

Commit 93e4304

Browse files
committed
OperatorBlocks: Add remaining blocks
1 parent 40942c8 commit 93e4304

File tree

2 files changed

+224
-1
lines changed

2 files changed

+224
-1
lines changed

src/blocks/operatorblocks.cpp

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ OperatorBlocks::OperatorBlocks()
1919
addCompileFunction("operator_and", &compileAnd);
2020
addCompileFunction("operator_or", &compileOr);
2121
addCompileFunction("operator_not", &compileNot);
22+
addCompileFunction("operator_join", &compileJoin);
23+
addCompileFunction("operator_letter_of", &compileLetterOf);
24+
addCompileFunction("operator_length", &compileLength);
25+
addCompileFunction("operator_contains", &compileContains);
26+
addCompileFunction("operator_mod", &compileMod);
27+
addCompileFunction("operator_round", &compileRound);
28+
addCompileFunction("operator_mathop", &compileMathOp);
2229

2330
// Inputs
2431
addInput("NUM1", NUM1);
@@ -28,6 +35,30 @@ OperatorBlocks::OperatorBlocks()
2835
addInput("OPERAND1", OPERAND1);
2936
addInput("OPERAND2", OPERAND2);
3037
addInput("OPERAND", OPERAND);
38+
addInput("STRING1", STRING1);
39+
addInput("STRING2", STRING2);
40+
addInput("LETTER", LETTER);
41+
addInput("STRING", STRING);
42+
addInput("NUM", NUM);
43+
44+
// Fields
45+
addField("OPERATOR", OPERATOR);
46+
47+
// Field values
48+
addFieldValue("abs", Abs);
49+
addFieldValue("floor", Floor);
50+
addFieldValue("ceiling", Ceiling);
51+
addFieldValue("sqrt", Sqrt);
52+
addFieldValue("sin", Sin);
53+
addFieldValue("cos", Cos);
54+
addFieldValue("tan", Tan);
55+
addFieldValue("asin", Asin);
56+
addFieldValue("acos", Acos);
57+
addFieldValue("atan", Atan);
58+
addFieldValue("ln", Ln);
59+
addFieldValue("log", Log);
60+
addFieldValue("e ^", Eexp);
61+
addFieldValue("10 ^", Op_10exp);
3162
}
3263

3364
std::string OperatorBlocks::name() const
@@ -110,3 +141,154 @@ void OperatorBlocks::compileNot(Compiler *compiler)
110141
compiler->addInput(OPERAND);
111142
compiler->addInstruction(vm::OP_NOT);
112143
}
144+
145+
void OperatorBlocks::compileJoin(Compiler *compiler)
146+
{
147+
compiler->addInput(STRING1);
148+
compiler->addInput(STRING2);
149+
compiler->addInstruction(vm::OP_STR_CONCAT);
150+
}
151+
152+
void OperatorBlocks::compileLetterOf(Compiler *compiler)
153+
{
154+
compiler->addInput(STRING);
155+
compiler->addInput(LETTER);
156+
compiler->addInstruction(vm::OP_STR_AT);
157+
}
158+
159+
void OperatorBlocks::compileLength(Compiler *compiler)
160+
{
161+
compiler->addInput(STRING);
162+
compiler->addInstruction(vm::OP_STR_LENGTH);
163+
}
164+
165+
void OperatorBlocks::compileContains(Compiler *compiler)
166+
{
167+
compiler->addInput(STRING1);
168+
compiler->addInput(STRING2);
169+
compiler->addInstruction(vm::OP_STR_CONTAINS);
170+
}
171+
172+
void OperatorBlocks::compileMod(Compiler *compiler)
173+
{
174+
compiler->addInput(NUM1);
175+
compiler->addInput(NUM2);
176+
compiler->addInstruction(vm::OP_MOD);
177+
}
178+
179+
void OperatorBlocks::compileRound(Compiler *compiler)
180+
{
181+
compiler->addInput(NUM);
182+
compiler->addInstruction(vm::OP_ROUND);
183+
}
184+
185+
void OperatorBlocks::compileMathOp(Compiler *compiler)
186+
{
187+
compiler->addInput(NUM);
188+
189+
int id = compiler->field(OPERATOR)->specialValueId();
190+
switch (id) {
191+
case Abs:
192+
compiler->addInstruction(vm::OP_ABS);
193+
break;
194+
195+
case Floor:
196+
compiler->addInstruction(vm::OP_FLOOR);
197+
break;
198+
199+
case Ceiling:
200+
compiler->addInstruction(vm::OP_CEIL);
201+
break;
202+
203+
case Sqrt:
204+
compiler->addInstruction(vm::OP_SQRT);
205+
break;
206+
207+
case Sin:
208+
compiler->addInstruction(vm::OP_SIN);
209+
break;
210+
211+
case Cos:
212+
compiler->addInstruction(vm::OP_COS);
213+
break;
214+
215+
case Tan:
216+
compiler->addInstruction(vm::OP_TAN);
217+
break;
218+
219+
case Asin:
220+
compiler->addInstruction(vm::OP_ASIN);
221+
break;
222+
223+
case Acos:
224+
compiler->addInstruction(vm::OP_ACOS);
225+
break;
226+
227+
case Atan:
228+
compiler->addInstruction(vm::OP_ATAN);
229+
break;
230+
231+
case Ln:
232+
compiler->addFunctionCall(&op_ln);
233+
break;
234+
235+
case Log:
236+
compiler->addFunctionCall(&op_log);
237+
break;
238+
239+
case Eexp:
240+
compiler->addFunctionCall(&op_eexp);
241+
break;
242+
243+
case Op_10exp:
244+
compiler->addFunctionCall(&op_10exp);
245+
break;
246+
247+
default:
248+
break;
249+
}
250+
}
251+
252+
unsigned int OperatorBlocks::op_ln(VirtualMachine *vm)
253+
{
254+
const Value &v = *vm->getInput(0, 1);
255+
if (v < 0)
256+
vm->replaceReturnValue(Value(Value::SpecialValue::NaN), 1);
257+
else if (v == 0)
258+
vm->replaceReturnValue(Value(Value::SpecialValue::NegativeInfinity), 1);
259+
else if (!v.isInfinity())
260+
vm->replaceReturnValue(std::log(v.toDouble()), 1);
261+
return 0;
262+
}
263+
264+
unsigned int OperatorBlocks::op_log(VirtualMachine *vm)
265+
{
266+
const Value &v = *vm->getInput(0, 1);
267+
if (v < 0)
268+
vm->replaceReturnValue(Value(Value::SpecialValue::NaN), 1);
269+
else if (v == 0)
270+
vm->replaceReturnValue(Value(Value::SpecialValue::NegativeInfinity), 1);
271+
else if (!v.isInfinity())
272+
vm->replaceReturnValue(std::log10(v.toDouble()), 1);
273+
return 0;
274+
}
275+
276+
unsigned int OperatorBlocks::op_eexp(VirtualMachine *vm)
277+
{
278+
const Value *v = vm->getInput(0, 1);
279+
if (v->isNegativeInfinity())
280+
vm->replaceReturnValue(0, 1);
281+
else if (!v->isInfinity())
282+
vm->replaceReturnValue(std::exp(v->toDouble()), 1);
283+
return 0;
284+
}
285+
286+
unsigned int OperatorBlocks::op_10exp(VirtualMachine *vm)
287+
{
288+
const Value *v = vm->getInput(0, 1);
289+
if (v->isNegativeInfinity())
290+
vm->replaceReturnValue(0, 1);
291+
else if (!v->isInfinity())
292+
vm->replaceReturnValue(std::pow(10, v->toDouble()), 1);
293+
return 0;
294+
}

src/blocks/operatorblocks.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,35 @@ class LIBSCRATCHCPP_EXPORT OperatorBlocks : public IBlockSection
1919
TO,
2020
OPERAND1,
2121
OPERAND2,
22-
OPERAND
22+
OPERAND,
23+
STRING1,
24+
STRING2,
25+
LETTER,
26+
STRING,
27+
NUM
28+
};
29+
30+
enum Fields
31+
{
32+
OPERATOR
33+
};
34+
35+
enum FieldValues
36+
{
37+
Abs,
38+
Floor,
39+
Ceiling,
40+
Sqrt,
41+
Sin,
42+
Cos,
43+
Tan,
44+
Asin,
45+
Acos,
46+
Atan,
47+
Ln,
48+
Log,
49+
Eexp,
50+
Op_10exp
2351
};
2452

2553
OperatorBlocks();
@@ -37,6 +65,19 @@ class LIBSCRATCHCPP_EXPORT OperatorBlocks : public IBlockSection
3765
static void compileAnd(Compiler *compiler);
3866
static void compileOr(Compiler *compiler);
3967
static void compileNot(Compiler *compiler);
68+
static void compileJoin(Compiler *compiler);
69+
static void compileLetterOf(Compiler *compiler);
70+
static void compileLength(Compiler *compiler);
71+
static void compileContains(Compiler *compiler);
72+
static void compileMod(Compiler *compiler);
73+
static void compileRound(Compiler *compiler);
74+
static void compileMathOp(Compiler *compiler);
75+
76+
private:
77+
static unsigned int op_ln(VirtualMachine *vm);
78+
static unsigned int op_log(VirtualMachine *vm);
79+
static unsigned int op_eexp(VirtualMachine *vm);
80+
static unsigned int op_10exp(VirtualMachine *vm);
4081
};
4182

4283
} // namespace libscratchcpp

0 commit comments

Comments
 (0)