14TEST(multi_function_procedure, ConstantOutput)
29 auto [var1] = builder.
add_call<1>(constant_fn);
30 auto [var2] = builder.add_call<1>(add_fn, {var1, var1});
31 builder.add_destruct(*var1);
33 builder.add_output_parameter(*var2);
35 EXPECT_TRUE(procedure.validate());
46 executor.call(mask,
params, context);
52TEST(multi_function_procedure, SimpleTest)
62 auto add_fn = mf::build::SI2_SO<int, int, int>(
"add", [](
int a,
int b) {
return a +
b; });
63 auto add_10_fn = mf::build::SM<int>(
"add_10", [](
int &a) { a += 10; });
68 Variable *var1 = &builder.add_single_input_parameter<
int>();
69 Variable *var2 = &builder.add_single_input_parameter<
int>();
70 auto [var3] = builder.add_call<1>(add_fn, {var1, var2});
71 auto [var4] = builder.add_call<1>(add_fn, {var2, var3});
72 builder.add_call(add_10_fn, {var4});
73 builder.add_destruct({var1, var2, var3});
75 builder.add_output_parameter(*var4);
77 EXPECT_TRUE(procedure.validate());
87 params.add_readonly_single_input_value(3);
92 executor.call(mask,
params, context);
99TEST(multi_function_procedure, BranchTest)
113 auto add_10_fn =
build::SM<int>(
"add_10", [](
int &a) { a += 10; });
114 auto add_100_fn =
build::SM<int>(
"add_100", [](
int &a) { a += 100; });
119 Variable *var1 = &builder.add_single_mutable_parameter<
int>();
120 Variable *var2 = &builder.add_single_input_parameter<
bool>();
124 branch.branch_true.add_call(add_100_fn, {var1});
125 builder.set_cursor_after_branch(branch);
126 builder.add_call(add_10_fn, {var1});
127 builder.add_destruct({var2});
128 builder.add_return();
130 EXPECT_TRUE(procedure.validate());
137 Array<bool> values_cond = {
true,
false,
true,
true,
false};
143 procedure_fn.call(mask,
params, context);
152TEST(multi_function_procedure, EvaluateOne)
160 int tot_evaluations = 0;
161 const auto add_10_fn = mf::build::SI1_SO<int, int>(
"add_10", [&](
int a) {
169 Variable *var1 = &builder.add_single_input_parameter<
int>();
170 auto [var2] = builder.add_call<1>(add_10_fn, {var1});
171 builder.add_destruct(*var1);
172 builder.add_return();
173 builder.add_output_parameter(*var2);
181 params.add_readonly_single_input_value(1);
185 procedure_fn.call(mask,
params, context);
196TEST(multi_function_procedure, SimpleLoop)
215 auto greater_or_equal_fn = mf::build::SI2_SO<int, int, bool>(
216 "greater or equal", [](
int a,
int b) {
return a >=
b; });
217 auto double_fn =
build::SM<int>(
"double", [](
int &a) { a *= 2; });
218 auto add_1000_fn =
build::SM<int>(
"add 1000", [](
int &a) { a += 1000; });
224 Variable *var_count = &builder.add_single_input_parameter<
int>(
"count");
225 auto [var_out] = builder.add_call<1>(const_1_fn);
227 auto [var_index] = builder.add_call<1>(const_0_fn);
228 var_index->set_name(
"index");
231 auto [var_condition] = builder.add_call<1>(greater_or_equal_fn, {var_index, var_count});
232 var_condition->set_name(
"condition");
237 builder.set_cursor_after_branch(branch);
238 builder.add_call(double_fn, {var_out});
239 builder.add_call(add_1_fn, {var_index});
240 builder.add_loop_continue(loop);
241 builder.set_cursor_after_loop(loop);
242 builder.add_call(add_1000_fn, {var_out});
243 builder.add_destruct({var_count, var_index});
244 builder.add_return();
245 builder.add_output_parameter(*var_out);
247 EXPECT_TRUE(procedure.validate());
261 procedure_fn.call(mask,
params, context);
270TEST(multi_function_procedure, Vectors)
294 builder.add_call(extend_fn, {var_v1, var_v2});
295 auto [var_constant] = builder.add_call<1>(constant_5_fn);
296 builder.add_call(append_fn, {var_v2, var_constant});
297 builder.add_destruct(*var_constant);
298 builder.add_call(extend_fn, {var_v2, var_v1});
299 auto [var_len] = builder.add_call<1>(sum_elements_fn, {var_v2});
300 auto [var_v3] = builder.add_call<1>(create_range_fn, {var_len});
301 builder.add_destruct({var_v1, var_len});
302 builder.add_return();
303 builder.add_output_parameter(*var_v3);
317 v2.append(0, &value_10);
318 v2.append(4, &value_10);
322 params.add_vector_output(v3);
325 procedure_fn.call(mask,
params, context);
340TEST(multi_function_procedure, BufferReuse)
357 Variable *var_a = &builder.add_single_input_parameter<
int>();
358 auto [var_b] = builder.add_call<1>(add_10_fn, {var_a});
359 builder.add_destruct(*var_a);
360 auto [var_c] = builder.add_call<1>(add_10_fn, {var_b});
361 builder.add_destruct(*var_b);
362 auto [var_d] = builder.add_call<1>(add_10_fn, {var_c});
363 builder.add_destruct(*var_c);
364 auto [var_e] = builder.add_call<1>(add_10_fn, {var_d});
365 builder.add_destruct(*var_d);
366 auto [var_out] = builder.add_call<1>(add_10_fn, {var_e});
367 builder.add_destruct(*var_e);
368 builder.add_return();
369 builder.add_output_parameter(*var_out);
371 EXPECT_TRUE(procedure.validate());
382 params.add_readonly_single_input(inputs.as_span());
386 procedure_fn.call(mask,
params, context);
395TEST(multi_function_procedure, OutputBufferReplaced)
400 const int output_value = 42;
403 builder.add_output_parameter(var_o);
404 builder.add_call_with_all_variables(constant_fn, {&var_o});
405 builder.add_destruct(var_o);
406 builder.add_call_with_all_variables(constant_fn, {&var_o});
407 builder.add_return();
416 params.add_uninitialized_single_output(output.as_mutable_span());
419 procedure_fn.call(mask,
params, context);