source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/transformation.hpp @ 2118

Last change on this file since 2118 was 2118, checked in by jderouillat, 3 years ago

Enable GNU compilation

  • Property svn:executable set to *
File size: 5.2 KB
Line 
1#ifndef __XIOS_CTransformation__
2#define __XIOS_CTransformation__
3
4#include "xios_spl.hpp"
5#include "xml_node.hpp"
6#include "transformation_enum.hpp"
7#include "exception.hpp"
8
9namespace xios {
10
11  ///--------------------------------------------------------------
12  /*!
13    \class CTransformation
14    This class describes inverse_axis in xml file.
15  */
16  class CGenericAlgorithmTransformation;
17   class CGrid;
18
19  template<typename T>
20  class CTransformation
21  {
22  public:
23    typedef typename std::list<std::pair<ETranformationType, CTransformation<T>* > > TransformationMapTypes;
24    typedef TransformationMapTypes TransMapTypes;
25
26    public :
27      /// Constructeurs ///
28      CTransformation(void) {}
29      virtual void checkValid(T* dest) {}
30
31      std::vector<StdString> checkAuxInputs() { return checkAuxInputs_(); }
32      static CTransformation<T>* createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node=0);
33      static CTransformation<T>* getTransformation(ETranformationType transType, const StdString& id);
34
35      virtual const string& getId(void) = 0 ;
36      virtual ETranformationType getTransformationType(void)=0;
37      virtual void inheritFrom(CTransformation<T>* src) = 0 ;
38
39      virtual const string& getId_(void) { ERROR("string Transformation<T>::getId())",<< "unimplemented virtual function for child"); } ;
40      virtual const string& getName(void) { ERROR("string Transformation<T>::getId())",<< "unimplemented virtual function for child"); } ;
41      virtual const string& getDefName(void) { ERROR("string Transformation<T>::getId())",<< "unimplemented virtual function for child"); } ;
42      virtual CGenericAlgorithmTransformation* createAlgorithm(bool isSource,
43                                                               CGrid* gridDst, CGrid* gridSrc,
44                                                               int elementPositionInGrid,
45                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
46                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
47                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition,
48                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
49                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
50                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition) =0 ;
51
52      /// Destructeur ///
53    public:
54      virtual ~CTransformation(void) {}
55
56    protected:
57      typedef CTransformation<T>* (*createTransformationCallBack)(const StdString&, xml::CXMLNode*);
58      typedef CTransformation<T>* (*getIdTransformationCallBack)(const StdString&);
59      typedef std::map<ETranformationType, tuple<createTransformationCallBack,getIdTransformationCallBack>> callBackMap;
60      static callBackMap* callBacks_;
61
62      static bool registerTransformation(ETranformationType transType, tuple<createTransformationCallBack,getIdTransformationCallBack> callBackFunctions);
63      static bool unregisterTransformation(ETranformationType transType);
64
65    protected:
66      virtual std::vector<StdString> checkAuxInputs_() { return std::vector<StdString>(); }
67
68  }; // class CTransformation
69
70  template<typename T>
71  typename CTransformation<T>::callBackMap* CTransformation<T>::callBacks_ = 0; //CTransformation<T>::CallBackMap();
72
73  template<typename T>
74  CTransformation<T>* CTransformation<T>::createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node)
75  {
76    int transTypeInt = transType;
77    typename callBackMap::const_iterator it = (*callBacks_).find(transType);
78    if ((*callBacks_).end() == it)
79    {
80       ERROR("CTransformation<T>::createTransformation(ETranformationType transType)",
81             << "Transformation type " << transType
82             << "doesn't exist. Please define.");
83    }
84    return (get<0>(it->second))(id,node);
85  }
86
87  template<typename T>
88  CTransformation<T>* CTransformation<T>::getTransformation(ETranformationType transType, const StdString& id)
89  {
90    int transTypeInt = transType;
91    typename callBackMap::const_iterator it = (*callBacks_).find(transType);
92    if ((*callBacks_).end() == it)
93    {
94       ERROR("CTransformation<T>::getTransformation(ETranformationType transType, const StdString& id)",
95             << "Transformation type " << transType
96             << "doesn't exist. Please define.");
97    }
98    return (get<1>(it->second))(id);
99  }
100
101  template<typename T>
102  bool CTransformation<T>::registerTransformation(ETranformationType transType,  tuple<createTransformationCallBack, getIdTransformationCallBack> functions)
103  {
104    if (0 == callBacks_) callBacks_ = new callBackMap();
105    return (* callBacks_).insert(make_pair(transType, functions)).second;
106  }
107
108  template<typename T>
109  bool CTransformation<T>::unregisterTransformation(ETranformationType transType)
110  {
111    int transTypeInt = transType;
112    return (1 == (*callBacks_).erase(transType));
113  }
114
115} // namespace xios
116
117#endif // __XIOS_CTransformation__
Note: See TracBrowser for help on using the repository browser.