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