[540] | 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) \ |
---|
| 13 | public: \ |
---|
| 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) \ |
---|
| 29 | void 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 | \ |
---|
| 52 | void C##type::removeRefInheritance() \ |
---|
| 53 | { \ |
---|
| 54 | if (this->name##_ref.isEmpty()) return; \ |
---|
| 55 | this->clearAttribute("name##_ref"); \ |
---|
| 56 | } \ |
---|
| 57 | \ |
---|
| 58 | void 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 | \ |
---|
| 85 | C##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 | \ |
---|
| 98 | C##type * C##type::getBase##type##Reference(void) const \ |
---|
| 99 | { \ |
---|
| 100 | return (baseRefObject); \ |
---|
| 101 | } \ |
---|
| 102 | \ |
---|
| 103 | const std::vector<C##type *>& C##type::getAllReference(void) const \ |
---|
| 104 | { \ |
---|
| 105 | return (refObject); \ |
---|
| 106 | } \ |
---|
| 107 | \ |
---|
| 108 | const StdString & C##type::getBase##type##Id(void) const \ |
---|
| 109 | { \ |
---|
| 110 | return (this->getBase##type##Reference()->getId()); \ |
---|
| 111 | } \ |
---|
| 112 | \ |
---|
| 113 | void C##type::addReference(C##type * _##name##_) \ |
---|
| 114 | { \ |
---|
| 115 | refObject.push_back(_##name##_) ; \ |
---|
| 116 | } \ |
---|
| 117 | \ |
---|
| 118 | bool C##type::hasDirect##type##Reference(void) const \ |
---|
| 119 | { \ |
---|
| 120 | return (!this->name##_ref.isEmpty()); \ |
---|
| 121 | } \ |
---|
| 122 | |
---|
| 123 | #endif // __XIOS_DECLARE_REF_FUNC_HPP__ |
---|