19 #include <cudf/detail/utilities/assert.cuh>
59 return type_id::EMPTY;
66 struct type_to_name_impl {
73 inline std::string operator()()
79 template <cudf::type_
id t>
80 struct id_to_type_impl {
92 template <cudf::type_
id Id>
110 template <
typename T>
112 std::conditional_t<std::is_same_v<numeric::decimal32, T>, int32_t,
113 std::conditional_t<std::is_same_v<numeric::decimal64, T>, int64_t,
114 std::conditional_t<std::is_same_v<numeric::decimal128, T>, __int128_t, T>>>;
126 template <
typename T>
129 return (
id == type_id::DECIMAL32 && std::is_same_v<T, int32_t>) ||
130 (
id == type_id::DECIMAL64 && std::is_same_v<T, int64_t>) ||
131 (
id == type_id::DECIMAL128 && std::is_same_v<T, __int128_t>) ||
id == type_to_id<T>();
141 #ifndef CUDF_TYPE_MAPPING
142 #define CUDF_TYPE_MAPPING(Type, Id) \
144 constexpr inline type_id type_to_id<Type>() \
149 inline std::string type_to_name_impl::operator()<Type>() \
151 return CUDF_STRINGIFY(Type); \
154 struct id_to_type_impl<Id> { \
197 template <cudf::type_
id Id>
202 template <
typename T>
203 struct type_to_scalar_type_impl {
213 #ifndef MAP_NUMERIC_SCALAR
214 #define MAP_NUMERIC_SCALAR(Type) \
216 struct type_to_scalar_type_impl<Type> { \
217 using ScalarType = cudf::numeric_scalar<Type>; \
218 using ScalarDeviceType = cudf::numeric_scalar_device_view<Type>; \
236 struct type_to_scalar_type_impl<std::string> {
242 struct type_to_scalar_type_impl<
cudf::string_view> {
273 struct type_to_scalar_type_impl<
cudf::list_view> {
279 struct type_to_scalar_type_impl<
cudf::struct_view> {
290 #ifndef MAP_TIMESTAMP_SCALAR
291 #define MAP_TIMESTAMP_SCALAR(Type) \
293 struct type_to_scalar_type_impl<Type> { \
294 using ScalarType = cudf::timestamp_scalar<Type>; \
295 using ScalarDeviceType = cudf::timestamp_scalar_device_view<Type>; \
311 #ifndef MAP_DURATION_SCALAR
312 #define MAP_DURATION_SCALAR(Type) \
314 struct type_to_scalar_type_impl<Type> { \
315 using ScalarType = cudf::duration_scalar<Type>; \
316 using ScalarDeviceType = cudf::duration_scalar_device_view<Type>; \
331 template <
typename T>
339 template <
typename T>
437 #pragma nv_exec_check_disable
439 template <
template <cudf::type_
id>
typename IdTypeMap = id_to_type_impl,
446 switch (dtype.id()) {
448 return f.template operator()<
typename IdTypeMap<type_id::INT8>::type>(
449 std::forward<Ts>(args)...);
451 return f.template operator()<
typename IdTypeMap<type_id::INT16>::type>(
452 std::forward<Ts>(args)...);
454 return f.template operator()<
typename IdTypeMap<type_id::INT32>::type>(
455 std::forward<Ts>(args)...);
457 return f.template operator()<
typename IdTypeMap<type_id::INT64>::type>(
458 std::forward<Ts>(args)...);
460 return f.template operator()<
typename IdTypeMap<type_id::UINT8>::type>(
461 std::forward<Ts>(args)...);
462 case type_id::UINT16:
463 return f.template operator()<
typename IdTypeMap<type_id::UINT16>::type>(
464 std::forward<Ts>(args)...);
465 case type_id::UINT32:
466 return f.template operator()<
typename IdTypeMap<type_id::UINT32>::type>(
467 std::forward<Ts>(args)...);
468 case type_id::UINT64:
469 return f.template operator()<
typename IdTypeMap<type_id::UINT64>::type>(
470 std::forward<Ts>(args)...);
471 case type_id::FLOAT32:
472 return f.template operator()<
typename IdTypeMap<type_id::FLOAT32>::type>(
473 std::forward<Ts>(args)...);
474 case type_id::FLOAT64:
475 return f.template operator()<
typename IdTypeMap<type_id::FLOAT64>::type>(
476 std::forward<Ts>(args)...);
478 return f.template operator()<
typename IdTypeMap<type_id::BOOL8>::type>(
479 std::forward<Ts>(args)...);
480 case type_id::TIMESTAMP_DAYS:
481 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_DAYS>::type>(
482 std::forward<Ts>(args)...);
483 case type_id::TIMESTAMP_SECONDS:
484 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_SECONDS>::type>(
485 std::forward<Ts>(args)...);
486 case type_id::TIMESTAMP_MILLISECONDS:
487 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_MILLISECONDS>::type>(
488 std::forward<Ts>(args)...);
489 case type_id::TIMESTAMP_MICROSECONDS:
490 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_MICROSECONDS>::type>(
491 std::forward<Ts>(args)...);
492 case type_id::TIMESTAMP_NANOSECONDS:
493 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_NANOSECONDS>::type>(
494 std::forward<Ts>(args)...);
495 case type_id::DURATION_DAYS:
496 return f.template operator()<
typename IdTypeMap<type_id::DURATION_DAYS>::type>(
497 std::forward<Ts>(args)...);
498 case type_id::DURATION_SECONDS:
499 return f.template operator()<
typename IdTypeMap<type_id::DURATION_SECONDS>::type>(
500 std::forward<Ts>(args)...);
501 case type_id::DURATION_MILLISECONDS:
502 return f.template operator()<
typename IdTypeMap<type_id::DURATION_MILLISECONDS>::type>(
503 std::forward<Ts>(args)...);
504 case type_id::DURATION_MICROSECONDS:
505 return f.template operator()<
typename IdTypeMap<type_id::DURATION_MICROSECONDS>::type>(
506 std::forward<Ts>(args)...);
507 case type_id::DURATION_NANOSECONDS:
508 return f.template operator()<
typename IdTypeMap<type_id::DURATION_NANOSECONDS>::type>(
509 std::forward<Ts>(args)...);
510 case type_id::DICTIONARY32:
511 return f.template operator()<
typename IdTypeMap<type_id::DICTIONARY32>::type>(
512 std::forward<Ts>(args)...);
513 case type_id::STRING:
514 return f.template operator()<
typename IdTypeMap<type_id::STRING>::type>(
515 std::forward<Ts>(args)...);
517 return f.template operator()<
typename IdTypeMap<type_id::LIST>::type>(
518 std::forward<Ts>(args)...);
519 case type_id::DECIMAL32:
520 return f.template operator()<
typename IdTypeMap<type_id::DECIMAL32>::type>(
521 std::forward<Ts>(args)...);
522 case type_id::DECIMAL64:
523 return f.template operator()<
typename IdTypeMap<type_id::DECIMAL64>::type>(
524 std::forward<Ts>(args)...);
525 case type_id::DECIMAL128:
526 return f.template operator()<
typename IdTypeMap<type_id::DECIMAL128>::type>(
527 std::forward<Ts>(args)...);
528 case type_id::STRUCT:
529 return f.template operator()<
typename IdTypeMap<type_id::STRUCT>::type>(
530 std::forward<Ts>(args)...);
532 #ifndef __CUDA_ARCH__
535 CUDF_UNREACHABLE(
"Invalid type_id.");
543 template <
typename T1>
544 struct double_type_dispatcher_second_type {
546 #pragma nv_exec_check_disable
548 template <
typename T2,
typename F,
typename... Ts>
549 CUDF_HOST_DEVICE __forceinline__ decltype(
auto) operator()(F&& f, Ts&&... args)
const
551 return f.template operator()<T1, T2>(std::forward<Ts>(args)...);
555 template <
template <cudf::type_
id>
typename IdTypeMap>
556 struct double_type_dispatcher_first_type {
558 #pragma nv_exec_check_disable
560 template <
typename T1,
typename F,
typename... Ts>
561 CUDF_HOST_DEVICE __forceinline__ decltype(
auto) operator()(
cudf::data_type type2,
565 return type_dispatcher<IdTypeMap>(type2,
566 detail::double_type_dispatcher_second_type<T1>{},
568 std::forward<Ts>(args)...);
590 #pragma nv_exec_check_disable
592 template <
template <cudf::type_
id>
typename IdTypeMap = id_to_type_impl,
typename F,
typename... Ts>
596 return type_dispatcher<IdTypeMap>(type1,
597 detail::double_type_dispatcher_first_type<IdTypeMap>{},
600 std::forward<Ts>(args)...);