85 #ifndef __NODAMUSHI_SVD_SVDVISITOR_HPP__ 86 #define __NODAMUSHI_SVD_SVDVISITOR_HPP__ 88 # include <type_traits> 96 # define SVD_VISITOR_INIT \ 98 template<typename T> \ 99 static void accept(T& t){ \ 100 using namespace ::nodamushi::visitor; \ 101 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 102 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 103 static_assert(is_static<T,__member_type__>::value,"static visitor"); \ 104 ::nodamushi::svd::svdvisitor<this_t>::visit(t); \ 106 template<typename T> \ 107 static void accept(T& t,this_t& o){ \ 108 using namespace ::nodamushi::visitor; \ 109 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 110 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 111 static_assert(!is_static<T,__member_type__>::value,"instance visitor"); \ 112 ::nodamushi::svd::svdvisitor<this_t>::visit(t,o);} \ 113 template<typename T> \ 114 static void accept(this_t& o,T& t){\ 115 using namespace ::nodamushi::visitor; \ 116 constexpr ::nodamushi::visitor::_visitor_member_type_ __member_type__= \ 117 __NODAMUSHI_VISIT_ENUM__(VISITOR_MEMBER,mt); \ 118 static_assert(!is_static<T,__member_type__>::value,"instance visitor"); \ 119 ::nodamushi::svd::svdvisitor<this_t>::visit(t,o);} \ 123 # define SVD_Visit_Device(v,...) template<typename S,typename V> \ 124 VISITOR_MEMBER result visit(::nodamushi::svd::Device<S,V>__VA_ARGS__& v) 125 # define SVD_PostVisit_Device(v,...) template<typename S,typename V> \ 127 VISITOR_MEMBER result postVisit(::nodamushi::svd::Device<S,V>__VA_ARGS__& v) 130 # define SVD_Visit_Peripheral(v,...) template<typename S> \ 131 VISITOR_MEMBER result visit(::nodamushi::svd::Peripheral<S>__VA_ARGS__& v) 132 # define SVD_PostVisit_Peripheral(v,...) template<typename S> \ 134 VISITOR_MEMBER result postVisit(::nodamushi::svd::Peripheral<S>__VA_ARGS__& v) 136 # define SVD_Visit_Interrupt(v,...) template<typename S> \ 137 VISITOR_MEMBER result visit(::nodamushi::svd::Interrupt<S>__VA_ARGS__& v) 139 # define SVD_Visit_AddressBlock(v,...) \ 140 VISITOR_MEMBER result visit(::nodamushi::svd::AddressBlock __VA_ARGS__& v) 143 # define SVD_Visit_Cluster(v,...) template<typename S> \ 144 VISITOR_MEMBER result visit(::nodamushi::svd::Cluster<S>__VA_ARGS__& v) 145 # define SVD_PostVisit_Cluster(v,...) template<typename S> \ 146 VISITOR_MEMBER result postVisit(::nodamushi::svd::Cluster<S> __VA_ARGS__& v) 148 # define SVD_Visit_Register(v,...) template<typename S> \ 149 VISITOR_MEMBER result visit(::nodamushi::svd::Register<S> __VA_ARGS__ & v) 150 # define SVD_PostVisit_Register(v,...) template<typename S> \ 151 VISITOR_MEMBER result postVisit(__VA_ARGS__ ::nodamushi::svd::Register<S>& v) 153 # define SVD_Visit_Field(v,...) template<typename S> \ 154 VISITOR_MEMBER result visit(__VA_ARGS__ ::nodamushi::svd::Field<S>& v) 155 # define SVD_PostVisit_Field(v,...) template<typename S> \ 156 VISITOR_MEMBER result postVisit(::nodamushi::svd::Field<S> __VA_ARGS__ & v) 158 # define SVD_Visit_EnumeratedValues(v,...) template<typename S> \ 159 VISITOR_MEMBER result visit(__VA_ARGS__::nodamushi::svd::Enumeration<S>& v) 160 # define SVD_PostVisit_EnumeratedValues(v,...) template<typename S> \ 161 VISITOR_MEMBER result postVisit(__VA_ARGS__ ::nodamushi::svd::Enumeration<S>& v) 162 # define SVD_Visit_EnumeratedValue(v,...) template<typename S> \ 163 VISITOR_MEMBER result visit(__VA_ARGS__ ::nodamushi::svd::EnumeratedValue<S>& v) 165 template<
typename CONTROLLER,
typename VISITOR,
typename T>
167 template<
typename T2,
typename V>
169 return ::nodamushi::visitor::result::SKIP;}
175 template<
typename VISITOR>
187 return ::nodamushi::visitor::apply<this_t,VISITOR>(t) == result::BREAK?
188 result::BREAK : result::CONTINUE;
193 return ::nodamushi::visitor::apply<this_t,VISITOR>(t,v) == result::BREAK?
194 result::BREAK : result::CONTINUE;
200 using T2 =
typename std::remove_const<T>::type;
209 using T2 =
typename std::remove_const<T>::type;
210 return ::nodamushi::svd::handleVisit<this_t,VISITOR,T2>::template visit<T>(t,v);
216 return ::nodamushi::visitor::applyController<this_t,VISITOR>(t,v);
222 return ::nodamushi::visitor::applyController<this_t,VISITOR>(t);
229 #define __NX_SVD_HANDLE_VISIT(type) \ 230 template<typename CONTROLLER, \ 233 struct handleVisit<CONTROLLER,VISITOR,type<A>>{ \ 234 template<typename T,typename V> \ 235 static ::nodamushi::visitor::result visit(T& t,V&v) \ 237 #define __NX_SVD_HANDLE_VISIT2(type) \ 238 template<typename CONTROLLER, \ 241 struct handleVisit<CONTROLLER,VISITOR,type<A,B>>{ \ 242 template<typename T,typename V> \ 243 static ::nodamushi::visitor::result visit(T& t,V& v) 248 template<
typename T1,
typename T2>
struct is_same 252 typename std::remove_const<T1>::type,
253 typename std::remove_const<T2>::type>
::value;
263 #endif // __NODAMUSHI_SVD_SVDVISITOR_HPP__
static result apply(T &t, VISITOR &v)
static result apply(T &t, __svd_dummy_visitor_ &v)
static result handleVisit(T &t)
::nodamushi::visitor::result visit(T2 &t, V &v)
static result visit(T &t, VISITOR &v)
static result handleVisit(T &t, VISITOR &v)
This class reperesents SVD(xml) element / attribute.
static constexpr bool value
static result visit(T &t)