/*! \file grid_transformation_factory_impl.hpp \author Ha NGUYEN \since 23 June 2016 \date 23 June 2016 \brief Helper class to create different transformations. */ #ifndef __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__ #define __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__ #include "xios_spl.hpp" #include "exception.hpp" #include "transformation.hpp" namespace xios { class CGrid; class CGenericAlgorithmTransformation; /*! \class CGridTransformationFactory This class is a helper class to chose a algorithm (transformation) from the alogrithm list of specific grid. */ template class CGridTransformationFactory { public: /** Default constructor */ CGridTransformationFactory() {} virtual ~CGridTransformationFactory() {} static CGenericAlgorithmTransformation* createTransformation(ETranformationType transType, CGrid* gridDst, CGrid* gridSrc, CTransformation* transformation, int elementPositionInGrid, std::map& elementPositionInGridSrc2ScalarPosition, std::map& elementPositionInGridSrc2AxisPosition, std::map& elementPositionInGridSrc2DomainPosition, std::map& elementPositionInGridDst2ScalarPosition, std::map& elementPositionInGridDst2AxisPosition, std::map& elementPositionInGridDst2DomainPosition); public: typedef CGenericAlgorithmTransformation* (*CreateTransformationCallBack)(CGrid* gridDst, CGrid* gridSrc, CTransformation* transformation, int elementPositionInGrid, std::map& elementPositionInGridSrc2ScalarPosition, std::map& elementPositionInGridSrc2AxisPosition, std::map& elementPositionInGridSrc2DomainPosition, std::map& elementPositionInGridDst2ScalarPosition, std::map& elementPositionInGridDst2AxisPosition, std::map& elementPositionInGridDst2DomainPosition); typedef std::map CallBackMap; static CallBackMap* transformationCreationCallBacks_; static bool registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn); static bool unregisterTransformation(ETranformationType transType); static bool initializeTransformation_; }; template typename CGridTransformationFactory::CallBackMap* CGridTransformationFactory::transformationCreationCallBacks_ = 0; template bool CGridTransformationFactory::initializeTransformation_ = false; template CGenericAlgorithmTransformation* CGridTransformationFactory::createTransformation(ETranformationType transType, CGrid* gridDst, CGrid* gridSrc, CTransformation* transformation, int elementPositionInGrid, std::map& elementPositionInGridSrc2ScalarPosition, std::map& elementPositionInGridSrc2AxisPosition, std::map& elementPositionInGridSrc2DomainPosition, std::map& elementPositionInGridDst2ScalarPosition, std::map& elementPositionInGridDst2AxisPosition, std::map& elementPositionInGridDst2DomainPosition) { typename CallBackMap::const_iterator it = (*transformationCreationCallBacks_).find(transType); if ((*transformationCreationCallBacks_).end() == it) { ERROR("CGridTransformationFactory::createTransformation(ETranformationType transType)", << "Transformation type " << transType << "doesn't exist. Please define."); } return (it->second)(gridDst, gridSrc, transformation, elementPositionInGrid, elementPositionInGridSrc2ScalarPosition, elementPositionInGridSrc2AxisPosition, elementPositionInGridSrc2DomainPosition, elementPositionInGridDst2ScalarPosition, elementPositionInGridDst2AxisPosition, elementPositionInGridDst2DomainPosition); } template bool CGridTransformationFactory::registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn) { if (0 == transformationCreationCallBacks_) transformationCreationCallBacks_ = new CallBackMap(); return (*transformationCreationCallBacks_).insert(make_pair(transType, createFn)).second; } template bool CGridTransformationFactory::unregisterTransformation(ETranformationType transType) { return (1 == (*transformationCreationCallBacks_).erase(transType)); } } #endif // __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__