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

#ifndef FRAMEINTOTABLERANGECREATOR_HH_
#define FRAMEINTOTABLERANGECREATOR_HH_

#include "ParamData.hh"
#include "VisitorOfParamData.hh"
#include "SumIntoTableRange.hh"
#include "AMDA_exception.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, double minRange2, double maxRange2, AMDA::Info::ParamTable* table2Ptr)
		: _process(pProcess), _paramData(paramInput), _operation(NULL), _minRange1(minRange1), _maxRange1(maxRange1), _table1Ptr(table1Ptr), _table1RelatedDim(table1RelatedDim), _minRange2(minRange2), _maxRange2(maxRange2), _table2Ptr(table2Ptr) {
		_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 *) {_operation = new SumIntoTableRange::SumIntoTableRange1D<short>( _process, dynamic_cast<ParamDataTab1DShort &>(_paramData), _minRange1, _maxRange1, _table1Ptr);}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DFloat *)
	 */
	void visit(ParamDataTab1DFloat *) {_operation = new SumIntoTableRange::SumIntoTableRange1D<float>( _process, dynamic_cast<ParamDataTab1DFloat &>(_paramData), _minRange1, _maxRange1, _table1Ptr);}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DDouble *)
	 */
	void visit(ParamDataTab1DDouble *) {_operation = new SumIntoTableRange::SumIntoTableRange1D<double>( _process, dynamic_cast<ParamDataTab1DDouble &>(_paramData), _minRange1, _maxRange1, _table1Ptr);}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DLongDouble *)
	 */
	void visit(ParamDataTab1DLongDouble *) {_operation = new SumIntoTableRange::SumIntoTableRange1D<long double>( _process, dynamic_cast<ParamDataTab1DLongDouble &>(_paramData), _minRange1, _maxRange1, _table1Ptr);}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DInt *)
	 */
	void visit(ParamDataTab1DInt *) {_operation = new SumIntoTableRange::SumIntoTableRange1D<int>( _process, dynamic_cast<ParamDataTab1DInt &>(_paramData), _minRange1, _maxRange1, _table1Ptr);}

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

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DShort *)
	 */
	void visit(ParamDataTab2DShort *) {
		if (_table2Ptr == NULL) {
			_operation = new SumIntoTableRange::SumIntoTableRange2DOneRange<short>(_process, dynamic_cast<ParamDataTab2DShort &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim);
		}
		else {
			_operation = new SumIntoTableRange::SumIntoTableRange2DTwoRanges<short>(_process, dynamic_cast<ParamDataTab2DShort &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _minRange2, _maxRange2, _table2Ptr);
		}
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DFloat *)
	 */
	void visit(ParamDataTab2DFloat *) {
		if (_table2Ptr == NULL) {
			_operation = new SumIntoTableRange::SumIntoTableRange2DOneRange<float>(_process, dynamic_cast<ParamDataTab2DFloat &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim);
		}
		else {
			_operation = new SumIntoTableRange::SumIntoTableRange2DTwoRanges<float>(_process, dynamic_cast<ParamDataTab2DFloat &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _minRange2, _maxRange2, _table2Ptr);
		}
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DDouble *)
	 */
	void visit(ParamDataTab2DDouble *) {
		if (_table2Ptr == NULL) {
			_operation = new SumIntoTableRange::SumIntoTableRange2DOneRange<double>(_process, dynamic_cast<ParamDataTab2DDouble &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim);
		}
		else {
			_operation = new SumIntoTableRange::SumIntoTableRange2DTwoRanges<double>(_process, dynamic_cast<ParamDataTab2DDouble &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _minRange2, _maxRange2, _table2Ptr);
		}
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DLongDouble *)
	 */
	void visit(ParamDataTab2DLongDouble *) {
		if (_table2Ptr == NULL) {
			_operation = new SumIntoTableRange::SumIntoTableRange2DOneRange<long double>(_process, dynamic_cast<ParamDataTab2DLongDouble &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim);
		}
		else {
			_operation = new SumIntoTableRange::SumIntoTableRange2DTwoRanges<long double>(_process, dynamic_cast<ParamDataTab2DLongDouble &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _minRange2, _maxRange2, _table2Ptr);
		}
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DInt *)
	 */
	void visit(ParamDataTab2DInt *) {
		if (_table2Ptr == NULL) {
			_operation = new SumIntoTableRange::SumIntoTableRange2DOneRange<int>(_process, dynamic_cast<ParamDataTab2DInt &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim);
		}
		else {
			_operation = new SumIntoTableRange::SumIntoTableRange2DTwoRanges<int>(_process, dynamic_cast<ParamDataTab2DInt &>(_paramData), _minRange1, _maxRange1, _table1Ptr, _table1RelatedDim, _minRange2, _maxRange2, _table2Ptr);
		}
	}

	/**
	 * @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;	}

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

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