NSVD Reader  0.0.1
imple.hpp
Go to the documentation of this file.
1 
5 /*
6  * These codes are licensed under CC0.
7  * http://creativecommons.org/publicdomain/zero/1.0/
8  */
9 #ifndef __NODAMUSHI_VISITOR_IMPLE_HPP__
10 #define __NODAMUSHI_VISITOR_IMPLE_HPP__
11 
12 # include <type_traits>
13 # include <vector>
14 # include <memory>
16 # include "nodamushi/box.hpp"
17 # include "nodamushi/boxvec.hpp"
18 namespace nodamushi{
19 namespace visitor{
20 
21 
22 namespace details{
23 template<typename CONTROLLER,typename VISITOR,typename T>
24 struct applys
25 {
26  template<typename T2>
27  static result apply(T2& t)
28  {
29  switch(applyVisit<VISITOR>(t))
30  {
31  case result::BREAK: return result::BREAK;
32  case result::SKIP: return result::CONTINUE;
33  default: break;
34  }
35  result r = CONTROLLER::handleVisit(t);
36  if(r == result::BREAK) return result::BREAK;
37  result r2 = applyPostVisit<VISITOR>(t);
38  if(r2 == result::BREAK) return result::BREAK;
39 
40  return r2 ==result::SKIP?result::SKIP:r;
41  }
42 
43  template<typename T2>
44  static result apply(T2& t,VISITOR& v)
45  {
46  switch(applyVisit(t,v))
47  {
48  case result::BREAK: return result::BREAK;
49  case result::SKIP: return result::CONTINUE;
50  default: break;
51  }
52  result r = CONTROLLER::handleVisit(t,v);
53  if(r == result::BREAK) return result::BREAK;
54  result r2 = applyPostVisit(t,v);
55  if(r2 == result::BREAK) return result::BREAK;
56 
57  return r2 ==result::SKIP?result::SKIP:r;
58  }
59 
60  template<typename T2>
61  static result applyController(T2& t)
62  {
63  return CONTROLLER::visit(t);
64  }
65 
66  template<typename T2>
67  static result applyController(T2& t,VISITOR& v)
68  {
69  return CONTROLLER::visit(t,v);
70  }
71 };
72 
73 template<typename CONTROLLER,typename VISITOR,typename T>
74 struct applys<CONTROLLER,VISITOR,::nodamushi::box<T>>
75 {
76 
77  template<typename T2>
78  static result apply(T2& t)
79  {
80  return ::nodamushi::visitor::apply<CONTROLLER,VISITOR>(*t);
81  }
82 
83  template<typename T2>
84  static result apply(T2& t,VISITOR& v)
85  {
86  return ::nodamushi::visitor::apply<CONTROLLER,VISITOR>(*t,v);
87  }
88 
89  template<typename T2>
90  static result applyController(T2& t)
91  {
92  return ::nodamushi::visitor::applyController<CONTROLLER,VISITOR>(*t);
93  }
94 
95  template<typename T2>
96  static result applyController(T2& t,VISITOR& v)
97  {
98  return ::nodamushi::visitor::applyController<CONTROLLER,VISITOR>(*t,v);
99  }
100 };
101 
102 template<typename CONTROLLER,typename VISITOR,typename T>
103 struct applys<CONTROLLER,VISITOR,std::vector<T>>
104 {
105  template<typename T2>
106  static result apply(T2& t)
107  {
108  for(auto& e:t){
109  auto r = ::nodamushi::visitor::apply<CONTROLLER,VISITOR>(e);
110  if(r != result::CONTINUE) return r;
111  }
112  return result::CONTINUE;
113  }
114 
115  template<typename T2>
116  static result apply(T2& t,VISITOR& v)
117  {
118  for(auto& e:t){
119  auto r = ::nodamushi::visitor::apply<CONTROLLER,VISITOR>(e,v);
120  if(r != result::CONTINUE) return r;
121  }
122  return result::CONTINUE;
123  }
124 
125  template<typename T2>
126  static result applyController(T2& t)
127  {
128  for(auto& e:t){
129  auto r = ::nodamushi::visitor::applyController<CONTROLLER,VISITOR>(e);
130  if(r != result::CONTINUE) return r;
131  }
132  return result::CONTINUE;
133  }
134 
135  template<typename T2>
136  static result applyController(T2& t,VISITOR& v)
137  {
138  for(auto& e:t){
139  auto r = ::nodamushi::visitor::applyController<CONTROLLER,VISITOR>(e,v);
140  if(r != result::CONTINUE) return r;
141  }
142  return result::CONTINUE;
143  }
144 };
145 
146 template<typename CONTROLLER,typename VISITOR,typename T,typename PTR>
147 struct applys<CONTROLLER,VISITOR,::nodamushi::boxvec<T,PTR>>
148 {
149  template<typename T2>
150  static result apply(T2& t)
151  {
152  for(auto& e:t){
153  auto r = ::nodamushi::visitor::apply<CONTROLLER,VISITOR>(e);
154  if(r != result::CONTINUE) return r;
155  }
156  return result::CONTINUE;
157  }
158 
159  template<typename T2>
160  static result apply(T2& t,VISITOR& v)
161  {
162  for(auto& e:t){
163  auto r = ::nodamushi::visitor::apply<CONTROLLER,VISITOR>(e,v);
164  if(r != result::CONTINUE) return r;
165  }
166  return result::CONTINUE;
167  }
168 
169  template<typename T2>
170  static result applyController(T2& t)
171  {
172  for(auto& e:t){
173  auto r = ::nodamushi::visitor::applyController<CONTROLLER,VISITOR>(e);
174  if(r != result::CONTINUE) return r;
175  }
176  return result::CONTINUE;
177  }
178 
179  template<typename T2>
180  static result applyController(T2& t,VISITOR& v)
181  {
182  for(auto& e:t){
183  auto r = ::nodamushi::visitor::applyController<CONTROLLER,VISITOR>(e,v);
184  if(r != result::CONTINUE) return r;
185  }
186  return result::CONTINUE;
187  }
188 };
189 
190 
191 
192 }//end namespace details
193 
194 //-------------------------------------------------------------------------
195 
196 template<typename CONTROLLER,typename VISITOR,typename T>
198 {
199  using T2 =typename std::remove_const<T>::type;
201 }
202 
203 
204 template<typename CONTROLLER,typename VISITOR,typename T>
205 result apply(T& t,VISITOR& v)
206 {
207  using T2 =typename std::remove_const<T>::type;
209 }
210 
211 template<typename CONTROLLER,typename VISITOR,typename T>
213 {
214  using T2 =typename std::remove_const<T>::type;
215  return details::applys<CONTROLLER,VISITOR,T2>::template applyController<T>(t);
216 }
217 
218 
219 template<typename CONTROLLER,typename VISITOR,typename T>
220 result applyController(T& t,VISITOR& v)
221 {
222  using T2 =typename std::remove_const<T>::type;
223  return details::applys<CONTROLLER,VISITOR,T2>::template applyController<T>(t,v);
224 }
225 
226 
227 
228 namespace details {
229 
230 
231 template<bool r,typename VISITOR,typename T>struct apply;
232 
233 template<typename VISITOR,typename T>
234 struct apply<true,VISITOR,T>
235 {
236  static result applyVisit(T& value)
237  {
238  return VISITOR::visit(value);
239  }
240 
241  static result applyPostVisit(T& value)
242  {
243  return VISITOR::postVisit(value);
244  }
245 
246  static result applyVisit(T& value,VISITOR& visitor)
247  {
248  return visitor.visit(value);
249  }
250  static result applyPostVisit(T& value,VISITOR& visitor)
251  {
252  return visitor.postVisit(value);
253  }
254 };
255 
256 
257 template<typename VISITOR,typename T>
258 struct apply<false,VISITOR,T>
259 {
260  static result applyVisit(T& value)
261  {
262  VISITOR::visit(value);
263  return result::CONTINUE;
264  }
265 
266  static result applyPostVisit(T& value)
267  {
268  VISITOR::postVisit(value);
269  return result::CONTINUE;
270  }
271 
272  static result applyVisit(T& value,VISITOR& visitor)
273  {
274  visitor.visit(value);
275  return result::CONTINUE;
276  }
277  static result applyPostVisit(T& value,VISITOR& visitor)
278  {
279  visitor.postVisit(value);
280  return result::CONTINUE;
281  }
282 };
283 
284 
285 template<typename t>struct is_result
286 {
287  static constexpr bool value = std::is_same<::nodamushi::visitor::result,t>::value;
288 };
289 
290 } // details
291 
292 
293 
294 
295 template<typename VISITOR,typename T>
297 {
298  return details::apply<details::is_result<decltype(VISITOR::visit(t))>::value,
299  VISITOR,T>::applyVisit(t);
300 }
301 
302 template<typename VISITOR,typename T>
303 result applyVisit(T& t,VISITOR& v)
304 {
305  return details::apply<details::is_result<decltype(v.visit(t))>::value,
306  VISITOR,T>::applyVisit(t,v);
307 }
308 
309 
310 template<typename VISITOR,typename T>
312 {
313  return details::apply<details::is_result<decltype(VISITOR::visit(t))>::value,
314  VISITOR,T>::applyPostVisit(t);
315 }
316 
317 template<typename VISITOR,typename T>
318 result applyPostVisit(T& t,VISITOR& v)
319 {
320  return details::apply<details::is_result<decltype(v.visit(t))>::value,
321  VISITOR,T>::applyPostVisit(t,v);
322 }
323 
324 } // end namespace visitor
325 }// end namespace nodamushi
326 
327 #endif // __NODAMUSHI_VISITOR_IMPLE_HPP__
boxvec. vector<pointer<X>>
static constexpr bool value
Definition: imple.hpp:287
result applyPostVisit(T &t)
Definition: imple.hpp:311
Definition: Access.hpp:143
static result applyController(T2 &t, VISITOR &v)
Definition: imple.hpp:67
static result applyPostVisit(T &value, VISITOR &visitor)
Definition: imple.hpp:277
box.std::unique_ptr wrapper
::nodamushi::visitor::result visit(RC &rcvec, VISITOR &v)
Definition: Cluster.hpp:310
static result applyPostVisit(T &value, VISITOR &visitor)
Definition: imple.hpp:250
static result apply(T2 &t, VISITOR &v)
Definition: imple.hpp:44
static result apply(T2 &t)
Definition: imple.hpp:27
stop visitor processing
result applyVisit(T &t)
Definition: imple.hpp:296
finish the current processing hierarchy
result apply(T &t)
Definition: imple.hpp:197
static result applyVisit(T &value, VISITOR &visitor)
Definition: imple.hpp:246
static result applyVisit(T &value, VISITOR &visitor)
Definition: imple.hpp:272
vector<pointer<T>>.
Definition: boxvec.hpp:75
static result applyController(T2 &t)
Definition: imple.hpp:61
result applyController(T &t)
Definition: imple.hpp:212
continue visitor processing