Nodes: support implicit conversions and incorrectly linked sockets

This commit is contained in:
2020-07-11 18:02:06 +02:00
parent 06401157a6
commit c7eada103c
3 changed files with 111 additions and 10 deletions

View File

@@ -202,6 +202,30 @@ template<typename Mut1> class CustomMF_SM : public MultiFunction {
}
};
/**
* Generates a multi-function that converts between two types.
*/
template<typename From, typename To> class CustomMF_Convert : public MultiFunction {
public:
CustomMF_Convert()
{
std::string name = CPPType::get<From>().name() + " to " + CPPType::get<To>().name();
MFSignatureBuilder signature = this->get_builder(std::move(name));
signature.single_input<From>("Input");
signature.single_output<To>("Output");
}
void call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const override
{
VSpan<From> inputs = params.readonly_single_input<From>(0);
MutableSpan<To> outputs = params.uninitialized_single_output<To>(1);
for (uint i : mask) {
new ((void *)&outputs[i]) To(inputs[i]);
}
}
};
/**
* A multi-function that outputs the same value every time. The value is not owned by an instance
* of this function. The caller is responsible for destructing and freeing the value.