meta_utils.h 2.2 KB
Newer Older
1
/**
2
 *  Copyright (c) 2019 by Contributors
3
4
5
 * @file intel/meta_utils.h
 * @brief Meta programming utils
 * @author Pawel Piotrowicz <pawel.piotrowicz@intel.com>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 */
#ifndef INTEL_META_UTILS_H_
#define INTEL_META_UTILS_H_
#include <tuple>

namespace dgl {
namespace utils {

template <typename T, typename Tuple>
struct has_type;

template <typename T>
struct has_type<T, std::tuple<>> : std::false_type {};

template <typename T, typename U, typename... Ts>
struct has_type<T, std::tuple<U, Ts...>> : has_type<T, std::tuple<Ts...>> {};

template <typename T, typename... Ts>
struct has_type<T, std::tuple<T, Ts...>> : std::true_type {};

26
27
28
template <
    class OCmp, template <class> class ToP, class Tup,
    int ok = std::tuple_size<Tup>::value>
29
30
31
32
33
34
35
36
37
38
39
40
41
struct DeepType;

template <class OCmp, template <class> class ToP, class Tup>
struct DeepType<OCmp, ToP, Tup, 1> {
  typedef typename std::tuple_element<0, Tup>::type EL1;
  enum { value = std::is_same<OCmp, ToP<EL1>>::value };
};

template <class OCmp, template <class> class ToP, class Tup>
struct DeepType<OCmp, ToP, Tup, 2> {
  typedef typename std::tuple_element<0, Tup>::type EL1;
  typedef typename std::tuple_element<1, Tup>::type EL2;
  enum {
42
43
44
    value =
        (std::is_same<OCmp, ToP<EL1>>::value ||
         std::is_same<OCmp, ToP<EL2>>::value)
45
46
47
48
49
50
51
52
53
  };
};

template <class OCmp, template <class> class ToP, class Tup>
struct DeepType<OCmp, ToP, Tup, 3> {
  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 {
54
55
56
57
    value =
        (std::is_same<OCmp, ToP<EL1>>::value ||
         std::is_same<OCmp, ToP<EL2>>::value ||
         std::is_same<OCmp, ToP<EL3>>::value)
58
59
60
61
62
63
64
65
66
67
68
  };
};

template <bool b>
using Required = typename std::enable_if<b, bool>::type;

template <class L, class R>
using CheckCmp = Required<std::is_same<L, R>::value>;

template <class L, class R1, class R2>
using CheckCmp_2 =
69
    Required<std::is_same<L, R1>::value || std::is_same<L, R2>::value>;
70
71
72
73
74
75
76

template <class OpType, template <class> class TPP, class Tup>
using Verify = Required<utils::DeepType<OpType, TPP, Tup>::value>;

}  // namespace utils
}  // namespace dgl
#endif  //  INTEL_META_UTILS_H_