type_dispatcher.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2023, 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 
19 #include <cudf/detail/utilities/assert.cuh>
21 #include <cudf/types.hpp>
22 #include <cudf/utilities/error.hpp>
26 
27 #include <string>
28 
34 namespace cudf {
56 template <typename T>
57 inline constexpr type_id type_to_id()
58 {
59  return type_id::EMPTY;
60 };
61 
66 struct type_to_name_impl {
72  template <typename T>
73  inline std::string operator()()
74  {
75  return "void";
76  }
77 };
78 
79 template <cudf::type_id t>
80 struct id_to_type_impl {
81  using type = void;
82 };
92 template <cudf::type_id Id>
93 using id_to_type = typename id_to_type_impl<Id>::type;
94 
109 // clang-format off
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>>>;
115 // clang-format on
116 
126 template <typename T>
128 {
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>();
132 }
133 
141 #ifndef CUDF_TYPE_MAPPING
142 #define CUDF_TYPE_MAPPING(Type, Id) \
143  template <> \
144  constexpr inline type_id type_to_id<Type>() \
145  { \
146  return Id; \
147  } \
148  template <> \
149  inline std::string type_to_name_impl::operator()<Type>() \
150  { \
151  return CUDF_STRINGIFY(Type); \
152  } \
153  template <> \
154  struct id_to_type_impl<Id> { \
155  using type = Type; \
156  };
157 #endif
158 
159 // Defines all of the mappings between C++ types and their corresponding `cudf::type_id` values.
160 CUDF_TYPE_MAPPING(int8_t, type_id::INT8)
161 CUDF_TYPE_MAPPING(int16_t, type_id::INT16)
162 CUDF_TYPE_MAPPING(int32_t, type_id::INT32)
163 CUDF_TYPE_MAPPING(int64_t, type_id::INT64)
164 CUDF_TYPE_MAPPING(uint8_t, type_id::UINT8)
165 CUDF_TYPE_MAPPING(uint16_t, type_id::UINT16)
166 CUDF_TYPE_MAPPING(uint32_t, type_id::UINT32)
167 CUDF_TYPE_MAPPING(uint64_t, type_id::UINT64)
168 CUDF_TYPE_MAPPING(float, type_id::FLOAT32)
169 CUDF_TYPE_MAPPING(double, type_id::FLOAT64)
170 CUDF_TYPE_MAPPING(bool, type_id::BOOL8)
171 CUDF_TYPE_MAPPING(cudf::timestamp_D, type_id::TIMESTAMP_DAYS)
172 CUDF_TYPE_MAPPING(cudf::timestamp_s, type_id::TIMESTAMP_SECONDS)
173 CUDF_TYPE_MAPPING(cudf::timestamp_ms, type_id::TIMESTAMP_MILLISECONDS)
174 CUDF_TYPE_MAPPING(cudf::timestamp_us, type_id::TIMESTAMP_MICROSECONDS)
175 CUDF_TYPE_MAPPING(cudf::timestamp_ns, type_id::TIMESTAMP_NANOSECONDS)
176 CUDF_TYPE_MAPPING(cudf::duration_D, type_id::DURATION_DAYS)
177 CUDF_TYPE_MAPPING(cudf::duration_s, type_id::DURATION_SECONDS)
178 CUDF_TYPE_MAPPING(cudf::duration_ms, type_id::DURATION_MILLISECONDS)
179 CUDF_TYPE_MAPPING(cudf::duration_us, type_id::DURATION_MICROSECONDS)
180 CUDF_TYPE_MAPPING(cudf::duration_ns, type_id::DURATION_NANOSECONDS)
181 CUDF_TYPE_MAPPING(cudf::dictionary32, type_id::DICTIONARY32)
182 CUDF_TYPE_MAPPING(cudf::string_view, type_id::STRING)
183 CUDF_TYPE_MAPPING(cudf::list_view, type_id::LIST)
184 CUDF_TYPE_MAPPING(numeric::decimal32, type_id::DECIMAL32)
185 CUDF_TYPE_MAPPING(numeric::decimal64, type_id::DECIMAL64)
186 CUDF_TYPE_MAPPING(numeric::decimal128, type_id::DECIMAL128)
187 CUDF_TYPE_MAPPING(cudf::struct_view, type_id::STRUCT)
188 
189 
197 template <cudf::type_id Id>
200 };
201 
202 template <typename T>
203 struct type_to_scalar_type_impl {
204  using ScalarType = cudf::scalar;
205 };
206 
213 #ifndef MAP_NUMERIC_SCALAR
214 #define MAP_NUMERIC_SCALAR(Type) \
215  template <> \
216  struct type_to_scalar_type_impl<Type> { \
217  using ScalarType = cudf::numeric_scalar<Type>; \
218  using ScalarDeviceType = cudf::numeric_scalar_device_view<Type>; \
219  };
220 #endif
221 
222 MAP_NUMERIC_SCALAR(int8_t)
223 MAP_NUMERIC_SCALAR(int16_t)
224 MAP_NUMERIC_SCALAR(int32_t)
225 MAP_NUMERIC_SCALAR(int64_t)
226 MAP_NUMERIC_SCALAR(__int128_t)
227 MAP_NUMERIC_SCALAR(uint8_t)
228 MAP_NUMERIC_SCALAR(uint16_t)
229 MAP_NUMERIC_SCALAR(uint32_t)
230 MAP_NUMERIC_SCALAR(uint64_t)
231 MAP_NUMERIC_SCALAR(float)
232 MAP_NUMERIC_SCALAR(double)
233 MAP_NUMERIC_SCALAR(bool)
234 
235 template <>
236 struct type_to_scalar_type_impl<std::string> {
237  using ScalarType = cudf::string_scalar;
238  using ScalarDeviceType = cudf::string_scalar_device_view;
239 };
240 
241 template <>
242 struct type_to_scalar_type_impl<cudf::string_view> {
243  using ScalarType = cudf::string_scalar;
244  using ScalarDeviceType = cudf::string_scalar_device_view;
245 };
246 
247 template <>
248 struct type_to_scalar_type_impl<numeric::decimal32> {
251 };
252 
253 template <>
254 struct type_to_scalar_type_impl<numeric::decimal64> {
257 };
258 
259 template <>
260 struct type_to_scalar_type_impl<numeric::decimal128> {
263 };
264 
265 template <> // TODO: this is a temporary solution for make_pair_iterator
266 struct type_to_scalar_type_impl<cudf::dictionary32> {
267  using ScalarType = cudf::numeric_scalar<int32_t>;
268  using ScalarDeviceType = cudf::numeric_scalar_device_view<int32_t>;
269 };
270 
271 template <> // TODO: this is to get compilation working. list scalars will be implemented at a
272  // later time.
273 struct type_to_scalar_type_impl<cudf::list_view> {
274  using ScalarType = cudf::list_scalar;
275  // using ScalarDeviceType = cudf::list_scalar_device_view;
276 };
277 
278 template <> // TODO: Ditto, likewise.
279 struct type_to_scalar_type_impl<cudf::struct_view> {
280  using ScalarType = cudf::struct_scalar;
281  // using ScalarDeviceType = cudf::struct_scalar_device_view; // CALEB: TODO!
282 };
283 
290 #ifndef MAP_TIMESTAMP_SCALAR
291 #define MAP_TIMESTAMP_SCALAR(Type) \
292  template <> \
293  struct type_to_scalar_type_impl<Type> { \
294  using ScalarType = cudf::timestamp_scalar<Type>; \
295  using ScalarDeviceType = cudf::timestamp_scalar_device_view<Type>; \
296  };
297 #endif
298 
304 
305 
311 #ifndef MAP_DURATION_SCALAR
312 #define MAP_DURATION_SCALAR(Type) \
313  template <> \
314  struct type_to_scalar_type_impl<Type> { \
315  using ScalarType = cudf::duration_scalar<Type>; \
316  using ScalarDeviceType = cudf::duration_scalar_device_view<Type>; \
317  };
318 #endif
319 
325 
326 
331 template <typename T>
333 
339 template <typename T>
340 using scalar_device_type_t = typename type_to_scalar_type_impl<T>::ScalarDeviceType;
341 
434 // This pragma disables a compiler warning that complains about the valid usage
435 // of calling a __host__ functor from this function which is __host__ __device__
436 #ifdef __CUDACC__
437 #pragma nv_exec_check_disable
438 #endif
439 template <template <cudf::type_id> typename IdTypeMap = id_to_type_impl,
440  typename Functor,
441  typename... Ts>
442 CUDF_HOST_DEVICE __forceinline__ constexpr decltype(auto) type_dispatcher(cudf::data_type dtype,
443  Functor f,
444  Ts&&... args)
445 {
446  switch (dtype.id()) {
447  case type_id::INT8:
448  return f.template operator()<typename IdTypeMap<type_id::INT8>::type>(
449  std::forward<Ts>(args)...);
450  case type_id::INT16:
451  return f.template operator()<typename IdTypeMap<type_id::INT16>::type>(
452  std::forward<Ts>(args)...);
453  case type_id::INT32:
454  return f.template operator()<typename IdTypeMap<type_id::INT32>::type>(
455  std::forward<Ts>(args)...);
456  case type_id::INT64:
457  return f.template operator()<typename IdTypeMap<type_id::INT64>::type>(
458  std::forward<Ts>(args)...);
459  case type_id::UINT8:
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)...);
477  case type_id::BOOL8:
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)...);
516  case type_id::LIST:
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)...);
531  default: {
532 #ifndef __CUDA_ARCH__
533  CUDF_FAIL("Invalid type_id.");
534 #else
535  CUDF_UNREACHABLE("Invalid type_id.");
536 #endif
537  }
538  }
539 }
540 
541 // @cond
542 namespace detail {
543 template <typename T1>
544 struct double_type_dispatcher_second_type {
545 #ifdef __CUDACC__
546 #pragma nv_exec_check_disable
547 #endif
548  template <typename T2, typename F, typename... Ts>
549  CUDF_HOST_DEVICE __forceinline__ decltype(auto) operator()(F&& f, Ts&&... args) const
550  {
551  return f.template operator()<T1, T2>(std::forward<Ts>(args)...);
552  }
553 };
554 
555 template <template <cudf::type_id> typename IdTypeMap>
556 struct double_type_dispatcher_first_type {
557 #ifdef __CUDACC__
558 #pragma nv_exec_check_disable
559 #endif
560  template <typename T1, typename F, typename... Ts>
561  CUDF_HOST_DEVICE __forceinline__ decltype(auto) operator()(cudf::data_type type2,
562  F&& f,
563  Ts&&... args) const
564  {
565  return type_dispatcher<IdTypeMap>(type2,
566  detail::double_type_dispatcher_second_type<T1>{},
567  std::forward<F>(f),
568  std::forward<Ts>(args)...);
569  }
570 };
571 } // namespace detail
572 // @endcond
573 
589 #ifdef __CUDACC__
590 #pragma nv_exec_check_disable
591 #endif
592 template <template <cudf::type_id> typename IdTypeMap = id_to_type_impl, typename F, typename... Ts>
593 CUDF_HOST_DEVICE __forceinline__ constexpr decltype(auto) double_type_dispatcher(
594  cudf::data_type type1, cudf::data_type type2, F&& f, Ts&&... args)
595 {
596  return type_dispatcher<IdTypeMap>(type1,
597  detail::double_type_dispatcher_first_type<IdTypeMap>{},
598  type2,
599  std::forward<F>(f),
600  std::forward<Ts>(args)...);
601 }
602 
612 std::string type_to_name(data_type type);
613  // end of group
615 } // namespace cudf
cudf::dictionary32
dictionary_wrapper< int32_t > dictionary32
32-bit integer indexed dictionary wrapper
Definition: dictionary.hpp:216
fixed_point.hpp
Class definition for fixed point data type.
durations.hpp
Concrete type definitions for int32_t and int64_t durations in varying resolutions.
cudf::scalar_device_type_t
typename type_to_scalar_type_impl< T >::ScalarDeviceType scalar_device_type_t
Maps a C++ type to the scalar device type required to hold its value.
Definition: type_dispatcher.hpp:340
numeric::fixed_point
A type for representing a number with a fixed amount of precision.
Definition: fixed_point.hpp:210
cudf::string_scalar_device_view
A type of scalar_device_view that stores a pointer to a string value.
Definition: scalar_device_view.cuh:293
cudf::type_id
type_id
Identifies a column's logical element type.
Definition: types.hpp:188
cudf::duration_s
cuda::std::chrono::duration< int64_t, cuda::std::chrono::seconds::period > duration_s
Type alias representing an int64_t duration of seconds.
Definition: durations.hpp:45
types.hpp
Type declarations for libcudf.
cudf::timestamp_s
detail::timestamp< cudf::duration_s > timestamp_s
Type alias representing a cudf::duration_s (int64_t) since the unix epoch.
Definition: timestamps.hpp:62
cudf::string_view
A non-owning, immutable view of device data that is a variable length char array representing a UTF-8...
Definition: string_view.hpp:44
CUDF_FAIL
#define CUDF_FAIL(...)
Indicates that an erroneous code path has been taken.
Definition: error.hpp:209
cudf::struct_scalar
An owning class to represent a struct value in device memory.
Definition: scalar.hpp:793
cudf::type_id_matches_device_storage_type
constexpr bool type_id_matches_device_storage_type(type_id id)
Checks if fixed_point-like types have template type T matching the column's stored type id.
Definition: type_dispatcher.hpp:127
cudf::duration_D
cuda::std::chrono::duration< int32_t, cuda::std::chrono::days::period > duration_D
Type alias representing an int32_t duration of days.
Definition: durations.hpp:33
numeric::decimal32
fixed_point< int32_t, Radix::BASE_10 > decimal32
32-bit decimal fixed point
Definition: fixed_point.hpp:828
cudf::id_to_type
typename id_to_type_impl< Id >::type id_to_type
Maps a cudf::type_id to its corresponding concrete C++ type.
Definition: type_dispatcher.hpp:93
MAP_TIMESTAMP_SCALAR
#define MAP_TIMESTAMP_SCALAR(Type)
Macro used to define scalar type and scalar device type for cudf::timestamp_scalar template class for...
Definition: type_dispatcher.hpp:291
numeric::decimal64
fixed_point< int64_t, Radix::BASE_10 > decimal64
64-bit decimal fixed point
Definition: fixed_point.hpp:829
cudf::timestamp_D
detail::timestamp< cudf::duration_D > timestamp_D
Type alias representing a cudf::duration_D (int32_t) since the unix epoch.
Definition: timestamps.hpp:50
cudf::device_storage_type_t
std::conditional_t< std::is_same_v< numeric::decimal32, T >, int32_t, std::conditional_t< std::is_same_v< numeric::decimal64, T >, int64_t, std::conditional_t< std::is_same_v< numeric::decimal128, T >, __int128_t, T > >> device_storage_type_t
"Returns" the corresponding type that is stored on the device when using cudf::column
Definition: type_dispatcher.hpp:114
cudf::duration_ns
cuda::std::chrono::duration< int64_t, cuda::std::chrono::nanoseconds::period > duration_ns
Type alias representing an int64_t duration of nanoseconds.
Definition: durations.hpp:57
cudf::type_to_name
std::string type_to_name(data_type type)
Return a name for a given type.
cudf::double_type_dispatcher
CUDF_HOST_DEVICE constexpr decltype(auto) __forceinline__ double_type_dispatcher(cudf::data_type type1, cudf::data_type type2, F &&f, Ts &&... args)
Dispatches two type template parameters to a callable.
Definition: type_dispatcher.hpp:593
cudf::dictionary_wrapper
A strongly typed wrapper for indices in a DICTIONARY type column.
Definition: dictionary.hpp:48
cudf::timestamp_ms
detail::timestamp< cudf::duration_ms > timestamp_ms
Type alias representing a cudf::duration_ms (int64_t) since the unix epoch.
Definition: timestamps.hpp:66
cudf::type_dispatcher
CUDF_HOST_DEVICE constexpr decltype(auto) __forceinline__ type_dispatcher(cudf::data_type dtype, Functor f, Ts &&... args)
Invokes an operator() template with the type instantiation based on the specified cudf::data_type's i...
Definition: type_dispatcher.hpp:442
MAP_NUMERIC_SCALAR
#define MAP_NUMERIC_SCALAR(Type)
Macro used to define scalar type and scalar device type for cudf::numeric_scalar template class for n...
Definition: type_dispatcher.hpp:214
numeric::decimal128
fixed_point< __int128_t, Radix::BASE_10 > decimal128
128-bit decimal fixed point
Definition: fixed_point.hpp:830
cudf::scalar
An owning class to represent a singular value.
Definition: scalar.hpp:48
cudf::numeric_scalar
An owning class to represent a numerical value in device memory.
Definition: scalar.hpp:243
dictionary.hpp
Concrete type definition for dictionary columns.
cudf::data_type
Indicator for the logical data type of an element in a column.
Definition: types.hpp:228
cudf::numeric_scalar_device_view
A type of scalar_device_view that stores a pointer to a numerical value.
Definition: scalar_device_view.cuh:235
cudf::timestamp_ns
detail::timestamp< cudf::duration_ns > timestamp_ns
Type alias representing a cudf::duration_ns (int64_t) since the unix epoch.
Definition: timestamps.hpp:74
cudf::fixed_point_scalar
An owning class to represent a fixed_point number in device memory.
Definition: scalar.hpp:303
cudf::scalar_type_t
typename type_to_scalar_type_impl< T >::ScalarType scalar_type_t
Maps a C++ type to the scalar type required to hold its value.
Definition: type_dispatcher.hpp:332
cudf
cuDF interfaces
Definition: aggregation.hpp:34
cudf::timestamp_us
detail::timestamp< cudf::duration_us > timestamp_us
Type alias representing a cudf::duration_us (int64_t) since the unix epoch.
Definition: timestamps.hpp:70
cudf::list_scalar
An owning class to represent a list value in device memory.
Definition: scalar.hpp:727
cudf::struct_view
A non-owning, immutable view of device data that represents a struct with fields of arbitrary types (...
Definition: struct_view.hpp:30
cudf::dispatch_storage_type
Use this specialization on type_dispatcher whenever you only need to operate on the underlying stored...
Definition: type_dispatcher.hpp:198
CUDF_TYPE_MAPPING
#define CUDF_TYPE_MAPPING(Type, Id)
Macro used to define a mapping between a concrete C++ type and a cudf::type_id enum.
Definition: type_dispatcher.hpp:142
cudf::fixed_point_scalar_device_view
A type of scalar_device_view that stores a pointer to a fixed_point value.
Definition: scalar_device_view.cuh:255
cudf::list_view
A non-owning, immutable view of device data that represents a list of elements of arbitrary type (inc...
Definition: list_view.hpp:30
cudf::string_scalar
An owning class to represent a string in device memory.
Definition: scalar.hpp:429
timestamps.hpp
Concrete type definitions for int32_t and int64_t timestamps in varying resolutions as durations sinc...
MAP_DURATION_SCALAR
#define MAP_DURATION_SCALAR(Type)
Macro used to define scalar type and scalar device type for cudf::duration_scalar template class for ...
Definition: type_dispatcher.hpp:312
cudf::dispatch_storage_type::type
device_storage_type_t< id_to_type< Id > > type
The underlying type.
Definition: type_dispatcher.hpp:199
cudf::duration_us
cuda::std::chrono::duration< int64_t, cuda::std::chrono::microseconds::period > duration_us
Type alias representing an int64_t duration of microseconds.
Definition: durations.hpp:53
cudf::type_to_id
constexpr type_id type_to_id()
Maps a C++ type to its corresponding cudf::type_id
Definition: type_dispatcher.hpp:57
cudf::duration_ms
cuda::std::chrono::duration< int64_t, cuda::std::chrono::milliseconds::period > duration_ms
Type alias representing an int64_t duration of milliseconds.
Definition: durations.hpp:49
numeric
fixed_point and supporting types
Definition: fixed_point.hpp:32
error.hpp