source: XIOS/trunk/src/declare_ref_func.hpp @ 576

Last change on this file since 576 was 540, checked in by mhnguyen, 9 years ago

Reorganizing structure of grid

+) Grid doesn't have domain_ref and axis_ref anymore.
All domain and axis of a grid must be inside grid (These domain and axis can be defined or refer to others)
+) Grid contains list of domain and axis
+) Reorder some functions to make sure new functionlities work

Test
+) On Curie
+) Mode attached and detached
+) Only test_new_features
+) Passed

File size: 8.7 KB
Line 
1/*!
2   \file declare_ref_func.hpp
3   \author Ha NGUYEN
4   \date 02 Dec 2014
5   \since 02 Dec 2014
6
7   \brief Macro for some functions to solve reference of base object which are used in class Domain, Axis and Field
8 */
9#ifndef __XIOS_DECLARE_REF_FUNC_HPP__
10#define __XIOS_DECLARE_REF_FUNC_HPP__
11
12#define DECLARE_REF_FUNC(type,name)  \
13public:                                                             \
14 bool hasDirect##type##Reference(void) const;                       \
15 C##type * getDirect##type##Reference(void) const;                 \
16 C##type * getBase##type##Reference(void) const;                   \
17 void addReference(C##type * field);                               \
18 const std::vector<C##type *> & getAllReference(void) const;       \
19 void removeRefInheritance();                                       \
20 const StdString& getBase##type##Id(void) const;                   \
21 void solveRefInheritance(bool apply = true);                             \
22 void solveBaseReference(void);                                                                    \
23 std::vector<C##type *> refObject;                                 \
24 C##type * baseRefObject;                                          \
25
26// Defition of some function for solving reference in class Domain, Axis and Field
27
28#define DEFINE_REF_FUNC(type,name) \
29void C##type::solveRefInheritance(bool apply)                          \
30{                                                                     \
31  std::set<C##type *> sset;                                            \
32  C##type * refer_sptr;                                                 \
33  C##type * refer_ptr = this;                                          \
34                                                                      \
35  while (refer_ptr->hasDirect##type##Reference())                        \
36  {                                                                   \
37     refer_sptr = refer_ptr->getDirect##type##Reference();               \
38     refer_ptr  = refer_sptr;                                         \
39                                                                      \
40     if(sset.end() != sset.find(refer_ptr))                           \
41     {                                                                \
42        DEBUG (<< "Circular dependency stopped for #name object on "  \
43               << "\"" + refer_ptr->getId() + "\" !");                \
44        break;                                                        \
45     }                                                                \
46                                                                      \
47     SuperClassAttribute::setAttributes(refer_ptr, apply);            \
48     sset.insert(refer_ptr);                                          \
49  }                                                                   \
50}                                                                     \
51                                                                      \
52void C##type::removeRefInheritance()                                   \
53{                                                                     \
54 if (this->name##_ref.isEmpty()) return;                              \
55 this->clearAttribute("name##_ref");                                  \
56}                                                                     \
57                                                                      \
58void C##type::solveBaseReference(void)                                 \
59{                                                                     \
60  std::set<C##type *> sset;                                            \
61  C##type * refer_sptr;                                                 \
62  C##type * refer_ptr = this;                                          \
63                                                                      \
64  if (this->hasDirect##type##Reference())  baseRefObject = getDirect##type##Reference(); \
65  else  baseRefObject = C##type::get(this);                                         \
66                                                                                   \
67  while (refer_ptr->hasDirect##type##Reference())                                     \
68  {                                                                                \
69     refer_sptr = refer_ptr->getDirect##type##Reference();                            \
70     refer_ptr  = refer_sptr;                                                      \
71                                                                                   \
72     if(sset.end() != sset.find(refer_ptr))                                        \
73     {                                                                             \
74        DEBUG (<< "Circular dependency stopped for #name object on "              \
75               << "\"" + refer_ptr->getId() + "\" !");                             \
76        break;                                                                     \
77     }                                                                             \
78                                                                                   \
79     sset.insert(refer_ptr);                                                       \
80  }                                                                                \
81                                                                                   \
82  if (hasDirect##type##Reference()) baseRefObject->addReference(this) ;               \
83}                                                                                  \
84                                                                                   \
85C##type * C##type::getDirect##type##Reference(void) const                                \
86{                                                                                  \
87  if (this->name##_ref.isEmpty())                                                   \
88     return (this->getBase##type##Reference());                                       \
89                                                                                   \
90  if (! C##type::has(this->name##_ref.getValue()))                                   \
91     ERROR("C##type::getDirect##type##Reference(void)",                                \
92           << "[ ref_name = " << this->name##_ref.getValue() << "]"                 \
93           << " invalid #name name !");                                            \
94                                                                                   \
95  return (C##type::get(this->name##_ref.getValue()));                                \
96}                                                                                  \
97                                                                                   \
98C##type * C##type::getBase##type##Reference(void) const                                  \
99{                                                                                  \
100  return (baseRefObject);                                                          \
101}                                                                                  \
102                                                                                   \
103const std::vector<C##type *>& C##type::getAllReference(void) const                    \
104{                                                                                  \
105  return (refObject);                                                              \
106}                                                                                  \
107                                                                                   \
108const StdString & C##type::getBase##type##Id(void) const                               \
109{                                                                                  \
110  return (this->getBase##type##Reference()->getId());                                 \
111}                                                                                  \
112                                                                                   \
113void C##type::addReference(C##type * _##name##_)                                           \
114{                                                                                  \
115  refObject.push_back(_##name##_) ;                                                     \
116}                                                                                   \
117                                                                                    \
118bool C##type::hasDirect##type##Reference(void) const                                \
119{                                                                                   \
120 return (!this->name##_ref.isEmpty());                                               \
121}                                                                                   \
122
123#endif // __XIOS_DECLARE_REF_FUNC_HPP__
Note: See TracBrowser for help on using the repository browser.