MorschhauserCreator.hh 6.13 KB
/*
 * MorschhauserCreator.hh
 *
 *  Created on: May 30, 2016
 *      Author: AKKA IS
 */

#ifndef MORSCHHAUSERCREATOR_HH_
#define MORSCHHAUSERCREATOR_HH_

#include "ParamData.hh"
#include "VisitorOfParamData.hh"
#include "Morschhauser.hh"

namespace AMDA {
namespace Parameters {

/**
 * @class MorschhauserCreator
 * @brief Creator of the Operation used to compute "Morshhauser Mars Model Magnetic Field"  along an orbit.
 */
class MorschhauserCreator : public VisitorOfParamData {
public:
	/**
	 * @brief Constructor.
	 */
	MorschhauserCreator(Process& pProcess, ParamData& paramInput, bool bMagOutput)
		: _process(pProcess), _paramData(paramInput), _operation(NULL), _bMagOutput(bMagOutput) {

		_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 *) {
		if (!_bMagOutput)
			_operation = new MorschhauserBField<short>( _process, dynamic_cast<ParamDataTab1DShort &>(_paramData));
		else
			_operation = new MorschhauserBMag<short>( _process, dynamic_cast<ParamDataTab1DShort &>(_paramData));
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DFloat *)
	 */
	void visit(ParamDataTab1DFloat *) {
		if (!_bMagOutput)
			_operation = new MorschhauserBField<float>( _process, dynamic_cast<ParamDataTab1DFloat &>(_paramData));
		else
			_operation = new MorschhauserBMag<float>( _process, dynamic_cast<ParamDataTab1DFloat &>(_paramData));
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DDouble *)
	 */
	void visit(ParamDataTab1DDouble *) {
		if (!_bMagOutput)
			_operation = new MorschhauserBField<double>( _process, dynamic_cast<ParamDataTab1DDouble &>(_paramData));
		else
			_operation = new MorschhauserBMag<double>( _process, dynamic_cast<ParamDataTab1DDouble &>(_paramData));
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DLongDouble *)
	 */
	void visit(ParamDataTab1DLongDouble *) {
		if (!_bMagOutput)
			_operation = new MorschhauserBField<long double>( _process, dynamic_cast<ParamDataTab1DLongDouble &>(_paramData));
		else
			_operation = new MorschhauserBMag<long double>( _process, dynamic_cast<ParamDataTab1DLongDouble &>(_paramData));
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DInt *)
	 */
	void visit(ParamDataTab1DInt *) {
		if (!_bMagOutput)
			_operation = new MorschhauserBField<int>( _process, dynamic_cast<ParamDataTab1DInt &>(_paramData));
		else
			_operation = new MorschhauserBMag<int>( _process, dynamic_cast<ParamDataTab1DInt &>(_paramData));
	}

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

private:
	Process   &_process;
	ParamData &_paramData;
	Operation *_operation;
	bool      _bMagOutput;
};

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