/** * Copyright (c) 2019 by Contributors * @file intel/meta_utils.h * @brief Meta programming utils * @author Pawel Piotrowicz */ #ifndef INTEL_META_UTILS_H_ #define INTEL_META_UTILS_H_ #include namespace dgl { namespace utils { template struct has_type; template struct has_type> : std::false_type {}; template struct has_type> : has_type> {}; template struct has_type> : std::true_type {}; template < class OCmp, template class ToP, class Tup, int ok = std::tuple_size::value> struct DeepType; template class ToP, class Tup> struct DeepType { typedef typename std::tuple_element<0, Tup>::type EL1; enum { value = std::is_same>::value }; }; template class ToP, class Tup> struct DeepType { typedef typename std::tuple_element<0, Tup>::type EL1; typedef typename std::tuple_element<1, Tup>::type EL2; enum { value = (std::is_same>::value || std::is_same>::value) }; }; template class ToP, class Tup> struct DeepType { typedef typename std::tuple_element<0, Tup>::type EL1; typedef typename std::tuple_element<1, Tup>::type EL2; typedef typename std::tuple_element<2, Tup>::type EL3; enum { value = (std::is_same>::value || std::is_same>::value || std::is_same>::value) }; }; template using Required = typename std::enable_if::type; template using CheckCmp = Required::value>; template using CheckCmp_2 = Required::value || std::is_same::value>; template class TPP, class Tup> using Verify = Required::value>; } // namespace utils } // namespace dgl #endif // INTEL_META_UTILS_H_