SumIntoTableRangeCreator.hh 9.15 KB
/*
 * SumIntoTableRangeCreator.hh
 *
 *  Created on: Oct 6, 2016
 *      Author: AKKA IS
 */

#ifndef FRAMEINTOTABLERANGECREATOR_HH_
#define FRAMEINTOTABLERANGECREATOR_HH_

#include "ParamData.hh"
#include "VisitorOfParamData.hh"
#include "AMDA_exception.hh"
#include "SumIntoTableRange.hh"
#include "AllTableRange.hh"

namespace AMDA {
    namespace Parameters {

        /**
         * @class SumIntoTableRangeCreator
         * @brief Creator of the Operation SumIntoTableRange parameterized with ParamData input type.
         * @details Implement the interface VisitorOfParamData.
         */
        class SumIntoTableRangeCreator : public VisitorOfParamData {
        public:

            /**
             * @brief Constructor.
             */
            SumIntoTableRangeCreator(Process& pProcess, ParamData& paramInput, double minRange1, double maxRange1, AMDA::Info::ParamTable* table1Ptr, int table1RelatedDim,
                    std::string type1_, double minRange2, double maxRange2, AMDA::Info::ParamTable* table2Ptr, std::string type2_)
            : _process(pProcess), _paramData(paramInput), _operation(NULL), _minRange1(minRange1), _maxRange1(maxRange1), _table1Ptr(table1Ptr), _table1RelatedDim(table1RelatedDim), _type1(type1_),
            _minRange2(minRange2), _maxRange2(maxRange2), _table2Ptr(table2Ptr), _type2(type2_) {
                _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("SumIntoTableRange operation not supported"));
            }

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

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

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

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

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

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

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

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

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

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

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

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DShort *)
             */
            void visit(ParamDataTab2DShort *) {
                create2d<short, ParamDataTab2DShort>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DFloat *)
             */
            void visit(ParamDataTab2DFloat *) {
                create2d<float, ParamDataTab2DFloat>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DDouble *)
             */
            void visit(ParamDataTab2DDouble *) {
                create2d<double, ParamDataTab2DDouble>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DLongDouble *)
             */
            void visit(ParamDataTab2DLongDouble *) {
                create2d<long double, ParamDataTab2DLongDouble>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DInt *)
             */
            void visit(ParamDataTab2DInt *) {
                create2d<int, ParamDataTab2DInt>();
            }

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

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

            template<typename DataType, typename CastType>
            void create1d() {
                if (_type1 == "all") {
                     _operation = new AllTableRange::AllTableRange1D<DataType>(_process, dynamic_cast<CastType &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _type1);
                } else {
                    _operation = new SumIntoTableRange::SumIntoTableRange1D<DataType>(_process, dynamic_cast<CastType &> (_paramData), _minRange1, _maxRange1, _table1Ptr, _type1);
                }
            }

            template<typename DataType, typename CastType>
            void create2d() {
                if (_type1 == "all" && (_type1 == _type2 || _type2 =="" || _type2 ==" " ))  {
                    if (_maxRange2 < 0) {
                        _operation = new AllTableRange::AllTableRange2DOneRange<DataType>(_process, dynamic_cast<CastType &> (_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _type1);
                    } else {
                        _operation = new AllTableRange::AllTableRange2DTwoRanges<DataType>(_process, dynamic_cast<CastType &> (_paramData), _minRange1, _maxRange1,_table1Ptr, _table1RelatedDim, _type1, _minRange2, _maxRange2, _table2Ptr, _type2);
                    }

                } else if (_type1 != "all" && _type2 != "all") {
                    if (_maxRange2 < 0) {
                        _operation = new SumIntoTableRange::SumIntoTableRange2DOneRange<DataType>(_process, dynamic_cast<CastType &> (_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _type1);
                    } else {
                        _operation = new SumIntoTableRange::SumIntoTableRange2DTwoRanges<DataType>(_process, dynamic_cast<CastType &> (_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _type1, _minRange2, _maxRange2, _table2Ptr, _type2);
                    }
                } else {
                    _operation = new SumIntoTableRange::MixedTableRange2DTwoRanges<DataType>(_process, dynamic_cast<CastType &> (_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _type1, _minRange2, _maxRange2, _table2Ptr, _type2);
                }
            }

        private:
            Process &_process;
            ParamData &_paramData;
            Operation *_operation;
            double _minRange1;
            double _maxRange1;
            AMDA::Info::ParamTable* _table1Ptr;
            int _table1RelatedDim;
            std::string _type1;
            double _minRange2;
            double _maxRange2;
            AMDA::Info::ParamTable* _table2Ptr;
            std::string _type2;
        };

    } /* namespace Parameters */
} /* namespace AMDA */
#endif /* FRAMEINTOTABLERANGECREATOR_HH_ */