20 #ifndef PALUDIS_GUARD_PALUDIS_UTIL_VISITOR_HH 21 #define PALUDIS_GUARD_PALUDIS_UTIL_VISITOR_HH 1 24 #include <paludis/util/visitor-fwd.hh> 36 template <
typename Visitor_>
43 typedef void result_type;
53 template <
typename T_>
54 void operator() (T_ & t)
const 68 template <
typename Visitor_,
typename Returning_>
75 typedef Returning_ result_type;
85 template <
typename T_>
86 Returning_ operator() (T_ & t)
const 88 return t.template accept_returning<Returning_>(_v);
99 template <
typename Visitor_>
110 template <
typename Returning_,
typename Visitor_>
119 template <
typename T_,
typename R_,
typename A1_,
typename... As_>
125 template <
typename T_>
131 template <
typename T_,
typename R_,
typename... As_>
137 template <
typename T_>
138 using CallResultType =
typename std::remove_const<typename ExtractResultType<decltype(&T_::operator())>::Type>::type;
140 template <
typename Revisitor_,
typename Result_,
typename... Cases_>
143 template <
typename Revisitor_,
typename Result_>
152 template <
typename T_,
typename R_,
typename A1_>
155 enum { value =
false };
158 template <
typename T_,
typename R_,
typename A1_,
typename A2_>
161 enum { value =
true };
164 template <
typename Result_,
typename Case_,
typename V_,
bool needs_two_args_>
167 template <
typename Result_,
typename Case_,
typename V_>
170 static Result_ call(
const Case_ & thiscase,
const FirstCallArgumentType<Case_> & v,
const V_ &)
176 template <
typename Result_,
typename Case_,
typename V_>
179 static Result_ call(
const Case_ & thiscase,
const FirstCallArgumentType<Case_> & v,
const V_ & revisitor)
181 return thiscase(v, accept_visitor_returning<Result_>(revisitor));
185 template <
typename Case_,
typename V_>
188 static void call(
const Case_ & thiscase,
const FirstCallArgumentType<Case_> & v,
const V_ & revisitor)
194 template <
typename Revisitor_,
typename Result_,
typename Case_,
typename... Rest_>
198 const Case_ & thiscase;
200 MadeVisitor(
const Case_ & c,
const Rest_ & ... cases) :
201 MadeVisitor<Revisitor_, Result_, Rest_...>(cases...),
206 using MadeVisitor<Revisitor_, Result_, Rest_...>::visit;
208 Result_ visit(
const FirstCallArgumentType<Case_> & v)
const 211 thiscase, v, *static_cast<const Revisitor_ *>(
this));
215 template <
typename Result_,
typename... Cases_>
217 MadeVisitor<BaseMadeVisitor<Result_, Cases_...>, Result_, Cases_...>
225 template <
typename Case_,
typename... Cases_>
231 template <
typename Result_,
typename Base_>
232 using Revisit = std::function<Result_ (const Base_ &)>;
241 template <
typename TypeList_>
248 virtual void forward_visit(
typename TypeList_::Item &) = 0;
251 template <
typename TypeList_>
257 template <
typename RealClass_>
264 template <
typename RealClass_,
typename TypeList_>
272 virtual void forward_visit(
typename TypeList_::Item & n)
274 static_cast<RealClass_ *
>(
this)->perform_visit(n);
278 template <
typename TypeList_,
typename UnwrappedVisitor_>
284 UnwrappedVisitor_ & _unwrapped_visitor;
288 _unwrapped_visitor(v)
292 template <
typename C_>
293 void perform_visit(C_ & t)
295 _unwrapped_visitor.visit(t);
299 template <
typename TypeList_,
typename Result_,
typename UnwrappedVisitor_>
306 UnwrappedVisitor_ & _unwrapped_visitor;
312 _unwrapped_visitor(v),
317 template <
typename C_>
318 void perform_visit(C_ & t)
320 result = _unwrapped_visitor.visit(t);
324 template <
typename BaseClass_,
typename VisitableTypeList_>
329 virtual void _real_accept_const(
WrappedVisitorBase<
typename MakeTypeListConst<VisitableTypeList_>::Type> &)
const = 0;
332 typedef VisitableTypeList_ VisitableTypeList;
333 typedef BaseClass_ VisitableBaseClass;
335 template <
typename UnwrappedVisitor_>
336 void accept(UnwrappedVisitor_ & v)
342 template <
typename UnwrappedVisitor_>
343 void accept(UnwrappedVisitor_ & v)
const 346 _real_accept_const(vv);
349 template <
typename UnwrappedVisitor_>
350 void accept(
const UnwrappedVisitor_ & v)
356 template <
typename UnwrappedVisitor_>
357 void accept(
const UnwrappedVisitor_ & v)
const 360 _real_accept_const(vv);
363 template <
typename Result_,
typename UnwrappedVisitor_>
364 Result_ accept_returning(UnwrappedVisitor_ & v,
const Result_ & r = Result_())
371 template <
typename Result_,
typename UnwrappedVisitor_>
372 Result_ accept_returning(
const UnwrappedVisitor_ & v,
const Result_ & r = Result_())
379 template <
typename Result_,
typename UnwrappedVisitor_>
380 Result_ accept_returning(UnwrappedVisitor_ & v,
const Result_ & r = Result_())
const 383 _real_accept_const(vv);
387 template <
typename Result_,
typename UnwrappedVisitor_>
388 Result_ accept_returning(
const UnwrappedVisitor_ & v,
const Result_ & r = Result_())
const 391 _real_accept_const(vv);
395 template <
typename Case_,
typename... Cases_>
396 auto make_accept_returning(
const Case_ & firstcase,
const Cases_ & ... cases)
const -> CallResultType<Case_>
398 return this->accept_returning<CallResultType<Case_> >(make_visitor(firstcase, cases...));
401 template <
typename... Cases_>
402 void make_accept(
const Cases_ & ... cases)
const 404 this->accept(make_visitor(cases...));
408 template <
typename BaseClass_,
typename RealClass_>
415 v.forward_visit(*static_cast<RealClass_ *>(
this));
418 void _real_accept_const(
WrappedVisitorBase<
typename MakeTypeListConst<typename BaseClass_::VisitableTypeList>::Type> & v)
const 420 v.forward_visit(*static_cast<const RealClass_ *>(
this));
Definition: visitor-fwd.hh:28
Definition: about_metadata-fwd.hh:23
Definition: type_list.hh:27
Definition: visitor.hh:141
AcceptVisitorReturning< Visitor_, Returning_ > PALUDIS_VISIBLE accept_visitor_returning(Visitor_ &v)
Definition: visitor.hh:111
Definition: visitor-fwd.hh:46
Definition: visitor-fwd.hh:34
Definition: visitor.hh:216
Definition: visitor.hh:150
Definition: visitor.hh:37
Definition: no_type.hh:43
Definition: visitor-fwd.hh:49
Definition: visitor.hh:69
AcceptVisitor< Visitor_ > PALUDIS_VISIBLE accept_visitor(Visitor_ &v)
Definition: visitor.hh:100
Definition: visitor-fwd.hh:37
Definition: visitor-fwd.hh:43
#define PALUDIS_VISIBLE
Definition: attributes.hh:59
Definition: visitor.hh:165