source: XIOS3/trunk/src/transformation/grid_transformation_factory_impl.hpp @ 2426

Last change on this file since 2426 was 2274, checked in by ymipsl, 3 years ago

Tracking memory leak : release memory statically alocated

YM

File size: 6.6 KB
Line 
1/*!
2   \file grid_transformation_factory_impl.hpp
3   \author Ha NGUYEN
4   \since 23 June 2016
5   \date 23 June 2016
6
7   \brief Helper class to create different transformations.
8 */
9#ifndef __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__
10#define __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__
11
12#include "xios_spl.hpp"
13#include "exception.hpp"
14#include "transformation.hpp"
15
16namespace xios {
17
18class CGrid;
19class CGenericAlgorithmTransformation;
20
21
22/*!
23  \class CGridTransformationFactory
24  This class is a helper class to chose a algorithm (transformation) from the alogrithm list of
25specific grid.
26*/
27template<typename T>
28class CGridTransformationFactory
29{
30public:
31  /** Default constructor */
32  CGridTransformationFactory() {}
33  virtual ~CGridTransformationFactory() {}
34
35  static shared_ptr<CGenericAlgorithmTransformation> createTransformation(ETranformationType transType, bool isSource,
36                                                               CGrid* gridDst, CGrid* gridSrc,
37                                                               CTransformation<T>* transformation,
38                                                               int elementPositionInGrid,
39                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
40                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
41                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition,
42                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
43                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
44                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition);
45
46public:
47  typedef shared_ptr<CGenericAlgorithmTransformation> (*CreateTransformationCallBack)(bool isSource, CGrid* gridDst, CGrid* gridSrc,
48                                                                           CTransformation<T>* transformation,
49                                                                           int elementPositionInGrid,
50                                                                           std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
51                                                                           std::map<int, int>& elementPositionInGridSrc2AxisPosition,
52                                                                           std::map<int, int>& elementPositionInGridSrc2DomainPosition,
53                                                                           std::map<int, int>& elementPositionInGridDst2ScalarPosition,
54                                                                           std::map<int, int>& elementPositionInGridDst2AxisPosition,
55                                                                           std::map<int, int>& elementPositionInGridDst2DomainPosition);
56
57  typedef std::map<ETranformationType, CreateTransformationCallBack> CallBackMap;
58  static CallBackMap* transformationCreationCallBacks_;
59  static bool registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn);
60  static bool unregisterTransformation(ETranformationType transType);
61  static bool initializeTransformation_;
62  static void unregisterAllTransformations(void) ;
63};
64
65template<typename T>
66typename CGridTransformationFactory<T>::CallBackMap* CGridTransformationFactory<T>::transformationCreationCallBacks_ = 0;
67template<typename T>
68bool CGridTransformationFactory<T>::initializeTransformation_ = false;
69
70template<typename T>
71shared_ptr<CGenericAlgorithmTransformation> CGridTransformationFactory<T>::createTransformation(ETranformationType transType, bool isSource,
72                                                                               CGrid* gridDst, CGrid* gridSrc,
73                                                                               CTransformation<T>* transformation,
74                                                                               int elementPositionInGrid,
75                                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
76                                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
77                                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition,
78                                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
79                                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
80                                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition)
81{
82  typename CallBackMap::const_iterator it = (*transformationCreationCallBacks_).find(transType);
83  if ((*transformationCreationCallBacks_).end() == it)
84  {
85     ERROR("CGridTransformationFactory::createTransformation(ETranformationType transType)",
86           << "Transformation type " << transType
87           << "doesn't exist. Please define.");
88  }
89  return (it->second)(isSource, gridDst, gridSrc, transformation, elementPositionInGrid,
90                      elementPositionInGridSrc2ScalarPosition,
91                      elementPositionInGridSrc2AxisPosition,
92                      elementPositionInGridSrc2DomainPosition,
93                      elementPositionInGridDst2ScalarPosition,
94                      elementPositionInGridDst2AxisPosition,
95                      elementPositionInGridDst2DomainPosition);
96}
97
98template<typename T>
99bool CGridTransformationFactory<T>::registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn)
100{
101  if (nullptr == transformationCreationCallBacks_)
102    transformationCreationCallBacks_ = new CallBackMap();
103
104  return (*transformationCreationCallBacks_).insert(make_pair(transType, createFn)).second;
105}
106
107template<typename T>
108bool CGridTransformationFactory<T>::unregisterTransformation(ETranformationType transType)
109{
110  return (1 == (*transformationCreationCallBacks_).erase(transType));
111}
112
113template<typename T>
114void CGridTransformationFactory<T>::unregisterAllTransformations(void)
115{
116  if (nullptr != transformationCreationCallBacks_) 
117  {
118    transformationCreationCallBacks_->clear() ;
119    delete transformationCreationCallBacks_;
120  }
121}
122
123}
124
125#endif // __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__
Note: See TracBrowser for help on using the repository browser.