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)
194VIGRA_DEFINE_STL_FUNCTOR(std::negate, VigraTrueType, VigraFalseType)
195VIGRA_DEFINE_STL_FUNCTOR(std::logical_not, VigraTrueType, VigraFalseType)
197#if !( (__cplusplus >= 202002L) || (defined(_MSC_VER) && _MSVC_LANG >= 202002L) )
198VIGRA_DEFINE_STL_FUNCTOR(std::binary_negate, VigraFalseType, VigraTrueType)
199VIGRA_DEFINE_STL_FUNCTOR(std::unary_negate, VigraTrueType, VigraFalseType)
202#undef VIGRA_DEFINE_STL_FUNCTOR
210 typedef VigraTrueType isInitializer;
211 typedef VigraFalseType isUnaryFunctor;
212 typedef VigraFalseType isBinaryFunctor;
213 typedef VigraFalseType isTernaryFunctor;
214 typedef VigraFalseType isUnaryAnalyser;
215 typedef VigraFalseType isBinaryAnalyser;
216 typedef VigraFalseType isTernaryAnalyser;
219template <
class R,
class T>
220class FunctorTraits<R (*)(T)>
223 typedef R (*type)(T);
225 typedef VigraFalseType isInitializer;
226 typedef VigraTrueType isUnaryFunctor;
227 typedef VigraFalseType isBinaryFunctor;
228 typedef VigraFalseType isTernaryFunctor;
229 typedef VigraFalseType isUnaryAnalyser;
230 typedef VigraFalseType isBinaryAnalyser;
231 typedef VigraFalseType isTernaryAnalyser;
234template <
class R,
class T1,
class T2>
238 typedef R (*type)(T1, T2);
240 typedef VigraFalseType isInitializer;
241 typedef VigraFalseType isUnaryFunctor;
242 typedef VigraTrueType isBinaryFunctor;
243 typedef VigraFalseType isTernaryFunctor;
244 typedef VigraFalseType isUnaryAnalyser;
245 typedef VigraFalseType isBinaryAnalyser;
246 typedef VigraFalseType isTernaryAnalyser;
249template <
class R,
class T1,
class T2,
class T3>
253 typedef R (*type)(T1, T2, T3);
255 typedef VigraFalseType isInitializer;
256 typedef VigraFalseType isUnaryFunctor;
257 typedef VigraFalseType isBinaryFunctor;
258 typedef VigraTrueType isTernaryFunctor;
259 typedef VigraFalseType isUnaryAnalyser;
260 typedef VigraFalseType isBinaryAnalyser;
261 typedef VigraFalseType isTernaryAnalyser;
Export associated information for a functor.
Definition functortraits.hxx:159