in interfaces/common/src/ModelBuilderInterface.cpp [203:323]
Node ModelBuilder::AddTypeCastNode(Model model, PortElements input, PortType outputType)
{
auto elements = input.GetPortElements();
ell::model::Node* newNode = nullptr;
switch (input.GetType())
{
case PortType::integer:
switch (outputType)
{
case PortType::integer:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int, int>>(ell::model::PortElements<int>(elements));
break;
case PortType::bigInt:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int, int64_t>>(ell::model::PortElements<int>(elements));
break;
case PortType::real:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int, double>>(ell::model::PortElements<int>(elements));
break;
case PortType::smallReal:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int, float>>(ell::model::PortElements<int>(elements));
break;
case PortType::boolean:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int, bool>>(ell::model::PortElements<int>(elements));
break;
default:
throw std::invalid_argument("Error: CastNode unknown output type");
}
break;
case PortType::bigInt:
switch (outputType)
{
case PortType::integer:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int64_t, int>>(ell::model::PortElements<int64_t>(elements));
break;
case PortType::bigInt:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int64_t, int64_t>>(ell::model::PortElements<int64_t>(elements));
break;
case PortType::real:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int64_t, double>>(ell::model::PortElements<int64_t>(elements));
break;
case PortType::smallReal:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int64_t, float>>(ell::model::PortElements<int64_t>(elements));
break;
case PortType::boolean:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<int64_t, bool>>(ell::model::PortElements<int64_t>(elements));
break;
default:
throw std::invalid_argument("Error: CastNode unknown output type");
}
break;
case PortType::real:
switch (outputType)
{
case PortType::integer:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<double, int>>(ell::model::PortElements<double>(elements));
break;
case PortType::bigInt:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<double, int64_t>>(ell::model::PortElements<double>(elements));
break;
case PortType::real:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<double, double>>(ell::model::PortElements<double>(elements));
break;
case PortType::smallReal:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<double, float>>(ell::model::PortElements<double>(elements));
break;
case PortType::boolean:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<double, bool>>(ell::model::PortElements<double>(elements));
break;
default:
throw std::invalid_argument("Error: CastNode unknown output type");
}
break;
case PortType::smallReal:
switch (outputType)
{
case PortType::integer:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<float, int>>(ell::model::PortElements<float>(elements));
break;
case PortType::bigInt:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<float, int64_t>>(ell::model::PortElements<float>(elements));
break;
case PortType::real:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<float, double>>(ell::model::PortElements<float>(elements));
break;
case PortType::smallReal:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<float, float>>(ell::model::PortElements<float>(elements));
break;
case PortType::boolean:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<float, bool>>(ell::model::PortElements<float>(elements));
break;
default:
throw std::invalid_argument("Error: CastNode unknown output type");
}
break;
case PortType::boolean:
switch (outputType)
{
case PortType::integer:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<bool, int>>(ell::model::PortElements<bool>(elements));
break;
case PortType::bigInt:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<bool, int64_t>>(ell::model::PortElements<bool>(elements));
break;
case PortType::real:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<bool, double>>(ell::model::PortElements<bool>(elements));
break;
case PortType::smallReal:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<bool, float>>(ell::model::PortElements<bool>(elements));
break;
case PortType::boolean:
newNode = model.GetModel()->AddNode<ell::nodes::TypeCastNode<bool, bool>>(ell::model::PortElements<bool>(elements));
break;
default:
throw std::invalid_argument("Error: CastNode unknown output type");
}
break;
default:
throw std::invalid_argument("Error: CastNode unknown input type");
}
return Node(newNode, model.GetModel());
}