[Bf-blender-cvs] [ea5f871d29f] functions: deduplicate code
Jacques Lucke
noreply at git.blender.org
Tue Dec 10 14:37:39 CET 2019
Commit: ea5f871d29f63b3a5ae73e3cb4c12971f10ee7a2
Author: Jacques Lucke
Date: Tue Dec 10 14:17:55 2019 +0100
Branches: functions
https://developer.blender.org/rBea5f871d29f63b3a5ae73e3cb4c12971f10ee7a2
deduplicate code
===================================================================
M source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
===================================================================
diff --git a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
index ad6d0e4c9a8..a8c3d22212a 100644
--- a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
@@ -138,12 +138,14 @@ static void build_math_fn(VNodeMFNetworkBuilder &builder, OutT (*func)(InT))
}
template<typename InT1, typename InT2, typename OutT, typename FuncT>
-static void build_math_fn_in2_out1(VNodeMFNetworkBuilder &builder, FuncT func)
-{
- auto fn = [=](MFMask mask,
- VirtualListRef<InT1> inputs1,
- VirtualListRef<InT2> inputs2,
- MutableArrayRef<OutT> outputs) -> void {
+static std::function<
+ void(MFMask, VirtualListRef<InT1>, VirtualListRef<InT2>, MutableArrayRef<OutT>)>
+vectorize_function_2in_1out(FuncT func)
+{
+ return [=](MFMask mask,
+ VirtualListRef<InT1> inputs1,
+ VirtualListRef<InT2> inputs2,
+ MutableArrayRef<OutT> outputs) -> void {
if (inputs1.is_non_single_full_array() && inputs2.is_non_single_full_array()) {
ArrayRef<InT1> in1_array = inputs1.as_full_array();
ArrayRef<InT2> in2_array = inputs2.as_full_array();
@@ -170,7 +172,12 @@ static void build_math_fn_in2_out1(VNodeMFNetworkBuilder &builder, FuncT func)
mask.foreach_index([=](uint i) { new (&outputs[i]) OutT(func(inputs1[i], inputs2[i])); });
}
};
+}
+template<typename InT1, typename InT2, typename OutT, typename FuncT>
+static void build_math_fn_in2_out1(VNodeMFNetworkBuilder &builder, FuncT func)
+{
+ auto fn = vectorize_function_2in_1out<InT1, InT2, OutT>(func);
builder.set_vectorized_constructed_matching_fn<MF_Custom_In2_Out1<InT1, InT2, OutT>>(
{"use_list__a", "use_list__b"}, builder.xnode().name(), fn);
}
@@ -178,35 +185,7 @@ static void build_math_fn_in2_out1(VNodeMFNetworkBuilder &builder, FuncT func)
template<typename T, typename FuncT>
static void build_variadic_math_fn(VNodeMFNetworkBuilder &builder, FuncT func, T default_value)
{
- auto fn = [=](MFMask mask,
- VirtualListRef<T> inputs1,
- VirtualListRef<T> inputs2,
- MutableArrayRef<T> outputs) {
- if (inputs1.is_non_single_full_array() && inputs2.is_non_single_full_array()) {
- ArrayRef<T> in1_array = inputs1.as_full_array();
- ArrayRef<T> in2_array = inputs2.as_full_array();
- mask.foreach_index([=](uint i) { outputs[i] = func(in1_array[i], in2_array[i]); });
- }
- else if (inputs1.is_non_single_full_array() && inputs2.is_single_element()) {
- ArrayRef<T> in1_array = inputs1.as_full_array();
- T in2_single = inputs2[0];
- mask.foreach_index([=](uint i) { outputs[i] = func(in1_array[i], in2_single); });
- }
- else if (inputs1.is_single_element() && inputs2.is_non_single_full_array()) {
- T in1_single = inputs1[0];
- ArrayRef<T> in2_array = inputs2.as_full_array();
- mask.foreach_index([=](uint i) { outputs[i] = func(in1_single, in2_array[i]); });
- }
- else if (inputs1.is_single_element() && inputs2.is_single_element()) {
- T in1_single = inputs1[0];
- T in2_single = inputs2[0];
- T out_single = func(in1_single, in2_single);
- outputs.fill_indices(mask.indices(), out_single);
- }
- else {
- mask.foreach_index([=](uint i) { outputs[i] = func(inputs1[i], inputs2[i]); });
- }
- };
+ auto fn = vectorize_function_2in_1out<T, T, T>(func);
Vector<bool> list_states = builder.get_list_base_variadic_states("variadic");
if (list_states.size() == 0) {
More information about the Bf-blender-cvs
mailing list