File indexing completed on 2025-09-13 08:40:00
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef BOOST_MATH_TOOLS_TYPE_TRAITS
0011 #define BOOST_MATH_TOOLS_TYPE_TRAITS
0012
0013 #include <boost/math/tools/config.hpp>
0014
0015 #ifdef BOOST_MATH_ENABLE_CUDA
0016
0017 #include <cuda/std/type_traits>
0018
0019 namespace boost {
0020 namespace math {
0021
0022
0023 using cuda::std::integral_constant;
0024 using cuda::std::true_type;
0025 using cuda::std::false_type;
0026
0027
0028 using cuda::std::is_void;
0029 using cuda::std::is_null_pointer;
0030 using cuda::std::is_integral;
0031 using cuda::std::is_floating_point;
0032 using cuda::std::is_array;
0033 using cuda::std::is_enum;
0034 using cuda::std::is_union;
0035 using cuda::std::is_class;
0036 using cuda::std::is_function;
0037 using cuda::std::is_pointer;
0038 using cuda::std::is_lvalue_reference;
0039 using cuda::std::is_rvalue_reference;
0040 using cuda::std::is_member_object_pointer;
0041 using cuda::std::is_member_function_pointer;
0042
0043
0044 using cuda::std::is_fundamental;
0045 using cuda::std::is_arithmetic;
0046 using cuda::std::is_scalar;
0047 using cuda::std::is_object;
0048 using cuda::std::is_compound;
0049 using cuda::std::is_reference;
0050 using cuda::std::is_member_pointer;
0051
0052
0053 using cuda::std::is_const;
0054 using cuda::std::is_volatile;
0055 using cuda::std::is_trivial;
0056 using cuda::std::is_trivially_copyable;
0057 using cuda::std::is_standard_layout;
0058 using cuda::std::is_empty;
0059 using cuda::std::is_polymorphic;
0060 using cuda::std::is_abstract;
0061 using cuda::std::is_final;
0062 using cuda::std::is_signed;
0063 using cuda::std::is_unsigned;
0064
0065
0066 using cuda::std::is_constructible;
0067 using cuda::std::is_trivially_constructible;
0068 using cuda::std::is_nothrow_constructible;
0069
0070 using cuda::std::is_default_constructible;
0071 using cuda::std::is_trivially_default_constructible;
0072 using cuda::std::is_nothrow_default_constructible;
0073
0074 using cuda::std::is_copy_constructible;
0075 using cuda::std::is_trivially_copy_constructible;
0076 using cuda::std::is_nothrow_copy_constructible;
0077
0078 using cuda::std::is_move_constructible;
0079 using cuda::std::is_trivially_move_constructible;
0080 using cuda::std::is_nothrow_move_constructible;
0081
0082 using cuda::std::is_assignable;
0083 using cuda::std::is_trivially_assignable;
0084 using cuda::std::is_nothrow_assignable;
0085
0086 using cuda::std::is_copy_assignable;
0087 using cuda::std::is_trivially_copy_assignable;
0088 using cuda::std::is_nothrow_copy_assignable;
0089
0090 using cuda::std::is_move_assignable;
0091 using cuda::std::is_trivially_move_assignable;
0092 using cuda::std::is_nothrow_move_assignable;
0093
0094 using cuda::std::is_destructible;
0095 using cuda::std::is_trivially_destructible;
0096 using cuda::std::is_nothrow_destructible;
0097
0098 using cuda::std::has_virtual_destructor;
0099
0100
0101 using cuda::std::alignment_of;
0102 using cuda::std::rank;
0103 using cuda::std::extent;
0104
0105
0106 using cuda::std::is_same;
0107 using cuda::std::is_base_of;
0108 using cuda::std::is_convertible;
0109
0110
0111 using cuda::std::remove_cv;
0112 using cuda::std::remove_cv_t;
0113 using cuda::std::remove_const;
0114 using cuda::std::remove_const_t;
0115 using cuda::std::remove_volatile;
0116 using cuda::std::remove_volatile_t;
0117 using cuda::std::add_cv;
0118 using cuda::std::add_cv_t;
0119 using cuda::std::add_const;
0120 using cuda::std::add_const_t;
0121 using cuda::std::add_volatile;
0122 using cuda::std::add_volatile_t;
0123
0124
0125 using cuda::std::remove_reference;
0126 using cuda::std::remove_reference_t;
0127 using cuda::std::add_lvalue_reference;
0128 using cuda::std::add_lvalue_reference_t;
0129 using cuda::std::add_rvalue_reference;
0130 using cuda::std::add_rvalue_reference_t;
0131
0132
0133 using cuda::std::remove_pointer;
0134 using cuda::std::remove_pointer_t;
0135 using cuda::std::add_pointer;
0136 using cuda::std::add_pointer_t;
0137
0138
0139 using cuda::std::make_signed;
0140 using cuda::std::make_signed_t;
0141 using cuda::std::make_unsigned;
0142 using cuda::std::make_unsigned_t;
0143
0144
0145 using cuda::std::remove_extent;
0146 using cuda::std::remove_extent_t;
0147 using cuda::std::remove_all_extents;
0148 using cuda::std::remove_all_extents_t;
0149
0150
0151 using cuda::std::decay;
0152 using cuda::std::decay_t;
0153 using cuda::std::enable_if;
0154 using cuda::std::enable_if_t;
0155 using cuda::std::conditional;
0156 using cuda::std::conditional_t;
0157 using cuda::std::common_type;
0158 using cuda::std::common_type_t;
0159 using cuda::std::underlying_type;
0160 using cuda::std::underlying_type_t;
0161
0162 #else
0163
0164 #include <type_traits>
0165
0166 namespace boost {
0167 namespace math {
0168
0169
0170 using std::integral_constant;
0171 using std::true_type;
0172 using std::false_type;
0173
0174
0175 using std::is_void;
0176 using std::is_null_pointer;
0177 using std::is_integral;
0178 using std::is_floating_point;
0179 using std::is_array;
0180 using std::is_enum;
0181 using std::is_union;
0182 using std::is_class;
0183 using std::is_function;
0184 using std::is_pointer;
0185 using std::is_lvalue_reference;
0186 using std::is_rvalue_reference;
0187 using std::is_member_object_pointer;
0188 using std::is_member_function_pointer;
0189
0190
0191 using std::is_fundamental;
0192 using std::is_arithmetic;
0193 using std::is_scalar;
0194 using std::is_object;
0195 using std::is_compound;
0196 using std::is_reference;
0197 using std::is_member_pointer;
0198
0199
0200 using std::is_const;
0201 using std::is_volatile;
0202 using std::is_trivial;
0203 using std::is_trivially_copyable;
0204 using std::is_standard_layout;
0205 using std::is_empty;
0206 using std::is_polymorphic;
0207 using std::is_abstract;
0208 using std::is_final;
0209 using std::is_signed;
0210 using std::is_unsigned;
0211
0212
0213 using std::is_constructible;
0214 using std::is_trivially_constructible;
0215 using std::is_nothrow_constructible;
0216
0217 using std::is_default_constructible;
0218 using std::is_trivially_default_constructible;
0219 using std::is_nothrow_default_constructible;
0220
0221 using std::is_copy_constructible;
0222 using std::is_trivially_copy_constructible;
0223 using std::is_nothrow_copy_constructible;
0224
0225 using std::is_move_constructible;
0226 using std::is_trivially_move_constructible;
0227 using std::is_nothrow_move_constructible;
0228
0229 using std::is_assignable;
0230 using std::is_trivially_assignable;
0231 using std::is_nothrow_assignable;
0232
0233 using std::is_copy_assignable;
0234 using std::is_trivially_copy_assignable;
0235 using std::is_nothrow_copy_assignable;
0236
0237 using std::is_move_assignable;
0238 using std::is_trivially_move_assignable;
0239 using std::is_nothrow_move_assignable;
0240
0241 using std::is_destructible;
0242 using std::is_trivially_destructible;
0243 using std::is_nothrow_destructible;
0244
0245 using std::has_virtual_destructor;
0246
0247
0248 using std::alignment_of;
0249 using std::rank;
0250 using std::extent;
0251
0252
0253 using std::is_same;
0254 using std::is_base_of;
0255 using std::is_convertible;
0256
0257
0258 using std::remove_cv;
0259 using std::remove_cv_t;
0260 using std::remove_const;
0261 using std::remove_const_t;
0262 using std::remove_volatile;
0263 using std::remove_volatile_t;
0264 using std::add_cv;
0265 using std::add_cv_t;
0266 using std::add_const;
0267 using std::add_const_t;
0268 using std::add_volatile;
0269 using std::add_volatile_t;
0270
0271
0272 using std::remove_reference;
0273 using std::remove_reference_t;
0274 using std::add_lvalue_reference;
0275 using std::add_lvalue_reference_t;
0276 using std::add_rvalue_reference;
0277 using std::add_rvalue_reference_t;
0278
0279
0280 using std::remove_pointer;
0281 using std::remove_pointer_t;
0282 using std::add_pointer;
0283 using std::add_pointer_t;
0284
0285
0286 using std::make_signed;
0287 using std::make_signed_t;
0288 using std::make_unsigned;
0289 using std::make_unsigned_t;
0290
0291
0292 using std::remove_extent;
0293 using std::remove_extent_t;
0294 using std::remove_all_extents;
0295 using std::remove_all_extents_t;
0296
0297
0298 using std::decay;
0299 using std::decay_t;
0300 using std::enable_if;
0301 using std::enable_if_t;
0302 using std::conditional;
0303 using std::conditional_t;
0304 using std::common_type;
0305 using std::common_type_t;
0306 using std::underlying_type;
0307 using std::underlying_type_t;
0308
0309 #endif
0310
0311 template <bool B>
0312 using bool_constant = boost::math::integral_constant<bool, B>;
0313
0314 template <typename T>
0315 BOOST_MATH_INLINE_CONSTEXPR bool is_void_v = boost::math::is_void<T>::value;
0316
0317 template <typename T>
0318 BOOST_MATH_INLINE_CONSTEXPR bool is_null_pointer_v = boost::math::is_null_pointer<T>::value;
0319
0320 template <typename T>
0321 BOOST_MATH_INLINE_CONSTEXPR bool is_integral_v = boost::math::is_integral<T>::value;
0322
0323 template <typename T>
0324 BOOST_MATH_INLINE_CONSTEXPR bool is_floating_point_v = boost::math::is_floating_point<T>::value;
0325
0326 template <typename T>
0327 BOOST_MATH_INLINE_CONSTEXPR bool is_array_v = boost::math::is_array<T>::value;
0328
0329 template <typename T>
0330 BOOST_MATH_INLINE_CONSTEXPR bool is_enum_v = boost::math::is_enum<T>::value;
0331
0332 template <typename T>
0333 BOOST_MATH_INLINE_CONSTEXPR bool is_union_v = boost::math::is_union<T>::value;
0334
0335 template <typename T>
0336 BOOST_MATH_INLINE_CONSTEXPR bool is_class_v = boost::math::is_class<T>::value;
0337
0338 template <typename T>
0339 BOOST_MATH_INLINE_CONSTEXPR bool is_function_v = boost::math::is_function<T>::value;
0340
0341 template <typename T>
0342 BOOST_MATH_INLINE_CONSTEXPR bool is_pointer_v = boost::math::is_pointer<T>::value;
0343
0344 template <typename T>
0345 BOOST_MATH_INLINE_CONSTEXPR bool is_lvalue_reference_v = boost::math::is_lvalue_reference<T>::value;
0346
0347 template <typename T>
0348 BOOST_MATH_INLINE_CONSTEXPR bool is_rvalue_reference_v = boost::math::is_rvalue_reference<T>::value;
0349
0350 template <typename T>
0351 BOOST_MATH_INLINE_CONSTEXPR bool is_member_object_pointer_v = boost::math::is_member_object_pointer<T>::value;
0352
0353 template <typename T>
0354 BOOST_MATH_INLINE_CONSTEXPR bool is_member_function_pointer_v = boost::math::is_member_function_pointer<T>::value;
0355
0356 template <typename T>
0357 BOOST_MATH_INLINE_CONSTEXPR bool is_fundamental_v = boost::math::is_fundamental<T>::value;
0358
0359 template <typename T>
0360 BOOST_MATH_INLINE_CONSTEXPR bool is_arithmetic_v = boost::math::is_arithmetic<T>::value;
0361
0362 template <typename T>
0363 BOOST_MATH_INLINE_CONSTEXPR bool is_scalar_v = boost::math::is_scalar<T>::value;
0364
0365 template <typename T>
0366 BOOST_MATH_INLINE_CONSTEXPR bool is_object_v = boost::math::is_object<T>::value;
0367
0368 template <typename T>
0369 BOOST_MATH_INLINE_CONSTEXPR bool is_compound_v = boost::math::is_compound<T>::value;
0370
0371 template <typename T>
0372 BOOST_MATH_INLINE_CONSTEXPR bool is_reference_v = boost::math::is_reference<T>::value;
0373
0374 template <typename T>
0375 BOOST_MATH_INLINE_CONSTEXPR bool is_member_pointer_v = boost::math::is_member_pointer<T>::value;
0376
0377 template <typename T>
0378 BOOST_MATH_INLINE_CONSTEXPR bool is_const_v = boost::math::is_const<T>::value;
0379
0380 template <typename T>
0381 BOOST_MATH_INLINE_CONSTEXPR bool is_volatile_v = boost::math::is_volatile<T>::value;
0382
0383 template <typename T>
0384 BOOST_MATH_INLINE_CONSTEXPR bool is_trivial_v = boost::math::is_trivial<T>::value;
0385
0386 template <typename T>
0387 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_copyable_v = boost::math::is_trivially_copyable<T>::value;
0388
0389 template <typename T>
0390 BOOST_MATH_INLINE_CONSTEXPR bool is_standard_layout_v = boost::math::is_standard_layout<T>::value;
0391
0392 template <typename T>
0393 BOOST_MATH_INLINE_CONSTEXPR bool is_empty_v = boost::math::is_empty<T>::value;
0394
0395 template <typename T>
0396 BOOST_MATH_INLINE_CONSTEXPR bool is_polymorphic_v = boost::math::is_polymorphic<T>::value;
0397
0398 template <typename T>
0399 BOOST_MATH_INLINE_CONSTEXPR bool is_abstract_v = boost::math::is_abstract<T>::value;
0400
0401 template <typename T>
0402 BOOST_MATH_INLINE_CONSTEXPR bool is_final_v = boost::math::is_final<T>::value;
0403
0404 template <typename T>
0405 BOOST_MATH_INLINE_CONSTEXPR bool is_signed_v = boost::math::is_signed<T>::value;
0406
0407 template <typename T>
0408 BOOST_MATH_INLINE_CONSTEXPR bool is_unsigned_v = boost::math::is_unsigned<T>::value;
0409
0410 template <typename T, typename... Args>
0411 BOOST_MATH_INLINE_CONSTEXPR bool is_constructible_v = boost::math::is_constructible<T, Args...>::value;
0412
0413 template <typename T, typename... Args>
0414 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_constructible_v = boost::math::is_trivially_constructible<T, Args...>::value;
0415
0416 template <typename T, typename... Args>
0417 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_constructible_v = boost::math::is_nothrow_constructible<T, Args...>::value;
0418
0419 template <typename T>
0420 BOOST_MATH_INLINE_CONSTEXPR bool is_default_constructible_v = boost::math::is_default_constructible<T>::value;
0421
0422 template <typename T>
0423 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_default_constructible_v = boost::math::is_trivially_default_constructible<T>::value;
0424
0425 template <typename T>
0426 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_default_constructible_v = boost::math::is_nothrow_default_constructible<T>::value;
0427
0428 template <typename T>
0429 BOOST_MATH_INLINE_CONSTEXPR bool is_copy_constructible_v = boost::math::is_copy_constructible<T>::value;
0430
0431 template <typename T>
0432 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_copy_constructible_v = boost::math::is_trivially_copy_constructible<T>::value;
0433
0434 template <typename T>
0435 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_copy_constructible_v = boost::math::is_nothrow_copy_constructible<T>::value;
0436
0437 template <typename T>
0438 BOOST_MATH_INLINE_CONSTEXPR bool is_move_constructible_v = boost::math::is_move_constructible<T>::value;
0439
0440 template <typename T>
0441 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_move_constructible_v = boost::math::is_trivially_move_constructible<T>::value;
0442
0443 template <typename T>
0444 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_move_constructible_v = boost::math::is_nothrow_move_constructible<T>::value;
0445
0446 template <typename T, typename U>
0447 BOOST_MATH_INLINE_CONSTEXPR bool is_assignable_v = boost::math::is_assignable<T, U>::value;
0448
0449 template <typename T, typename U>
0450 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_assignable_v = boost::math::is_trivially_assignable<T, U>::value;
0451
0452 template <typename T, typename U>
0453 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_assignable_v = boost::math::is_nothrow_assignable<T, U>::value;
0454
0455 template <typename T>
0456 BOOST_MATH_INLINE_CONSTEXPR bool is_copy_assignable_v = boost::math::is_copy_assignable<T>::value;
0457
0458 template <typename T>
0459 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_copy_assignable_v = boost::math::is_trivially_copy_assignable<T>::value;
0460
0461 template <typename T>
0462 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_copy_assignable_v = boost::math::is_nothrow_copy_assignable<T>::value;
0463
0464 template <typename T>
0465 BOOST_MATH_INLINE_CONSTEXPR bool is_move_assignable_v = boost::math::is_move_assignable<T>::value;
0466
0467 template <typename T>
0468 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_move_assignable_v = boost::math::is_trivially_move_assignable<T>::value;
0469
0470 template <typename T>
0471 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_move_assignable_v = boost::math::is_nothrow_move_assignable<T>::value;
0472
0473 template <typename T>
0474 BOOST_MATH_INLINE_CONSTEXPR bool is_destructible_v = boost::math::is_destructible<T>::value;
0475
0476 template <typename T>
0477 BOOST_MATH_INLINE_CONSTEXPR bool is_trivially_destructible_v = boost::math::is_trivially_destructible<T>::value;
0478
0479 template <typename T>
0480 BOOST_MATH_INLINE_CONSTEXPR bool is_nothrow_destructible_v = boost::math::is_nothrow_destructible<T>::value;
0481
0482 template <typename T>
0483 BOOST_MATH_INLINE_CONSTEXPR bool has_virtual_destructor_v = boost::math::has_virtual_destructor<T>::value;
0484
0485 template <typename T, typename U>
0486 BOOST_MATH_INLINE_CONSTEXPR bool is_same_v = boost::math::is_same<T, U>::value;
0487
0488 template <typename T, typename U>
0489 BOOST_MATH_INLINE_CONSTEXPR bool is_base_of_v = boost::math::is_base_of<T, U>::value;
0490
0491 }
0492 }
0493
0494 #endif