37 #ifndef VIGRA_FUNCTORTRAITS_HXX 
   38 #define VIGRA_FUNCTORTRAITS_HXX 
   41 #include "metaprogramming.hxx" 
   45 struct InitializerTag {};
 
   46 struct UnaryFunctorTag {};
 
   47 struct BinaryFunctorTag {};
 
   48 struct TernaryFunctorTag {};
 
   49 struct UnaryAnalyserTag {};
 
   50 struct BinaryAnalyserTag {};
 
   51 struct TernaryAnalyserTag {};
 
   53 struct UnaryReduceFunctorTag
 
   54 : 
public InitializerTag, 
public UnaryAnalyserTag
 
   57 struct BinaryReduceFunctorTag
 
   58 : 
public InitializerTag, 
public BinaryAnalyserTag
 
   61 typedef UnaryFunctorTag UnaryExpandFunctorTag;
 
   62 typedef BinaryFunctorTag BinaryExpandFunctorTag;
 
   65 class FunctorTraitsBase
 
   70     typedef typename IsDerivedFrom<T, InitializerTag>::result isInitializer;
 
   72     typedef typename IsDerivedFrom<T, UnaryFunctorTag>::result isUnaryFunctor;
 
   73     typedef typename IsDerivedFrom<T, BinaryFunctorTag>::result isBinaryFunctor;
 
   74     typedef typename IsDerivedFrom<T, TernaryFunctorTag>::result isTernaryFunctor;
 
   76     typedef typename IsDerivedFrom<T, UnaryAnalyserTag>::result isUnaryAnalyser;
 
   77     typedef typename IsDerivedFrom<T, BinaryAnalyserTag>::result isBinaryAnalyser;
 
   78     typedef typename IsDerivedFrom<T, TernaryAnalyserTag>::result isTernaryAnalyser;
 
  158 : 
public FunctorTraitsBase<T>
 
  161 #define VIGRA_DEFINE_STL_FUNCTOR(name, unary, binary) \ 
  163 class FunctorTraits<name<T> > \ 
  168     typedef VigraFalseType isInitializer; \ 
  170     typedef unary          isUnaryFunctor; \ 
  171     typedef binary         isBinaryFunctor; \ 
  172     typedef VigraFalseType isTernaryFunctor; \ 
  174     typedef VigraFalseType isUnaryAnalyser; \ 
  175     typedef VigraFalseType isBinaryAnalyser; \ 
  176     typedef VigraFalseType isTernaryAnalyser; \ 
  180 VIGRA_DEFINE_STL_FUNCTOR(std::plus, VigraFalseType, VigraTrueType)
 
  181 VIGRA_DEFINE_STL_FUNCTOR(std::minus, VigraFalseType, VigraTrueType)
 
  182 VIGRA_DEFINE_STL_FUNCTOR(std::multiplies, VigraFalseType, VigraTrueType)
 
  183 VIGRA_DEFINE_STL_FUNCTOR(std::divides, VigraFalseType, VigraTrueType)
 
  184 VIGRA_DEFINE_STL_FUNCTOR(std::modulus, VigraFalseType, VigraTrueType)
 
  185 VIGRA_DEFINE_STL_FUNCTOR(std::equal_to, VigraFalseType, VigraTrueType)
 
  186 VIGRA_DEFINE_STL_FUNCTOR(std::not_equal_to, VigraFalseType, VigraTrueType)
 
  187 VIGRA_DEFINE_STL_FUNCTOR(std::greater, VigraFalseType, VigraTrueType)
 
  188 VIGRA_DEFINE_STL_FUNCTOR(std::less, VigraFalseType, VigraTrueType)
 
  189 VIGRA_DEFINE_STL_FUNCTOR(std::greater_equal, VigraFalseType, VigraTrueType)
 
  190 VIGRA_DEFINE_STL_FUNCTOR(std::less_equal, VigraFalseType, VigraTrueType)
 
  191 VIGRA_DEFINE_STL_FUNCTOR(std::logical_and, VigraFalseType, VigraTrueType)
 
  192 VIGRA_DEFINE_STL_FUNCTOR(std::logical_or, VigraFalseType, VigraTrueType)
 
  193 VIGRA_DEFINE_STL_FUNCTOR(std::binary_negate, VigraFalseType, VigraTrueType)
 
  195 VIGRA_DEFINE_STL_FUNCTOR(std::negate, VigraTrueType, VigraFalseType)
 
  196 VIGRA_DEFINE_STL_FUNCTOR(std::logical_not, VigraTrueType, VigraFalseType)
 
  197 VIGRA_DEFINE_STL_FUNCTOR(std::unary_negate, VigraTrueType, VigraFalseType)
 
  198 VIGRA_DEFINE_STL_FUNCTOR(std::binder1st, VigraTrueType, VigraFalseType)
 
  199 VIGRA_DEFINE_STL_FUNCTOR(std::binder2nd, VigraTrueType, VigraFalseType)
 
  200 #undef VIGRA_DEFINE_STL_FUNCTOR 
  208     typedef VigraTrueType  isInitializer;
 
  209     typedef VigraFalseType isUnaryFunctor;
 
  210     typedef VigraFalseType isBinaryFunctor;
 
  211     typedef VigraFalseType isTernaryFunctor;
 
  212     typedef VigraFalseType isUnaryAnalyser;
 
  213     typedef VigraFalseType isBinaryAnalyser;
 
  214     typedef VigraFalseType isTernaryAnalyser;
 
  217 template <
class R, 
class T>
 
  218 class FunctorTraits<R (*)(T)>
 
  221     typedef R (*type)(T);
 
  223     typedef VigraFalseType isInitializer;
 
  224     typedef VigraTrueType  isUnaryFunctor;
 
  225     typedef VigraFalseType isBinaryFunctor;
 
  226     typedef VigraFalseType isTernaryFunctor;
 
  227     typedef VigraFalseType isUnaryAnalyser;
 
  228     typedef VigraFalseType isBinaryAnalyser;
 
  229     typedef VigraFalseType isTernaryAnalyser;
 
  232 template <
class R, 
class T1, 
class T2>
 
  233 class FunctorTraits<R (*)(T1, T2)>
 
  236     typedef R (*type)(T1, T2);
 
  238     typedef VigraFalseType isInitializer;
 
  239     typedef VigraFalseType isUnaryFunctor;
 
  240     typedef VigraTrueType  isBinaryFunctor;
 
  241     typedef VigraFalseType isTernaryFunctor;
 
  242     typedef VigraFalseType isUnaryAnalyser;
 
  243     typedef VigraFalseType isBinaryAnalyser;
 
  244     typedef VigraFalseType isTernaryAnalyser;
 
  247 template <
class R, 
class T1, 
class T2, 
class T3>
 
  248 class FunctorTraits<R (*)(T1, T2, T3)>
 
  251     typedef R (*type)(T1, T2, T3);
 
  253     typedef VigraFalseType isInitializer;
 
  254     typedef VigraFalseType isUnaryFunctor;
 
  255     typedef VigraFalseType isBinaryFunctor;
 
  256     typedef VigraTrueType  isTernaryFunctor;
 
  257     typedef VigraFalseType isUnaryAnalyser;
 
  258     typedef VigraFalseType isBinaryAnalyser;
 
  259     typedef VigraFalseType isTernaryAnalyser;
 
  266 #endif // VIGRA_FUNCTORTRAITS_HXX 
Export associated information for a functor. 
Definition: functortraits.hxx:157