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>
436 #pragma nv_exec_check_disable
437 template <
template <cudf::type_
id>
typename IdTypeMap = id_to_type_impl,
444 switch (dtype.id()) {
446 return f.template operator()<
typename IdTypeMap<type_id::INT8>::type>(
447 std::forward<Ts>(args)...);
449 return f.template operator()<
typename IdTypeMap<type_id::INT16>::type>(
450 std::forward<Ts>(args)...);
452 return f.template operator()<
typename IdTypeMap<type_id::INT32>::type>(
453 std::forward<Ts>(args)...);
455 return f.template operator()<
typename IdTypeMap<type_id::INT64>::type>(
456 std::forward<Ts>(args)...);
458 return f.template operator()<
typename IdTypeMap<type_id::UINT8>::type>(
459 std::forward<Ts>(args)...);
460 case type_id::UINT16:
461 return f.template operator()<
typename IdTypeMap<type_id::UINT16>::type>(
462 std::forward<Ts>(args)...);
463 case type_id::UINT32:
464 return f.template operator()<
typename IdTypeMap<type_id::UINT32>::type>(
465 std::forward<Ts>(args)...);
466 case type_id::UINT64:
467 return f.template operator()<
typename IdTypeMap<type_id::UINT64>::type>(
468 std::forward<Ts>(args)...);
469 case type_id::FLOAT32:
470 return f.template operator()<
typename IdTypeMap<type_id::FLOAT32>::type>(
471 std::forward<Ts>(args)...);
472 case type_id::FLOAT64:
473 return f.template operator()<
typename IdTypeMap<type_id::FLOAT64>::type>(
474 std::forward<Ts>(args)...);
476 return f.template operator()<
typename IdTypeMap<type_id::BOOL8>::type>(
477 std::forward<Ts>(args)...);
478 case type_id::TIMESTAMP_DAYS:
479 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_DAYS>::type>(
480 std::forward<Ts>(args)...);
481 case type_id::TIMESTAMP_SECONDS:
482 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_SECONDS>::type>(
483 std::forward<Ts>(args)...);
484 case type_id::TIMESTAMP_MILLISECONDS:
485 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_MILLISECONDS>::type>(
486 std::forward<Ts>(args)...);
487 case type_id::TIMESTAMP_MICROSECONDS:
488 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_MICROSECONDS>::type>(
489 std::forward<Ts>(args)...);
490 case type_id::TIMESTAMP_NANOSECONDS:
491 return f.template operator()<
typename IdTypeMap<type_id::TIMESTAMP_NANOSECONDS>::type>(
492 std::forward<Ts>(args)...);
493 case type_id::DURATION_DAYS:
494 return f.template operator()<
typename IdTypeMap<type_id::DURATION_DAYS>::type>(
495 std::forward<Ts>(args)...);
496 case type_id::DURATION_SECONDS:
497 return f.template operator()<
typename IdTypeMap<type_id::DURATION_SECONDS>::type>(
498 std::forward<Ts>(args)...);
499 case type_id::DURATION_MILLISECONDS:
500 return f.template operator()<
typename IdTypeMap<type_id::DURATION_MILLISECONDS>::type>(
501 std::forward<Ts>(args)...);
502 case type_id::DURATION_MICROSECONDS:
503 return f.template operator()<
typename IdTypeMap<type_id::DURATION_MICROSECONDS>::type>(
504 std::forward<Ts>(args)...);
505 case type_id::DURATION_NANOSECONDS:
506 return f.template operator()<
typename IdTypeMap<type_id::DURATION_NANOSECONDS>::type>(
507 std::forward<Ts>(args)...);
508 case type_id::DICTIONARY32:
509 return f.template operator()<
typename IdTypeMap<type_id::DICTIONARY32>::type>(
510 std::forward<Ts>(args)...);
511 case type_id::STRING:
512 return f.template operator()<
typename IdTypeMap<type_id::STRING>::type>(
513 std::forward<Ts>(args)...);
515 return f.template operator()<
typename IdTypeMap<type_id::LIST>::type>(
516 std::forward<Ts>(args)...);
517 case type_id::DECIMAL32:
518 return f.template operator()<
typename IdTypeMap<type_id::DECIMAL32>::type>(
519 std::forward<Ts>(args)...);
520 case type_id::DECIMAL64:
521 return f.template operator()<
typename IdTypeMap<type_id::DECIMAL64>::type>(
522 std::forward<Ts>(args)...);
523 case type_id::DECIMAL128:
524 return f.template operator()<
typename IdTypeMap<type_id::DECIMAL128>::type>(
525 std::forward<Ts>(args)...);
526 case type_id::STRUCT:
527 return f.template operator()<
typename IdTypeMap<type_id::STRUCT>::type>(
528 std::forward<Ts>(args)...);
530 #ifndef __CUDA_ARCH__
533 CUDF_UNREACHABLE(
"Invalid type_id.");
541 template <
typename T1>
542 struct double_type_dispatcher_second_type {
543 #pragma nv_exec_check_disable
544 template <
typename T2,
typename F,
typename... Ts>
545 CUDF_HOST_DEVICE __forceinline__ decltype(
auto) operator()(F&& f, Ts&&... args)
const
547 return f.template operator()<T1, T2>(std::forward<Ts>(args)...);
551 template <
template <cudf::type_
id>
typename IdTypeMap>
552 struct double_type_dispatcher_first_type {
553 #pragma nv_exec_check_disable
554 template <
typename T1,
typename F,
typename... Ts>
555 CUDF_HOST_DEVICE __forceinline__ decltype(
auto) operator()(
cudf::data_type type2,
559 return type_dispatcher<IdTypeMap>(type2,
560 detail::double_type_dispatcher_second_type<T1>{},
562 std::forward<Ts>(args)...);
583 #pragma nv_exec_check_disable
584 template <
template <cudf::type_
id>
typename IdTypeMap = id_to_type_impl,
typename F,
typename... Ts>
588 return type_dispatcher<IdTypeMap>(type1,
589 detail::double_type_dispatcher_first_type<IdTypeMap>{},
592 std::forward<Ts>(args)...);