68 #ifndef __NODAMUSHI_SVD_NORMALIZED_VISITOR_HPP__ 69 #define __NODAMUSHI_SVD_NORMALIZED_VISITOR_HPP__ 72 # include <type_traits> 82 # define NORM_VISITOR_INIT \ 84 template<typename T> \ 85 static void accept(T& t){ \ 86 using namespace ::nodamushi::visitor; \ 87 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 88 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 89 static_assert(is_static<T,__member_type__>::value,"static visitor"); \ 90 ::nodamushi::svd::normalized::normvisitor<this_t>::visit(t); \ 92 template<typename T> \ 93 static void accept(std::shared_ptr<T> t){ \ 94 using namespace ::nodamushi::visitor; \ 95 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 96 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 97 static_assert(is_static<T,__member_type__>::value,"static visitor");\ 98 ::nodamushi::svd::normalized::normvisitor<this_t>::visit(*t); \ 100 template<typename T> \ 101 static void accept(T& t,this_t& o){ \ 102 using namespace ::nodamushi::visitor; \ 103 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 104 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 105 static_assert(!is_static<T,__member_type__>::value,"instance visitor"); \ 106 ::nodamushi::svd::normalized::normvisitor<this_t>::visit(t,o);} \ 107 template<typename T> \ 108 static void accept(std::shared_ptr<T> t,this_t& o){ \ 109 using namespace ::nodamushi::visitor; \ 110 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 111 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 112 static_assert(!is_static<T,__member_type__>::value,"instance visitor"); \ 113 ::nodamushi::svd::normalized::normvisitor<this_t>::visit(*t,o);} \ 114 template<typename T> \ 115 static void accept(this_t& o,T& t){\ 116 using namespace ::nodamushi::visitor; \ 117 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 118 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 119 static_assert(!is_static<T,__member_type__>::value,"instance visitor"); \ 120 ::nodamushi::svd::normalized::normvisitor<this_t>::visit(t,o);} \ 121 template<typename T> \ 122 static void accept(this_t& o,std::shared_ptr<T> t){ \ 123 using namespace ::nodamushi::visitor; \ 124 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 125 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 126 static_assert(!is_static<T,__member_type__>::value,"instance visitor"); \ 127 ::nodamushi::svd::normalized::normvisitor<this_t>::visit(*t,o);} \ 131 # define NORM_Visit_Device(v,...) template<typename S> \ 132 VISITOR_MEMBER result visit(::nodamushi::svd::normalized::Device<S>__VA_ARGS__& v) 133 # define NORM_PostVisit_Device(v,...) template<typename S> \ 135 VISITOR_MEMBER result postVisit(::nodamushi::svd::normalized::Device<S>__VA_ARGS__& v) 138 # define NORM_Visit_Peripheral(v,...) template<typename S> \ 139 VISITOR_MEMBER result visit(::nodamushi::svd::normalized::Peripheral<S>__VA_ARGS__& v) 140 # define NORM_PostVisit_Peripheral(v,...) template<typename S> \ 142 VISITOR_MEMBER result postVisit(::nodamushi::svd::normalized::Peripheral<S>__VA_ARGS__& v) 144 # define NORM_Visit_Interrupt(v,...) template<typename S> \ 145 VISITOR_MEMBER result visit(::nodamushi::svd::normalized::Interrupt<S>__VA_ARGS__& v) 147 # define NORM_Visit_AddressBlock(v,...) \ 148 VISITOR_MEMBER result visit(::nodamushi::svd::normalized::AddressBlock __VA_ARGS__& v) 151 # define NORM_Visit_Cluster(v,...) template<typename S> \ 152 VISITOR_MEMBER result visit(::nodamushi::svd::normalized::Cluster<S>__VA_ARGS__& v) 153 # define NORM_PostVisit_Cluster(v,...) template<typename S> \ 154 VISITOR_MEMBER result postVisit(::nodamushi::svd::normalized::Cluster<S> __VA_ARGS__& v) 156 # define NORM_Visit_Register(v,...) template<typename S> \ 157 VISITOR_MEMBER result visit(::nodamushi::svd::normalized::Register<S> __VA_ARGS__ & v) 158 # define NORM_PostVisit_Register(v,...) template<typename S> \ 159 VISITOR_MEMBER result postVisit(__VA_ARGS__ ::nodamushi::svd::normalized::Register<S>& v) 161 # define NORM_Visit_Field(v,...) template<typename S> \ 162 VISITOR_MEMBER result visit(__VA_ARGS__ ::nodamushi::svd::normalized::Field<S>& v) 163 # define NORM_PostVisit_Field(v,...) template<typename S> \ 164 VISITOR_MEMBER result postVisit(::nodamushi::svd::normalized::Field<S> __VA_ARGS__ & v) 166 # define NORM_Visit_EnumeratedValues(v,...) template<typename S> \ 167 VISITOR_MEMBER result visit(__VA_ARGS__::nodamushi::svd::normalized::Enumeration<S>& v) 168 # define NORM_PostVisit_EnumeratedValues(v,...) template<typename S> \ 169 VISITOR_MEMBER result postVisit(__VA_ARGS__ ::nodamushi::svd::normalized::Enumeration<S>& v) 170 # define NORM_Visit_EnumeratedValue(v,...) template<typename S> \ 171 VISITOR_MEMBER result visit(__VA_ARGS__ ::nodamushi::svd::normalized::EnumeratedValue<S>& v) 174 template<
typename CONTROLLER,
typename VISITOR,
typename T>
176 template<
typename T2,
typename V>
178 return ::nodamushi::visitor::result::SKIP;}
182 template<
typename VISITOR>
193 return ::nodamushi::visitor::apply<this_t,VISITOR>(t) == result::BREAK?
194 result::BREAK : result::CONTINUE;
199 return ::nodamushi::visitor::apply<this_t,VISITOR>(t,v) == result::BREAK?
200 result::BREAK : result::CONTINUE;
206 using T2 =
typename std::remove_const<T>::type;
215 using T2 =
typename std::remove_const<T>::type;
216 return ::nodamushi::svd::normalized::handleVisit<this_t,VISITOR,T2>::template visit<T>(t,v);
222 return ::nodamushi::visitor::applyController<this_t,VISITOR>(t,v);
228 return ::nodamushi::visitor::applyController<this_t,VISITOR>(t);
235 #define __NX_NORM_HANDLE_VISIT(type) \ 236 template<typename CONTROLLER, \ 239 struct handleVisit<CONTROLLER,VISITOR,type<A>>{ \ 240 template<typename T,typename V> \ 241 static ::nodamushi::visitor::result visit(T& t,V&v) \ 245 template<
typename T1,
typename T2>
struct is_same 249 typename std::remove_const<T1>::type,
250 typename std::remove_const<T2>::type>
::value;
258 #endif // __NODAMUSHI_SVD_NORMALIZED_VISITOR_HPP__ static result handleVisit(T &t)
static result handleVisit(T &t, VISITOR &v)
static result visit(T &t)
static constexpr bool value
::nodamushi::visitor::result visit(T2 &t, V &v)
static result visit(T &t, VISITOR &v)
static result apply(T &t, __dummy_visitor_ &v)
static result apply(T &t, VISITOR &v)
This class reperesents SVD(xml) element / attribute.