18 #ifndef viskores_internal_ArrayPortalHelpers_h
19 #define viskores_internal_ArrayPortalHelpers_h
33 template <
typename PortalType>
34 struct PortalSupportsGetsImpl
36 template <typename U, typename S = decltype(std::declval<U>().Get(
viskores::Id{}))>
37 static std::true_type has(
int);
39 static std::false_type has(...);
40 using type = decltype(has<PortalType>(0));
43 template <
typename PortalType>
44 struct PortalSupportsGets3DImpl
46 template <typename U, typename S = decltype(std::declval<U>().Get(
viskores::Id3{}))>
47 static std::true_type has(
int);
49 static std::false_type has(...);
50 using type = decltype(has<PortalType>(0));
53 template <
typename PortalType>
54 struct PortalSupportsSetsImpl
57 typename S = decltype(std::declval<U>().Set(
viskores::Id{},
58 std::declval<typename U::ValueType>()))>
59 static std::true_type has(
int);
61 static std::false_type has(...);
62 using type = decltype(has<PortalType>(0));
65 template <
typename PortalType>
66 struct PortalSupportsSets3DImpl
70 std::declval<typename U::ValueType>()))>
71 static std::true_type has(
int);
73 static std::false_type has(...);
74 using type = decltype(has<PortalType>(0));
77 template <
typename PortalType>
78 struct PortalSupportsIteratorsImpl
80 template <typename U, typename S = decltype(std::declval<U>().GetIteratorBegin())>
81 static std::true_type has(
int);
83 static std::false_type has(...);
84 using type = decltype(has<PortalType>(0));
89 template <
typename PortalType>
90 using PortalSupportsGets =
91 typename detail::PortalSupportsGetsImpl<typename std::decay<PortalType>::type>::type;
93 template <
typename PortalType>
94 using PortalSupportsGets3D =
95 typename detail::PortalSupportsGets3DImpl<typename std::decay<PortalType>::type>::type;
97 template <
typename PortalType>
98 using PortalSupportsSets =
99 typename detail::PortalSupportsSetsImpl<typename std::decay<PortalType>::type>::type;
101 template <
typename PortalType>
102 using PortalSupportsSets3D =
103 typename detail::PortalSupportsSets3DImpl<typename std::decay<PortalType>::type>::type;
105 template <
typename PortalType>
106 using PortalSupportsIterators =
107 typename detail::PortalSupportsIteratorsImpl<typename std::decay<PortalType>::type>::type;
111 #endif //viskores_internal_ArrayPortalHelpers_h