SchedulerCreator.hh 4.21 KB
/*
 * SchedulerCreator.hh
 *
 *  Created on: Dec 12, 2012
 *      Author: f.casimir
 */

#ifndef SchedulerCREATOR_HH_
#define SchedulerCREATOR_HH_

#include "DicError.hh"
#include "AMDA_exception.hh"

#include "ParamData.hh"
#include "VisitorOfParamData.hh"
#include "Scheduler.hh"

using namespace AMDA::Parameters;

namespace AMDA {
namespace Merge {

/**
 * @class SchedulerCreator
 * @brief Creator of the Operation Scheduler parameterized with ParamData input type.
 * @details Implement the interface VisitorOfParamData.
 */
class SchedulerCreator : public VisitorOfParamData {
public:
	/**
	 * @brief Constructor.
	 */
	SchedulerCreator(Process& pProcess, ParamData& paramInput)
		: _process(pProcess), _paramData(paramInput), _operation(NULL) {

		_paramData.accept(*this);
	}

	/**
	 * @overload VisitorOfParamData::visit(ParamDataScalaireShort *)
	 */
	void visit(ParamDataScalaireShort *) { _operation = new Scheduler<ParamDataScalaireShort>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataScalaireFloat *)
	 */
	void visit(ParamDataScalaireFloat *) { _operation = new Scheduler<ParamDataScalaireFloat>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataScalaireDouble *)
	 */
	void visit(ParamDataScalaireDouble *) { _operation = new Scheduler<ParamDataScalaireDouble>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataScalaireLongDouble *)
	 */
	void visit(ParamDataScalaireLongDouble *) { _operation = new Scheduler<ParamDataScalaireLongDouble>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataScalaireInt *)
	 */
	void visit(ParamDataScalaireInt *) { _operation = new Scheduler<ParamDataScalaireInt>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataLogicalData *)
	 */
	void visit(ParamDataLogicalData *) { _operation = new Scheduler<ParamDataLogicalData>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DShort *)
	 */
	void visit(ParamDataTab1DShort *) { _operation = new Scheduler<ParamDataTab1DShort>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DFloat *)
	 */
	void visit(ParamDataTab1DFloat *) { _operation = new Scheduler<ParamDataTab1DFloat>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DDouble *)
	 */
	void visit(ParamDataTab1DDouble *) { _operation = new Scheduler<ParamDataTab1DDouble>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DLongDouble *)
	 */
	void visit(ParamDataTab1DLongDouble *) { _operation = new Scheduler<ParamDataTab1DLongDouble>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DInt *)
	 */
	void visit(ParamDataTab1DInt *) { _operation = new Scheduler<ParamDataTab1DInt>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab1DLogicalData *)
	 */
	void visit(ParamDataTab1DLogicalData *) { _operation = new Scheduler<ParamDataTab1DLogicalData>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DShort *)
	 */
	void visit(ParamDataTab2DShort *) { _operation = new Scheduler<ParamDataTab2DShort>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DFloat *)
	 */
	void visit(ParamDataTab2DFloat *) { _operation = new Scheduler<ParamDataTab2DFloat>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DDouble *)
	 */
	void visit(ParamDataTab2DDouble *) { _operation = new Scheduler<ParamDataTab2DDouble>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DLongDouble *)
	 */
	void visit(ParamDataTab2DLongDouble *) { _operation = new Scheduler<ParamDataTab2DLongDouble>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DInt *)
	 */
	void visit(ParamDataTab2DInt *) { _operation = new Scheduler<ParamDataTab2DInt>( _process); }

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DLogicalData *)
	 */
	void visit(ParamDataTab2DLogicalData *) { _operation = new Scheduler<ParamDataTab2DLogicalData>( _process); }

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

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

} /* namespace Merge */
} /* namespace AMDA */
#endif /* SchedulerCREATOR_HH_ */