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