#include #include "example.hpp" #include #include #include #if !defined(METAL_WORKAROUND) HIDE( /// [lbd1] template using expr = T*; using lbd = metal::lambda; /// [lbd1] IS_SAME(metal::is_lambda, metal::true_); ) HIDE( /// [is_lambda] template using expr = T*; IS_SAME(metal::is_lambda, metal::false_); IS_SAME(metal::is_lambda>, metal::true_); IS_SAME(metal::is_lambda>, metal::true_); IS_SAME(metal::is_lambda>, metal::true_); /// [is_lambda] ) #endif HIDE( /// [as_lambda] IS_SAME(metal::as_lambda>, metal::lambda); IS_SAME(metal::as_lambda>, metal::lambda); IS_SAME(metal::as_lambda>, metal::lambda); /// [as_lambda] ) HIDE( /// [trait] IS_SAME(metal::invoke, int>, metal::true_); IS_SAME(metal::invoke, void>, metal::true_); IS_SAME(metal::invoke, int>, metal::true_); IS_SAME(metal::invoke, void>, metal::false_); IS_SAME(metal::invoke, int>, metal::false_); IS_SAME(metal::invoke, void>, metal::false_); IS_SAME(metal::invoke, int*, void*>, metal::true_); IS_SAME(metal::invoke, void*, int*>, metal::false_); /// [trait] ) HIDE( /// [lazy] IS_SAME(metal::invoke, int>, int*); IS_SAME(metal::invoke, int()>, int(*)()); IS_SAME(metal::invoke, int[], void*>, void*); /// [lazy] ) HIDE( /// [is_invocable] template using array = metal::identity; // MSVC friendly using lbd = metal::lambda; IS_SAME(metal::is_invocable, metal::false_); // arity mismatch IS_SAME(metal::is_invocable, metal::false_); // void[] is ill-formed IS_SAME(metal::is_invocable, metal::true_); /// [is_invocable] ) HIDE( /// [always] using void_ = metal::always; IS_SAME(metal::invoke, void); IS_SAME(metal::invoke, void); IS_SAME(metal::invoke, bool, char, long, float>, void_); /// [always] ) HIDE( /// [arg] IS_SAME(metal::invoke, bool, char, long, float>, bool); IS_SAME(metal::invoke, bool, char, long, float>, char); IS_SAME(metal::invoke, bool, char, long, float>, long); IS_SAME(metal::invoke, bool, char, long, float>, float); /// [arg] ) #if !defined(METAL_WORKAROUND) HIDE( /// [invoke] using lbd = metal::lazy; IS_SAME(metal::invoke, float); /// [invoke] ) HIDE( /// [apply] using lbd = metal::lazy; IS_SAME(metal::apply>, float); /// [apply] ) HIDE( /// [partial] using promote = metal::partial, int>; IS_SAME(metal::invoke, int); IS_SAME(metal::invoke, int); IS_SAME(metal::invoke, long); /// [partial] ) HIDE( /// [bind] using promote = metal::bind< metal::lazy, metal::always, metal::_1 // equivalent to metal::arg<1> >; IS_SAME(metal::invoke, int); IS_SAME(metal::invoke, int); IS_SAME(metal::invoke, long); using uac = metal::bind< // usual arithmetic conversion metal::lazy, metal::bind, metal::bind >; IS_SAME(metal::invoke, long); IS_SAME(metal::invoke, int); IS_SAME(metal::invoke, float); /// [bind] ) #endif