Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/functions/intern/multi_functions/lists.h')
-rw-r--r--source/blender/functions/intern/multi_functions/lists.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/source/blender/functions/intern/multi_functions/lists.h b/source/blender/functions/intern/multi_functions/lists.h
new file mode 100644
index 00000000000..8f89a3d7e69
--- /dev/null
+++ b/source/blender/functions/intern/multi_functions/lists.h
@@ -0,0 +1,110 @@
+#pragma once
+
+#include "FN_multi_function.h"
+
+namespace FN {
+
+class MF_GetListElement final : public MultiFunction {
+ private:
+ const CPPType &m_base_type;
+
+ public:
+ MF_GetListElement(const CPPType &base_type);
+ void call(IndexMask mask, MFParams params, MFContext context) const override;
+};
+
+class MF_GetListElements final : public MultiFunction {
+ private:
+ const CPPType &m_base_type;
+
+ public:
+ MF_GetListElements(const CPPType &base_type);
+ void call(IndexMask mask, MFParams params, MFContext context) const override;
+};
+
+class MF_ListLength final : public MultiFunction {
+ private:
+ const CPPType &m_base_type;
+
+ public:
+ MF_ListLength(const CPPType &base_type);
+ void call(IndexMask mask, MFParams params, MFContext context) const override;
+};
+
+class MF_PackList final : public MultiFunction {
+ private:
+ const CPPType &m_base_type;
+ Vector<bool> m_input_list_status;
+
+ public:
+ MF_PackList(const CPPType &base_type, ArrayRef<bool> input_list_status);
+ void call(IndexMask mask, MFParams params, MFContext context) const override;
+
+ private:
+ bool input_is_list(uint index) const;
+};
+
+template<typename T> class MF_EmptyList : public MultiFunction {
+ public:
+ MF_EmptyList()
+ {
+ MFSignatureBuilder signature = this->get_builder("Empty List - " + CPP_TYPE<T>().name());
+ signature.vector_output<T>("Output");
+ }
+
+ void call(IndexMask UNUSED(mask),
+ MFParams UNUSED(params),
+ MFContext UNUSED(context)) const override
+ {
+ }
+};
+
+template<typename FromT, typename ToT> class MF_ConvertList : public MultiFunction {
+ public:
+ MF_ConvertList()
+ {
+ MFSignatureBuilder signature = this->get_builder(CPP_TYPE<FromT>().name() + " List to " +
+ CPP_TYPE<ToT>().name() + " List");
+ signature.vector_input<FromT>("Inputs");
+ signature.vector_output<ToT>("Outputs");
+ }
+
+ void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
+ {
+ VirtualListListRef<FromT> inputs = params.readonly_vector_input<FromT>(0, "Inputs");
+ GenericVectorArray::MutableTypedRef<ToT> outputs = params.vector_output<ToT>(1, "Outputs");
+
+ for (uint index : mask.indices()) {
+ VirtualListRef<FromT> input_list = inputs[index];
+
+ for (uint i = 0; i < input_list.size(); i++) {
+ const FromT &from_value = input_list[i];
+ ToT to_value = static_cast<ToT>(from_value);
+ outputs.append_single(index, to_value);
+ }
+ }
+ }
+};
+
+template<typename T> class MF_SingleElementList : public MultiFunction {
+ public:
+ MF_SingleElementList()
+ {
+ MFSignatureBuilder signature = this->get_builder("Single Element List - " +
+ CPP_TYPE<T>().name());
+ signature.single_input<T>("Input");
+ signature.vector_output<T>("Outputs");
+ }
+
+ void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
+ {
+ VirtualListRef<T> inputs = params.readonly_single_input<T>(0, "Input");
+ GenericVectorArray::MutableTypedRef<T> outputs = params.vector_output<T>(1, "Outputs");
+
+ for (uint i : mask.indices()) {
+ outputs.append_single(i, inputs[i]);
+ }
+ }
+};
+
+}; // namespace FN