NSVD Reader  0.0.1
svdvisitor.hpp
Go to the documentation of this file.
1 
81 /*
82  * These codes are licensed under CC0.
83  * http://creativecommons.org/publicdomain/zero/1.0/
84  */
85 #ifndef __NODAMUSHI_SVD_SVDVISITOR_HPP__
86 #define __NODAMUSHI_SVD_SVDVISITOR_HPP__
87 
88 # include <type_traits>
89 # include <cassert>
91 
92 namespace nodamushi{
93 namespace svd{
94 
96 # define SVD_VISITOR_INIT \
97  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); \
105  } \
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);} \
120 
121 
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)
128 
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)
135 
136 # define SVD_Visit_Interrupt(v,...) template<typename S> \
137  VISITOR_MEMBER result visit(::nodamushi::svd::Interrupt<S>__VA_ARGS__& v)
138 
139 # define SVD_Visit_AddressBlock(v,...) \
140  VISITOR_MEMBER result visit(::nodamushi::svd::AddressBlock __VA_ARGS__& v)
141 
142 
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)
147 
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)
152 
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)
157 
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)
164 
165 template<typename CONTROLLER,typename VISITOR,typename T>
166 struct handleVisit{
167  template<typename T2,typename V>
169  return ::nodamushi::visitor::result::SKIP;}
170 };
171 
172 
173 
174 
175 template<typename VISITOR>
177 {
178 
180 
183 
184  template<typename T>
185  static result visit(T& t)
186  {
187  return ::nodamushi::visitor::apply<this_t,VISITOR>(t) == result::BREAK?
188  result::BREAK : result::CONTINUE;
189  }
190  template<typename T>
191  static result visit(T& t,VISITOR& v)
192  {
193  return ::nodamushi::visitor::apply<this_t,VISITOR>(t,v) == result::BREAK?
194  result::BREAK : result::CONTINUE;
195  }
196 
197  template<typename T>
198  static result handleVisit(T& t)
199  {
200  using T2 =typename std::remove_const<T>::type;
201  __svd_dummy_visitor_ dummy;
203  return ret;
204  }
205 
206  template<typename T>
207  static result handleVisit(T& t,VISITOR& v)
208  {
209  using T2 =typename std::remove_const<T>::type;
210  return ::nodamushi::svd::handleVisit<this_t,VISITOR,T2>::template visit<T>(t,v);
211  }
212 
213  template<typename T>
214  static result apply(T& t,VISITOR& v)
215  {
216  return ::nodamushi::visitor::applyController<this_t,VISITOR>(t,v);
217  }
218 
219  template<typename T>
221  {
222  return ::nodamushi::visitor::applyController<this_t,VISITOR>(t);
223  }
224 };
225 
226 
227 
228 
229 #define __NX_SVD_HANDLE_VISIT(type) \
230  template<typename CONTROLLER, \
231  typename VISITOR, \
232  class A> \
233  struct handleVisit<CONTROLLER,VISITOR,type<A>>{ \
234  template<typename T,typename V> \
235  static ::nodamushi::visitor::result visit(T& t,V&v) \
236 
237 #define __NX_SVD_HANDLE_VISIT2(type) \
238  template<typename CONTROLLER, \
239  typename VISITOR, \
240  class A,class B> \
241  struct handleVisit<CONTROLLER,VISITOR,type<A,B>>{ \
242  template<typename T,typename V> \
243  static ::nodamushi::visitor::result visit(T& t,V& v)
244 
245 
246 
247 // ignore constant
248 template<typename T1,typename T2>struct is_same
249 {
250  static constexpr bool value =
251  std::is_same<
252  typename std::remove_const<T1>::type,
253  typename std::remove_const<T2>::type>::value;
254 };
255 
256 
257 
258 
259 
260 } // end namespace svd
261 }// end namespace nodamushi
262 
263 #endif // __NODAMUSHI_SVD_SVDVISITOR_HPP__
static result apply(T &t, VISITOR &v)
Definition: svdvisitor.hpp:214
static result apply(T &t, __svd_dummy_visitor_ &v)
Definition: svdvisitor.hpp:220
static result handleVisit(T &t)
Definition: svdvisitor.hpp:198
::nodamushi::visitor::result visit(T2 &t, V &v)
Definition: svdvisitor.hpp:168
static result visit(T &t, VISITOR &v)
Definition: svdvisitor.hpp:191
static result handleVisit(T &t, VISITOR &v)
Definition: svdvisitor.hpp:207
This class reperesents SVD(xml) element / attribute.
Definition: value.hpp:53
static constexpr bool value
Definition: svdvisitor.hpp:250
static result visit(T &t)
Definition: svdvisitor.hpp:185