Node ModelBuilder::AddTypeCastNode()

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());
}