#ifndef PFOR_PFOR_EXPRESSION_TRAITS_H #define PFOR_PFOR_EXPRESSION_TRAITS_H #include #include "tag.h" namespace pfor { namespace expr { /** * @brief tests a type and return true if it is an expression * * @return true if the type is an expression */ template struct IsExpression: std::false_type {}; template struct IsExpression::IsExpression, tag::Expression>{}>>: std::true_type {}; template constexpr bool isExpression = IsExpression::value; /** * @brief tests a pack of types and returns true is all are expressions */ template struct AllExpression: std::false_type {}; template struct AllExpression { static constexpr bool value = IsExpression::value && AllExpression::value; }; template struct AllExpression: IsExpression {}; template constexpr bool allExpression = AllExpression::value; /** * @brief tests a pack of types and returns true if any of them is an expression */ template struct AnyExpression: std::false_type {}; template struct AnyExpression { static constexpr bool value = IsExpression::value || AnyExpression::value; }; template struct AnyExpression: IsExpression {}; template constexpr bool anyExpression = AnyExpression::value; } } #endif