InternalFieldsCreator.hh 7.81 KB
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * File:   InternalFieldsCreator.hh
 * Author: Furkan - AKKA I&S
 *
 * Created on July 11, 2022, 4:14 PM
 */

#ifndef INTERNALFIELDSCREATOR_HH
#define INTERNALFIELDSCREATOR_HH

#include "ParamData.hh"
#include "VisitorOfParamData.hh"
#include "InternalFields.hh"

namespace AMDA
{
    namespace Parameters
    {

        class InternalFieldsCreator : public VisitorOfParamData
        {
        public:
            InternalFieldsCreator(Process &pProcess, ParamData &paramInput, std::string output, const std::string &modelname, const unsigned int addCon2020)
                : _process(pProcess), _paramData(paramInput), _operation(NULL), _output(output), _modelname(modelname), _addCon2020(addCon2020)
            {

                _paramData.accept(*this);
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireShort *)
             */
            void visit(ParamDataScalaireShort *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataScalaireShort data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireFloat *)
             */
            void visit(ParamDataScalaireFloat *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataScalaireFloat data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireDouble *)
             */
            void visit(ParamDataScalaireDouble *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataScalaireDouble data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireLongDouble *)
             */
            void visit(ParamDataScalaireLongDouble *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataScalaireLongDouble data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireInt *)
             */
            void visit(ParamDataScalaireInt *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataScalaireInt data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataLogicalData *)
             */
            void visit(ParamDataLogicalData *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataLogicalData data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DShort *)
             */
            void visit(ParamDataTab1DShort *)
            {
                create<short>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DFloat *)
             */
            void visit(ParamDataTab1DFloat *)
            {
                create<float>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DDouble *)
             */
            void visit(ParamDataTab1DDouble *)
            {
                create<double>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DLongDouble *)
             */
            void visit(ParamDataTab1DLongDouble *)
            {
                create<long double>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DInt *)
             */
            void visit(ParamDataTab1DInt *)
            {
                create<int>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DLogicalData *)
             */
            void visit(ParamDataTab1DLogicalData *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataTab1DLogicalData data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DShort *)
             */
            void visit(ParamDataTab2DShort *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataTab2DShort data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DFloat *)
             */
            void visit(ParamDataTab2DFloat *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataTab2DFloat data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DDouble *)
             */
            void visit(ParamDataTab2DDouble *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataTab2DDouble data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DLongDouble *)
             */
            void visit(ParamDataTab2DLongDouble *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataTab2DLongDouble data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DInt *)
             */
            void visit(ParamDataTab2DInt *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataTab2DInt data not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DLogicalData *)
             */
            void visit(ParamDataTab2DLogicalData *)
            {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("ParamDataTab2DLogicalData data not supported"));
            }

            /**
             * @brief get the TimeShifted parameterized operation.
             */
            Operation *getOperation() const
            {
                return _operation;
            }

            template <typename DataType>
            void create()
            {

                if (_output == "cart")
                    _operation = new InternalFieldCart<DataType>(_process, dynamic_cast<ParamDataSpec<std::vector<DataType>> &>(_paramData), _modelname, _addCon2020);
                else if (_output == "mag")
                    _operation = new InternalFieldMag<DataType>(_process, dynamic_cast<ParamDataSpec<std::vector<DataType>> &>(_paramData), _modelname, _addCon2020);
                else if (_output == "pol")
                    _operation = new InternalFieldPol<DataType>(_process, dynamic_cast<ParamDataSpec<std::vector<DataType>> &>(_paramData), _modelname, _addCon2020);
                else
                    BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg(" output type not supported"));
            }

        private:
            Process &_process;
            ParamData &_paramData;
            Operation *_operation;
            std::string _output;
            std::string _modelname;
            const unsigned int _addCon2020;
        };
    }
}

#endif /* INTERNALFIELDSCREATOR_HH */