1 #ifndef VIGRA_INSPECTOR_PASSES_HXX
2 #define VIGRA_INSPECTOR_PASSES_HXX
4 #include "metaprogramming.hxx"
13 struct extra_passes_selector
15 template <
class Inspector,
class Functor>
17 call(Inspector, Functor &) {}
20 struct extra_passes_selector<true>
22 template <
class Inspector,
class Functor_n>
24 call_n(Inspector g, Functor_n f_n)
28 template <
class Inspector,
class Functor>
30 call(Inspector g, Functor & f)
32 for (
unsigned n = 2; n <= Functor::max_passes; ++n)
35 call_n(g, f.pass_n(n));
41 struct has_extra_passes :
public sfinae_test<T, has_extra_passes>
43 template <
class U> has_extra_passes(U*,
typename U::extra_passes* = 0);
46 template <class Functor, bool extra = has_extra_passes<Functor>::value>
47 struct get_extra_passes
48 :
public VigraFalseType
50 void sync(Functor &) {}
53 template <
class Functor>
54 struct get_extra_passes<Functor, true>
56 typedef get_extra_passes extra_passes;
57 static const unsigned max_passes = Functor::max_passes;
58 static const bool value = Functor::max_passes >= 2;
60 void sync(Functor & f)
66 template <
class Inspector,
class Functor>
69 extra_passes_select(Inspector g, Functor & f)
72 extra_passes_selector<get_extra_passes<Functor>::value>::call(g, f);
79 #endif // VIGRA_INSPECTOR_PASSES_HXX