@@ -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
3364std::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+ }
0 commit comments