3 #include "testing/testing.h"
11 class AddFunction :
public MultiFunction {
15 static MFSignature signature = create_signature();
16 this->set_signature(&signature);
19 static MFSignature create_signature()
21 MFSignatureBuilder signature(
"Add");
22 signature.single_input<
int>(
"A");
23 signature.single_input<
int>(
"B");
24 signature.single_output<
int>(
"Result");
25 return signature.build();
30 const VArray<int> &
a =
params.readonly_single_input<
int>(0,
"A");
31 const VArray<int> &b =
params.readonly_single_input<
int>(1,
"B");
32 MutableSpan<int>
result =
params.uninitialized_single_output<
int>(2,
"Result");
40 TEST(multi_function, AddFunction)
44 Array<int> input1 = {4, 5, 6};
45 Array<int> input2 = {10, 20, 30};
48 MFParamsBuilder
params(fn, 3);
49 params.add_readonly_single_input(input1.as_span());
50 params.add_readonly_single_input(input2.as_span());
51 params.add_uninitialized_single_output(
output.as_mutable_span());
62 class AddPrefixFunction :
public MultiFunction {
66 static MFSignature signature = create_signature();
67 this->set_signature(&signature);
70 static MFSignature create_signature()
72 MFSignatureBuilder signature{
"Add Prefix"};
73 signature.single_input<std::string>(
"Prefix");
74 signature.single_mutable<std::string>(
"Strings");
75 return signature.build();
80 const VArray<std::string> &prefixes =
params.readonly_single_input<std::string>(0,
"Prefix");
81 MutableSpan<std::string> strings =
params.single_mutable<std::string>(1,
"Strings");
84 strings[i] = prefixes[i] + strings[i];
89 TEST(multi_function, AddPrefixFunction)
93 Array<std::string> strings = {
97 "Another much longer string to trigger an allocation",
100 std::string prefix =
"AB";
102 MFParamsBuilder
params(fn, strings.size());
103 params.add_readonly_single_input(&prefix);
104 params.add_single_mutable(strings.as_mutable_span());
112 EXPECT_EQ(strings[2],
"ABThis is a test");
113 EXPECT_EQ(strings[3],
"ABAnother much longer string to trigger an allocation");
116 class CreateRangeFunction :
public MultiFunction {
118 CreateRangeFunction()
120 static MFSignature signature = create_signature();
121 this->set_signature(&signature);
124 static MFSignature create_signature()
126 MFSignatureBuilder signature{
"Create Range"};
127 signature.single_input<
uint>(
"Size");
128 signature.vector_output<
uint>(
"Range");
129 return signature.build();
134 const VArray<uint> &sizes =
params.readonly_single_input<
uint>(0,
"Size");
135 GVectorArray &ranges =
params.vector_output(1,
"Range");
140 ranges.append(i, &j);
146 TEST(multi_function, CreateRangeFunction)
148 CreateRangeFunction fn;
150 GVectorArray ranges(CPPType::get<uint>(), 5);
151 GVectorArray_TypedMutableRef<uint> ranges_ref{ranges};
152 Array<uint> sizes = {3, 0, 6, 1, 4};
154 MFParamsBuilder
params(fn, ranges.size());
155 params.add_readonly_single_input(sizes.as_span());
156 params.add_vector_output(ranges);
175 class GenericAppendFunction :
public MultiFunction {
177 MFSignature signature_;
180 GenericAppendFunction(
const CPPType &
type)
182 MFSignatureBuilder signature{
"Append"};
183 signature.vector_mutable(
"Vector",
type);
184 signature.single_input(
"Value",
type);
185 signature_ = signature.build();
186 this->set_signature(&signature_);
191 GVectorArray &vectors =
params.vector_mutable(0,
"Vector");
192 const GVArray &values =
params.readonly_single_input(1,
"Value");
197 vectors.append(i,
buffer);
198 values.type().destruct(
buffer);
203 TEST(multi_function, GenericAppendFunction)
205 GenericAppendFunction fn(CPPType::get<int32_t>());
207 GVectorArray vectors(CPPType::get<int32_t>(), 4);
208 GVectorArray_TypedMutableRef<int> vectors_ref{vectors};
209 vectors_ref.append(0, 1);
210 vectors_ref.append(0, 2);
211 vectors_ref.append(2, 6);
212 Array<int> values = {5, 7, 3, 1};
214 MFParamsBuilder
params(fn, vectors.size());
215 params.add_vector_mutable(vectors);
216 params.add_readonly_single_input(values.as_span());
236 TEST(multi_function, CustomMF_SI_SO)
238 CustomMF_SI_SO<std::string, uint> fn(
"strlen",
239 [](
const std::string &
str) {
return str.size(); });
241 Array<std::string> strings = {
"hello",
"world",
"test",
"another test"};
242 Array<uint> sizes(strings.size(), 0);
244 MFParamsBuilder
params(fn, strings.size());
245 params.add_readonly_single_input(strings.as_span());
246 params.add_uninitialized_single_output(sizes.as_mutable_span());
258 TEST(multi_function, CustomMF_SI_SI_SO)
260 CustomMF_SI_SI_SO<int, int, int> fn(
"mul", [](
int a,
int b) {
return a * b; });
262 Array<int> values_a = {4, 6, 8, 9};
264 Array<int>
outputs(values_a.size(), -1);
266 MFParamsBuilder
params(fn, values_a.size());
267 params.add_readonly_single_input(values_a.as_span());
268 params.add_readonly_single_input(&value_b);
269 params.add_uninitialized_single_output(
outputs.as_mutable_span());
281 TEST(multi_function, CustomMF_SI_SI_SI_SO)
283 CustomMF_SI_SI_SI_SO<int, std::string, bool, uint> fn{
285 [](
int a,
const std::string &b,
bool c) {
return (
uint)((
uint)
a + b.size() + (
uint)
c); }};
287 Array<int> values_a = {5, 7, 3, 8};
288 Array<std::string> values_b = {
"hello",
"world",
"another",
"test"};
289 Array<bool> values_c = {
true,
false,
false,
true};
290 Array<uint>
outputs(values_a.size(), 0);
292 MFParamsBuilder
params(fn, values_a.size());
293 params.add_readonly_single_input(values_a.as_span());
294 params.add_readonly_single_input(values_b.as_span());
295 params.add_readonly_single_input(values_c.as_span());
296 params.add_uninitialized_single_output(
outputs.as_mutable_span());
308 TEST(multi_function, CustomMF_SM)
310 CustomMF_SM<std::string> fn(
"AddSuffix", [](std::string &value) { value +=
" test"; });
312 Array<std::string> values = {
"a",
"b",
"c",
"d",
"e"};
314 MFParamsBuilder
params(fn, values.size());
315 params.add_single_mutable(values.as_mutable_span());
328 TEST(multi_function, CustomMF_Constant)
330 CustomMF_Constant<int> fn{42};
335 params.add_uninitialized_single_output(
outputs.as_mutable_span());
347 TEST(multi_function, CustomMF_GenericConstant)
350 CustomMF_GenericConstant fn{CPPType::get<int32_t>(), (
const void *)&value};
356 params.add_uninitialized_single_output(
outputs.as_mutable_span());
368 TEST(multi_function, CustomMF_GenericConstantArray)
370 std::array<int, 4> values = {3, 4, 5, 6};
371 CustomMF_GenericConstantArray fn{GSpan(Span(values))};
372 EXPECT_EQ(fn.param_name(0),
"[3, 4, 5, 6, ]");
374 GVectorArray vector_array{CPPType::get<int32_t>(), 4};
375 GVectorArray_TypedMutableRef<int> vector_array_ref{vector_array};
377 MFParamsBuilder
params(fn, vector_array.size());
378 params.add_vector_output(vector_array);
388 for (
int i = 1; i < 4; i++) {
396 TEST(multi_function, CustomMF_Convert)
398 CustomMF_Convert<float, int> fn;
400 Array<float>
inputs = {5.4f, 7.1f, 9.0f};
405 params.add_uninitialized_single_output(
outputs.as_mutable_span());
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define BUFFER_FOR_CPP_TYPE_VALUE(type, variable_name)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
static bNodeSocketTemplate outputs[]
static bNodeSocketTemplate inputs[]
struct SELECTID_Context context
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)