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;
48 AcceptVisitor(Visitor_ & v) :
53 template <
typename T_>
54 void operator() (T_ & t)
const
68 template <
typename Visitor_,
typename Returning_>
75 typedef Returning_ result_type;
80 AcceptVisitorReturning(Visitor_ & v) :
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)
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_>
195 struct MadeVisitor<Revisitor_, Result_, Case_, Rest_...> :
196 MadeVisitor<Revisitor_, Result_, 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_>
216 struct BaseMadeVisitor :
217 MadeVisitor<BaseMadeVisitor<Result_, Cases_...>, Result_, Cases_...>
219 BaseMadeVisitor(
const Cases_ & ... cases) :
220 MadeVisitor<BaseMadeVisitor<Result_, Cases_...>, Result_, Cases_...>(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 void forward_visit(
typename TypeList_::Item & n)
override
274 static_cast<RealClass_ *
>(
this)->perform_visit(n);
278 template <
typename TypeList_,
typename UnwrappedVisitor_>
279 class WrappedVoidResultVisitor :
284 UnwrappedVisitor_ & _unwrapped_visitor;
287 WrappedVoidResultVisitor(UnwrappedVisitor_ & v) :
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_>
300 class WrappedNonVoidResultVisitor :
306 UnwrappedVisitor_ & _unwrapped_visitor;
311 WrappedNonVoidResultVisitor(UnwrappedVisitor_ & v,
const Result_ & r) :
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 override
420 v.forward_visit(*
static_cast<const RealClass_ *
>(
this));
Definition visitor.hh:326
Definition visitor.hh:244
Definition visitor.hh:411
Definition visitor.hh:268
Definition visitor.hh:304
Definition visitor.hh:254
Definition visitor.hh:282
#define PALUDIS_VISIBLE
Definition attributes.hh:59
AcceptVisitorReturning< Visitor_, Returning_ > PALUDIS_VISIBLE accept_visitor_returning(Visitor_ &v)
Definition visitor.hh:111
AcceptVisitor< Visitor_ > PALUDIS_VISIBLE accept_visitor(Visitor_ &v)
Definition visitor.hh:100
Definition about_metadata-fwd.hh:24
Definition visitor.hh:218
Definition visitor.hh:150
Definition visitor.hh:165
Definition visitor.hh:141
Definition type_list.hh:28