37#ifndef VIGRA_FUNCTORTRAITS_HXX
38#define VIGRA_FUNCTORTRAITS_HXX
41#include "metaprogramming.hxx"
45struct InitializerTag {};
46struct UnaryFunctorTag {};
47struct BinaryFunctorTag {};
48struct TernaryFunctorTag {};
49struct UnaryAnalyserTag {};
50struct BinaryAnalyserTag {};
51struct TernaryAnalyserTag {};
53struct UnaryReduceFunctorTag
54:
public InitializerTag,
public UnaryAnalyserTag
57struct BinaryReduceFunctorTag
58:
public InitializerTag,
public BinaryAnalyserTag
61typedef UnaryFunctorTag UnaryExpandFunctorTag;
62typedef BinaryFunctorTag BinaryExpandFunctorTag;
65class 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) \
163class 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; \
180VIGRA_DEFINE_STL_FUNCTOR(std::plus, VigraFalseType, VigraTrueType)
181VIGRA_DEFINE_STL_FUNCTOR(std::minus, VigraFalseType, VigraTrueType)
182VIGRA_DEFINE_STL_FUNCTOR(std::multiplies, VigraFalseType, VigraTrueType)
183VIGRA_DEFINE_STL_FUNCTOR(std::divides, VigraFalseType, VigraTrueType)
184VIGRA_DEFINE_STL_FUNCTOR(std::modulus, VigraFalseType, VigraTrueType)
185VIGRA_DEFINE_STL_FUNCTOR(std::equal_to, VigraFalseType, VigraTrueType)
186VIGRA_DEFINE_STL_FUNCTOR(std::not_equal_to, VigraFalseType, VigraTrueType)
187VIGRA_DEFINE_STL_FUNCTOR(std::greater, VigraFalseType, VigraTrueType)
188VIGRA_DEFINE_STL_FUNCTOR(std::less, VigraFalseType, VigraTrueType)
189VIGRA_DEFINE_STL_FUNCTOR(std::greater_equal, VigraFalseType, VigraTrueType)
190VIGRA_DEFINE_STL_FUNCTOR(std::less_equal, VigraFalseType, VigraTrueType)
191VIGRA_DEFINE_STL_FUNCTOR(std::logical_and, VigraFalseType, VigraTrueType)
192VIGRA_DEFINE_STL_FUNCTOR(std::logical_or, VigraFalseType, VigraTrueType)
193VIGRA_DEFINE_STL_FUNCTOR(std::binary_negate, VigraFalseType, VigraTrueType)
195VIGRA_DEFINE_STL_FUNCTOR(std::negate, VigraTrueType, VigraFalseType)
196VIGRA_DEFINE_STL_FUNCTOR(std::logical_not, VigraTrueType, VigraFalseType)
197VIGRA_DEFINE_STL_FUNCTOR(std::unary_negate, VigraTrueType, VigraFalseType)
198VIGRA_DEFINE_STL_FUNCTOR(std::binder1st, VigraTrueType, VigraFalseType)
199VIGRA_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;
217template <
class R,
class T>
218class 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;
232template <
class R,
class T1,
class T2>
233class 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;
247template <
class R,
class T1,
class T2,
class T3>
248class 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;
Export associated information for a functor.
Definition: functortraits.hxx:159