Changeset View
Changeset View
Standalone View
Standalone View
source/blender/functions/FN_multi_function_builder.hh
| Show All 37 Lines | |||||
| */ | */ | ||||
| template<typename In1, typename Out1> class CustomMF_SI_SO : public MultiFunction { | template<typename In1, typename Out1> class CustomMF_SI_SO : public MultiFunction { | ||||
| private: | private: | ||||
| using FunctionT = std::function<void(IndexMask, const VArray<In1> &, MutableSpan<Out1>)>; | using FunctionT = std::function<void(IndexMask, const VArray<In1> &, MutableSpan<Out1>)>; | ||||
| FunctionT function_; | FunctionT function_; | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| CustomMF_SI_SO(StringRef name, FunctionT function) : function_(std::move(function)) | CustomMF_SI_SO(const char *name, FunctionT function) : function_(std::move(function)) | ||||
| { | { | ||||
| MFSignatureBuilder signature{name}; | MFSignatureBuilder signature{name}; | ||||
| signature.single_input<In1>("In1"); | signature.single_input<In1>("In1"); | ||||
| signature.single_output<Out1>("Out1"); | signature.single_output<Out1>("Out1"); | ||||
| signature_ = signature.build(); | signature_ = signature.build(); | ||||
| this->set_signature(&signature_); | this->set_signature(&signature_); | ||||
| } | } | ||||
| template<typename ElementFuncT> | template<typename ElementFuncT> | ||||
| CustomMF_SI_SO(StringRef name, ElementFuncT element_fn) | CustomMF_SI_SO(const char *name, ElementFuncT element_fn) | ||||
| : CustomMF_SI_SO(name, CustomMF_SI_SO::create_function(element_fn)) | : CustomMF_SI_SO(name, CustomMF_SI_SO::create_function(element_fn)) | ||||
| { | { | ||||
| } | } | ||||
| template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | ||||
| { | { | ||||
| return [=](IndexMask mask, const VArray<In1> &in1, MutableSpan<Out1> out1) { | return [=](IndexMask mask, const VArray<In1> &in1, MutableSpan<Out1> out1) { | ||||
| /* Devirtualization results in a 2-3x speedup for some simple functions. */ | /* Devirtualization results in a 2-3x speedup for some simple functions. */ | ||||
| Show All 22 Lines | |||||
| class CustomMF_SI_SI_SO : public MultiFunction { | class CustomMF_SI_SI_SO : public MultiFunction { | ||||
| private: | private: | ||||
| using FunctionT = | using FunctionT = | ||||
| std::function<void(IndexMask, const VArray<In1> &, const VArray<In2> &, MutableSpan<Out1>)>; | std::function<void(IndexMask, const VArray<In1> &, const VArray<In2> &, MutableSpan<Out1>)>; | ||||
| FunctionT function_; | FunctionT function_; | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| CustomMF_SI_SI_SO(StringRef name, FunctionT function) : function_(std::move(function)) | CustomMF_SI_SI_SO(const char *name, FunctionT function) : function_(std::move(function)) | ||||
| { | { | ||||
| MFSignatureBuilder signature{name}; | MFSignatureBuilder signature{name}; | ||||
| signature.single_input<In1>("In1"); | signature.single_input<In1>("In1"); | ||||
| signature.single_input<In2>("In2"); | signature.single_input<In2>("In2"); | ||||
| signature.single_output<Out1>("Out1"); | signature.single_output<Out1>("Out1"); | ||||
| signature_ = signature.build(); | signature_ = signature.build(); | ||||
| this->set_signature(&signature_); | this->set_signature(&signature_); | ||||
| } | } | ||||
| template<typename ElementFuncT> | template<typename ElementFuncT> | ||||
| CustomMF_SI_SI_SO(StringRef name, ElementFuncT element_fn) | CustomMF_SI_SI_SO(const char *name, ElementFuncT element_fn) | ||||
| : CustomMF_SI_SI_SO(name, CustomMF_SI_SI_SO::create_function(element_fn)) | : CustomMF_SI_SI_SO(name, CustomMF_SI_SI_SO::create_function(element_fn)) | ||||
| { | { | ||||
| } | } | ||||
| template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | ||||
| { | { | ||||
| return [=](IndexMask mask, | return [=](IndexMask mask, | ||||
| const VArray<In1> &in1, | const VArray<In1> &in1, | ||||
| Show All 30 Lines | using FunctionT = std::function<void(IndexMask, | ||||
| const VArray<In1> &, | const VArray<In1> &, | ||||
| const VArray<In2> &, | const VArray<In2> &, | ||||
| const VArray<In3> &, | const VArray<In3> &, | ||||
| MutableSpan<Out1>)>; | MutableSpan<Out1>)>; | ||||
| FunctionT function_; | FunctionT function_; | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| CustomMF_SI_SI_SI_SO(StringRef name, FunctionT function) : function_(std::move(function)) | CustomMF_SI_SI_SI_SO(const char *name, FunctionT function) : function_(std::move(function)) | ||||
| { | { | ||||
| MFSignatureBuilder signature{name}; | MFSignatureBuilder signature{name}; | ||||
| signature.single_input<In1>("In1"); | signature.single_input<In1>("In1"); | ||||
| signature.single_input<In2>("In2"); | signature.single_input<In2>("In2"); | ||||
| signature.single_input<In3>("In3"); | signature.single_input<In3>("In3"); | ||||
| signature.single_output<Out1>("Out1"); | signature.single_output<Out1>("Out1"); | ||||
| signature_ = signature.build(); | signature_ = signature.build(); | ||||
| this->set_signature(&signature_); | this->set_signature(&signature_); | ||||
| } | } | ||||
| template<typename ElementFuncT> | template<typename ElementFuncT> | ||||
| CustomMF_SI_SI_SI_SO(StringRef name, ElementFuncT element_fn) | CustomMF_SI_SI_SI_SO(const char *name, ElementFuncT element_fn) | ||||
| : CustomMF_SI_SI_SI_SO(name, CustomMF_SI_SI_SI_SO::create_function(element_fn)) | : CustomMF_SI_SI_SI_SO(name, CustomMF_SI_SI_SI_SO::create_function(element_fn)) | ||||
| { | { | ||||
| } | } | ||||
| template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | ||||
| { | { | ||||
| return [=](IndexMask mask, | return [=](IndexMask mask, | ||||
| const VArray<In1> &in1, | const VArray<In1> &in1, | ||||
| Show All 32 Lines | using FunctionT = std::function<void(IndexMask, | ||||
| const VArray<In2> &, | const VArray<In2> &, | ||||
| const VArray<In3> &, | const VArray<In3> &, | ||||
| const VArray<In4> &, | const VArray<In4> &, | ||||
| MutableSpan<Out1>)>; | MutableSpan<Out1>)>; | ||||
| FunctionT function_; | FunctionT function_; | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| CustomMF_SI_SI_SI_SI_SO(StringRef name, FunctionT function) : function_(std::move(function)) | CustomMF_SI_SI_SI_SI_SO(const char *name, FunctionT function) : function_(std::move(function)) | ||||
| { | { | ||||
| MFSignatureBuilder signature{name}; | MFSignatureBuilder signature{name}; | ||||
| signature.single_input<In1>("In1"); | signature.single_input<In1>("In1"); | ||||
| signature.single_input<In2>("In2"); | signature.single_input<In2>("In2"); | ||||
| signature.single_input<In3>("In3"); | signature.single_input<In3>("In3"); | ||||
| signature.single_input<In4>("In4"); | signature.single_input<In4>("In4"); | ||||
| signature.single_output<Out1>("Out1"); | signature.single_output<Out1>("Out1"); | ||||
| signature_ = signature.build(); | signature_ = signature.build(); | ||||
| this->set_signature(&signature_); | this->set_signature(&signature_); | ||||
| } | } | ||||
| template<typename ElementFuncT> | template<typename ElementFuncT> | ||||
| CustomMF_SI_SI_SI_SI_SO(StringRef name, ElementFuncT element_fn) | CustomMF_SI_SI_SI_SI_SO(const char *name, ElementFuncT element_fn) | ||||
| : CustomMF_SI_SI_SI_SI_SO(name, CustomMF_SI_SI_SI_SI_SO::create_function(element_fn)) | : CustomMF_SI_SI_SI_SI_SO(name, CustomMF_SI_SI_SI_SI_SO::create_function(element_fn)) | ||||
| { | { | ||||
| } | } | ||||
| template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | ||||
| { | { | ||||
| return [=](IndexMask mask, | return [=](IndexMask mask, | ||||
| const VArray<In1> &in1, | const VArray<In1> &in1, | ||||
| Show All 24 Lines | |||||
| */ | */ | ||||
| template<typename Mut1> class CustomMF_SM : public MultiFunction { | template<typename Mut1> class CustomMF_SM : public MultiFunction { | ||||
| private: | private: | ||||
| using FunctionT = std::function<void(IndexMask, MutableSpan<Mut1>)>; | using FunctionT = std::function<void(IndexMask, MutableSpan<Mut1>)>; | ||||
| FunctionT function_; | FunctionT function_; | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| CustomMF_SM(StringRef name, FunctionT function) : function_(std::move(function)) | CustomMF_SM(const char *name, FunctionT function) : function_(std::move(function)) | ||||
| { | { | ||||
| MFSignatureBuilder signature{name}; | MFSignatureBuilder signature{name}; | ||||
| signature.single_mutable<Mut1>("Mut1"); | signature.single_mutable<Mut1>("Mut1"); | ||||
| signature_ = signature.build(); | signature_ = signature.build(); | ||||
| this->set_signature(&signature_); | this->set_signature(&signature_); | ||||
| } | } | ||||
| template<typename ElementFuncT> | template<typename ElementFuncT> | ||||
| CustomMF_SM(StringRef name, ElementFuncT element_fn) | CustomMF_SM(const char *name, ElementFuncT element_fn) | ||||
| : CustomMF_SM(name, CustomMF_SM::create_function(element_fn)) | : CustomMF_SM(name, CustomMF_SM::create_function(element_fn)) | ||||
| { | { | ||||
| } | } | ||||
| template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn) | ||||
| { | { | ||||
| return [=](IndexMask mask, MutableSpan<Mut1> mut1) { | return [=](IndexMask mask, MutableSpan<Mut1> mut1) { | ||||
| mask.foreach_index([&](int i) { element_fn(mut1[i]); }); | mask.foreach_index([&](int i) { element_fn(mut1[i]); }); | ||||
| Show All 15 Lines | public: | ||||
| CustomMF_Convert() | CustomMF_Convert() | ||||
| { | { | ||||
| static MFSignature signature = create_signature(); | static MFSignature signature = create_signature(); | ||||
| this->set_signature(&signature); | this->set_signature(&signature); | ||||
| } | } | ||||
| static MFSignature create_signature() | static MFSignature create_signature() | ||||
| { | { | ||||
| std::string name = CPPType::get<From>().name() + " to " + CPPType::get<To>().name(); | static std::string name = CPPType::get<From>().name() + " to " + CPPType::get<To>().name(); | ||||
| MFSignatureBuilder signature{std::move(name)}; | MFSignatureBuilder signature{name.c_str()}; | ||||
| signature.single_input<From>("Input"); | signature.single_input<From>("Input"); | ||||
| signature.single_output<To>("Output"); | signature.single_output<To>("Output"); | ||||
| return signature.build(); | return signature.build(); | ||||
| } | } | ||||
| void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override | void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override | ||||
| { | { | ||||
| const VArray<From> &inputs = params.readonly_single_input<From>(0); | const VArray<From> &inputs = params.readonly_single_input<From>(0); | ||||
| ▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | |||||
| private: | private: | ||||
| T value_; | T value_; | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| template<typename U> CustomMF_Constant(U &&value) : value_(std::forward<U>(value)) | template<typename U> CustomMF_Constant(U &&value) : value_(std::forward<U>(value)) | ||||
| { | { | ||||
| MFSignatureBuilder signature{"Constant"}; | MFSignatureBuilder signature{"Constant"}; | ||||
| std::stringstream ss; | signature.single_output<T>("Value"); | ||||
| ss << value_; | |||||
| signature.single_output<T>(ss.str()); | |||||
| signature_ = signature.build(); | signature_ = signature.build(); | ||||
| this->set_signature(&signature_); | this->set_signature(&signature_); | ||||
| } | } | ||||
| void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override | void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override | ||||
| { | { | ||||
| MutableSpan<T> output = params.uninitialized_single_output<T>(0); | MutableSpan<T> output = params.uninitialized_single_output<T>(0); | ||||
| mask.foreach_index([&](int i) { new (&output[i]) T(value_); }); | mask.foreach_index([&](int i) { new (&output[i]) T(value_); }); | ||||
| Show All 23 Lines | |||||
| }; | }; | ||||
| class CustomMF_DefaultOutput : public MultiFunction { | class CustomMF_DefaultOutput : public MultiFunction { | ||||
| private: | private: | ||||
| int output_amount_; | int output_amount_; | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| CustomMF_DefaultOutput(StringRef name, | CustomMF_DefaultOutput(Span<MFDataType> input_types, Span<MFDataType> output_types); | ||||
| Span<MFDataType> input_types, | |||||
| Span<MFDataType> output_types); | |||||
| void call(IndexMask mask, MFParams params, MFContext context) const override; | void call(IndexMask mask, MFParams params, MFContext context) const override; | ||||
| }; | }; | ||||
| class CustomMF_GenericCopy : public MultiFunction { | class CustomMF_GenericCopy : public MultiFunction { | ||||
| private: | private: | ||||
| MFSignature signature_; | MFSignature signature_; | ||||
| public: | public: | ||||
| CustomMF_GenericCopy(StringRef name, MFDataType data_type); | CustomMF_GenericCopy(MFDataType data_type); | ||||
| void call(IndexMask mask, MFParams params, MFContext context) const override; | void call(IndexMask mask, MFParams params, MFContext context) const override; | ||||
| }; | }; | ||||
| } // namespace blender::fn | } // namespace blender::fn | ||||