1#ifndef VIGRA_INSPECTOR_PASSES_HXX
2#define VIGRA_INSPECTOR_PASSES_HXX
4#include "metaprogramming.hxx"
13struct extra_passes_selector
15 template <
class Inspector,
class Functor>
17 call(Inspector, Functor &) {}
20struct 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));
41struct has_extra_passes :
public sfinae_test<T, has_extra_passes>
43 template <
class U> has_extra_passes(U*,
typename U::extra_passes* = 0);
46template <class Functor, bool extra = has_extra_passes<Functor>::value>
47struct get_extra_passes
48 :
public VigraFalseType
50 void sync(Functor &) {}
53template <
class Functor>
54struct 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)
66template <
class Inspector,
class Functor>
69extra_passes_select(Inspector g, Functor & f)
72 extra_passes_selector<get_extra_passes<Functor>::value>::call(g, f);