#ifndef __XIOS_CTransformation__ #define __XIOS_CTransformation__ #include "xios_spl.hpp" #include "xml_node.hpp" #include "transformation_enum.hpp" namespace xios { ///-------------------------------------------------------------- /*! \class CTransformation This class describes inverse_axis in xml file. */ template class CTransformation { public: typedef typename std::list* > > TransformationMapTypes; typedef TransformationMapTypes TransMapTypes; public : /// Constructeurs /// CTransformation(void) {} virtual void checkValid(T* dest) {} std::vector checkAuxInputs() { return checkAuxInputs_(); } static CTransformation* createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node=0); static CTransformation* getTransformation(ETranformationType transType, const StdString& id); virtual const string& getId(void) = 0 ; virtual ETranformationType getTransformationType(void)=0; virtual void inheritFrom(CTransformation* src) = 0 ; virtual const string& getId_(void) { ERROR("string Transformation::getId())",<< "unimplemented virtual function for child"); } ; virtual const string& getName(void) { ERROR("string Transformation::getId())",<< "unimplemented virtual function for child"); } ; virtual const string& getDefName(void) { ERROR("string Transformation::getId())",<< "unimplemented virtual function for child"); } ; /// Destructeur /// public: virtual ~CTransformation(void) {} protected: typedef CTransformation* (*createTransformationCallBack)(const StdString&, xml::CXMLNode*); typedef CTransformation* (*getIdTransformationCallBack)(const StdString&); typedef std::map> callBackMap; static callBackMap* callBacks_; static bool registerTransformation(ETranformationType transType, tuple callBackFunctions); static bool unregisterTransformation(ETranformationType transType); protected: virtual std::vector checkAuxInputs_() { return std::vector(); } }; // class CTransformation template typename CTransformation::callBackMap* CTransformation::callBacks_ = 0; //CTransformation::CallBackMap(); template CTransformation* CTransformation::createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node) { int transTypeInt = transType; typename callBackMap::const_iterator it = (*callBacks_).find(transType); if ((*callBacks_).end() == it) { ERROR("CTransformation::createTransformation(ETranformationType transType)", << "Transformation type " << transType << "doesn't exist. Please define."); } return (get<0>(it->second))(id,node); } template CTransformation* CTransformation::getTransformation(ETranformationType transType, const StdString& id) { int transTypeInt = transType; typename callBackMap::const_iterator it = (*callBacks_).find(transType); if ((*callBacks_).end() == it) { ERROR("CTransformation::getTransformation(ETranformationType transType, const StdString& id)", << "Transformation type " << transType << "doesn't exist. Please define."); } return (get<1>(it->second))(id); } template bool CTransformation::registerTransformation(ETranformationType transType, tuple functions) { if (0 == callBacks_) callBacks_ = new callBackMap(); return (* callBacks_).insert(make_pair(transType, functions)).second; } template bool CTransformation::unregisterTransformation(ETranformationType transType) { int transTypeInt = transType; return (1 == (*callBacks_).erase(transType)); } } // namespace xios #endif // __XIOS_CTransformation__