traits.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2024, NVIDIA CORPORATION.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
20 #include <cudf/types.hpp>
24 
25 namespace CUDF_EXPORT cudf {
26 
34 template <typename...>
35 using void_t = void;
36 
48 #define CUDF_ENABLE_IF(...) std::enable_if_t<(__VA_ARGS__)>* = nullptr
49 
51 template <typename L, typename R>
52 using less_comparable = decltype(std::declval<L>() < std::declval<R>());
53 
55 template <typename L, typename R>
56 using greater_comparable = decltype(std::declval<L>() > std::declval<R>());
57 
59 template <typename L, typename R>
60 using equality_comparable = decltype(std::declval<L>() == std::declval<R>());
61 
62 namespace detail {
63 template <typename L, typename R, typename = void>
64 struct is_relationally_comparable_impl : std::false_type {};
65 
66 template <typename L, typename R>
67 struct is_relationally_comparable_impl<L,
68  R,
69  void_t<less_comparable<L, R>, greater_comparable<L, R>>>
70  : std::true_type {};
71 
72 template <typename L, typename R, typename = void>
73 struct is_equality_comparable_impl : std::false_type {};
74 
75 template <typename L, typename R>
76 struct is_equality_comparable_impl<L, R, void_t<equality_comparable<L, R>>> : std::true_type {};
77 
78 // has common type
79 template <typename AlwaysVoid, typename... Ts>
80 struct has_common_type_impl : std::false_type {};
81 
82 template <typename... Ts>
83 struct has_common_type_impl<void_t<std::common_type_t<Ts...>>, Ts...> : std::true_type {};
84 } // namespace detail
85 
87 template <typename... Ts>
88 using has_common_type = typename detail::has_common_type_impl<void, Ts...>::type;
89 
91 template <typename... Ts>
92 constexpr inline bool has_common_type_v = detail::has_common_type_impl<void, Ts...>::value;
93 
95 template <typename T>
96 using is_timestamp_t = cuda::std::disjunction<std::is_same<cudf::timestamp_D, T>,
97  std::is_same<cudf::timestamp_s, T>,
98  std::is_same<cudf::timestamp_ms, T>,
99  std::is_same<cudf::timestamp_us, T>,
100  std::is_same<cudf::timestamp_ns, T>>;
101 
103 template <typename T>
104 using is_duration_t = cuda::std::disjunction<std::is_same<cudf::duration_D, T>,
105  std::is_same<cudf::duration_s, T>,
106  std::is_same<cudf::duration_ms, T>,
107  std::is_same<cudf::duration_us, T>,
108  std::is_same<cudf::duration_ns, T>>;
109 
122 template <typename L, typename R>
123 constexpr inline bool is_relationally_comparable()
124 {
125  return detail::is_relationally_comparable_impl<L, R>::value;
126 }
127 
136 
149 template <typename L, typename R>
150 constexpr inline bool is_equality_comparable()
151 {
152  return detail::is_equality_comparable_impl<L, R>::value;
153 }
154 
163 
171 template <typename T>
172 CUDF_HOST_DEVICE constexpr inline bool is_numeric()
173 {
174  return cuda::std::is_arithmetic<T>();
175 }
176 
189 
201 template <typename T>
202 constexpr inline bool is_index_type()
203 {
204  return std::is_integral_v<T> and not std::is_same_v<T, bool>;
205 }
206 
219 
226 template <typename T>
227 constexpr inline bool is_signed()
228 {
229  return std::is_signed_v<T>;
230 }
231 
241 bool is_signed(data_type type);
242 
250 template <typename T>
251 constexpr inline bool is_unsigned()
252 {
253  return std::is_unsigned_v<T>;
254 }
255 
266 
273 template <typename Iterator>
274 CUDF_HOST_DEVICE constexpr inline bool is_signed_iterator()
275 {
276  return cuda::std::is_signed_v<typename cuda::std::iterator_traits<Iterator>::value_type>;
277 }
278 
286 template <typename T>
287 constexpr inline bool is_integral()
288 {
289  return cuda::std::is_integral_v<T>;
290 }
291 
302 
310 template <typename T>
311 constexpr inline bool is_integral_not_bool()
312 {
313  return cuda::std::is_integral_v<T> and not std::is_same_v<T, bool>;
314 }
315 
326 
334 template <typename T>
335 constexpr inline bool is_numeric_not_bool()
336 {
337  return cudf::is_numeric<T>() and not std::is_same_v<T, bool>;
338 }
339 
350 
358 template <typename T>
359 CUDF_HOST_DEVICE constexpr inline bool is_floating_point()
360 {
361  return cuda::std::is_floating_point_v<T>;
362 }
363 
374 
382 template <typename T>
383 constexpr inline bool is_byte()
384 {
385  return std::is_same_v<std::remove_cv_t<T>, std::byte>;
386 }
387 
395 template <typename T>
396 constexpr inline bool is_boolean()
397 {
398  return std::is_same_v<T, bool>;
399 }
400 
409 
417 template <typename T>
418 CUDF_HOST_DEVICE constexpr inline bool is_timestamp()
419 {
421 }
422 
433 
441 template <typename T>
442 CUDF_HOST_DEVICE constexpr inline bool is_fixed_point()
443 {
444  return cuda::std::is_same_v<numeric::decimal32, T> ||
445  cuda::std::is_same_v<numeric::decimal64, T> ||
446  cuda::std::is_same_v<numeric::decimal128, T> ||
447  cuda::std::is_same_v<numeric::fixed_point<int32_t, numeric::Radix::BASE_2>, T> ||
448  cuda::std::is_same_v<numeric::fixed_point<int64_t, numeric::Radix::BASE_2>, T> ||
449  cuda::std::is_same_v<numeric::fixed_point<__int128_t, numeric::Radix::BASE_2>, T>;
450 }
451 
460 
468 template <typename T>
469 CUDF_HOST_DEVICE constexpr inline bool is_duration()
470 {
472 }
473 
484 
492 template <typename T>
493 CUDF_HOST_DEVICE constexpr inline bool is_chrono()
494 {
495  return is_duration<T>() || is_timestamp<T>();
496 }
497 
508 bool is_chrono(data_type type);
509 
522 template <typename T>
523 constexpr bool is_rep_layout_compatible()
524 {
525  return cudf::is_numeric<T>() or cudf::is_chrono<T>() or cudf::is_boolean<T>() or
526  cudf::is_byte<T>();
527 }
528 
536 template <typename T>
537 constexpr inline bool is_dictionary()
538 {
539  return std::is_same_v<dictionary32, T>;
540 }
541 
550 
560 template <typename T>
561 CUDF_HOST_DEVICE constexpr inline bool is_fixed_width()
562 {
563  // TODO Add fixed width wrapper types
564  // Is a category fixed width?
565  return cudf::is_numeric<T>() || cudf::is_chrono<T>() || cudf::is_fixed_point<T>();
566 }
567 
578 
579 class string_view;
580 
593 template <typename T>
594 CUDF_HOST_DEVICE constexpr inline bool is_compound()
595 {
596  return cuda::std::is_same_v<T, cudf::string_view> or
597  cuda::std::is_same_v<T, cudf::dictionary32> or cuda::std::is_same_v<T, cudf::list_view> or
598  cuda::std::is_same_v<T, cudf::struct_view>;
599 }
600 
614 
626 template <typename T>
627 CUDF_HOST_DEVICE constexpr inline bool is_nested()
628 {
629  return cuda::std::is_same_v<T, cudf::list_view> || cuda::std::is_same_v<T, cudf::struct_view>;
630 }
631 
643 bool is_nested(data_type type);
644 
659 
660 template <typename From, typename To>
661 struct is_convertible : std::is_convertible<From, To> {};
662 
663 // This will ensure that timestamps can be promoted to a higher precision. Presently, they can't
664 // do that due to nvcc/gcc compiler issues
665 template <typename Duration1, typename Duration2>
667  : std::is_convertible<typename cudf::detail::time_point<Duration1>::duration,
668  typename cudf::detail::time_point<Duration2>::duration> {};
669 
672 } // namespace CUDF_EXPORT cudf
Indicator for the logical data type of an element in a column.
Definition: types.hpp:243
A non-owning, immutable view of device data that is a variable length char array representing a UTF-8...
Definition: string_view.hpp:44
Concrete type definition for dictionary columns.
Concrete type definitions for int32_t and int64_t durations in varying resolutions.
Class definition for fixed point data type.
bool is_dictionary(data_type type)
Indicates whether type is a dictionary data_type.
decltype(std::declval< L >() > std::declval< R >()) greater_comparable
Checks if two types are comparable using greater operator (i.e. >).
Definition: traits.hpp:56
constexpr bool is_byte()
Indicates whether T is a std::byte type.
Definition: traits.hpp:383
bool is_duration(data_type type)
Indicates whether type is a duration data_type.
bool is_numeric(data_type type)
Indicates whether type is a numeric data_type.
bool is_integral(data_type type)
Indicates whether type is a integral data_type.
decltype(std::declval< L >()==std::declval< R >()) equality_comparable
Checks if two types are comparable using equality operator (i.e. ==).
Definition: traits.hpp:60
typename detail::has_common_type_impl< void, Ts... >::type has_common_type
Checks if types have a common type.
Definition: traits.hpp:88
bool is_equality_comparable(data_type type)
Checks whether data_type type supports equality comparisons.
bool is_index_type(data_type type)
Indicates whether the type type is a index type.
bool is_numeric_not_bool(data_type type)
Indicates whether type is a numeric data_type but not BOOL8.
bool is_relationally_comparable(data_type type)
Checks whether data_type type supports relational comparisons.
decltype(std::declval< L >()< std::declval< R >()) less_comparable
Checks if two types are comparable using less operator (i.e. <).
Definition: traits.hpp:52
bool is_boolean(data_type type)
Indicates whether type is a Boolean data_type.
bool is_bit_castable(data_type from, data_type to)
Indicates whether from is bit-castable to to.
bool is_compound(data_type type)
Indicates whether elements of type are compound.
constexpr bool is_rep_layout_compatible()
Indicates whether T is layout compatible with its "representation" type.
Definition: traits.hpp:523
bool is_signed(data_type type)
Indicates whether type is a signed numeric data_type.
bool is_nested(data_type type)
Indicates whether type is a nested type.
void void_t
Utility metafunction that maps a sequence of any types to the type void.
Definition: traits.hpp:35
bool is_timestamp(data_type type)
Indicates whether type is a timestamp data_type.
bool is_floating_point(data_type type)
Indicates whether type is a floating point data_type.
bool is_unsigned(data_type type)
Indicates whether type is a unsigned numeric data_type.
constexpr bool has_common_type_v
Helper variable template for has_common_type<>::value.
Definition: traits.hpp:92
bool is_integral_not_bool(data_type type)
Indicates whether type is a integral data_type and not BOOL8.
bool is_chrono(data_type type)
Indicates whether type is a chrono data_type.
bool is_fixed_point(data_type type)
Indicates whether type is a fixed point data_type.
bool is_fixed_width(data_type type)
Indicates whether elements of type are fixed-width.
constexpr CUDF_HOST_DEVICE bool is_signed_iterator()
Indicates whether the Iterator value type is unsigned.
Definition: traits.hpp:274
cuda::std::disjunction< std::is_same< cudf::timestamp_D, T >, std::is_same< cudf::timestamp_s, T >, std::is_same< cudf::timestamp_ms, T >, std::is_same< cudf::timestamp_us, T >, std::is_same< cudf::timestamp_ns, T > > is_timestamp_t
Checks if a type is a timestamp type.
Definition: traits.hpp:100
cuda::std::disjunction< std::is_same< cudf::duration_D, T >, std::is_same< cudf::duration_s, T >, std::is_same< cudf::duration_ms, T >, std::is_same< cudf::duration_us, T >, std::is_same< cudf::duration_ns, T > > is_duration_t
Checks if a type is a duration type.
Definition: traits.hpp:108
cuDF interfaces
Definition: host_udf.hpp:39
Concrete type definitions for int32_t and int64_t timestamps in varying resolutions as durations sinc...
time_point< Duration > timestamp
A wrapper around a column of time_point in varying resolutions.
Definition: timestamps.hpp:39
Type declarations for libcudf.
#define CUDF_HOST_DEVICE
Indicates that the function or method is usable on host and device.
Definition: types.hpp:32