@@ -344,44 +344,79 @@ from_chars(UC const *first, UC const *last, T &value, int base) noexcept {
344
344
return from_chars_advanced (first, last, value, options);
345
345
}
346
346
347
- FASTFLOAT_CONSTEXPR20 inline double
348
- integer_times_pow10 (uint64_t mantissa, int decimal_exponent) noexcept {
349
- double value;
347
+ template <typename T>
348
+ FASTFLOAT_CONSTEXPR20
349
+ typename std::enable_if<is_supported_float_type<T>::value, T>::type
350
+ integer_times_pow10 (uint64_t mantissa, int decimal_exponent) noexcept {
351
+ T value;
350
352
if (clinger_fast_path_impl (mantissa, decimal_exponent, false , value))
351
353
return value;
352
354
353
355
adjusted_mantissa am =
354
- compute_float<binary_format<double >>(decimal_exponent, mantissa);
356
+ compute_float<binary_format<T >>(decimal_exponent, mantissa);
355
357
to_float (false , am, value);
356
358
return value;
357
359
}
358
360
359
- FASTFLOAT_CONSTEXPR20 inline double
360
- integer_times_pow10 (int64_t mantissa, int decimal_exponent) noexcept {
361
+ template <typename T>
362
+ FASTFLOAT_CONSTEXPR20
363
+ typename std::enable_if<is_supported_float_type<T>::value, T>::type
364
+ integer_times_pow10 (int64_t mantissa, int decimal_exponent) noexcept {
361
365
const bool is_negative = mantissa < 0 ;
362
366
const uint64_t m = static_cast <uint64_t >(is_negative ? -mantissa : mantissa);
363
367
364
- double value;
368
+ T value;
365
369
if (clinger_fast_path_impl (m, decimal_exponent, is_negative, value))
366
370
return value;
367
371
368
- adjusted_mantissa am =
369
- compute_float<binary_format<double >>(decimal_exponent, m);
372
+ adjusted_mantissa am = compute_float<binary_format<T>>(decimal_exponent, m);
370
373
to_float (is_negative, am, value);
371
374
return value;
372
375
}
373
376
377
+ FASTFLOAT_CONSTEXPR20 inline double
378
+ integer_times_pow10 (uint64_t mantissa, int decimal_exponent) noexcept {
379
+ return integer_times_pow10<double >(mantissa, decimal_exponent);
380
+ }
381
+
382
+ FASTFLOAT_CONSTEXPR20 inline double
383
+ integer_times_pow10 (int64_t mantissa, int decimal_exponent) noexcept {
384
+ return integer_times_pow10<double >(mantissa, decimal_exponent);
385
+ }
386
+
374
387
// the following overloads are here to avoid surprising ambiguity for int,
375
388
// unsigned, etc.
389
+ template <typename T, typename Int>
390
+ FASTFLOAT_CONSTEXPR20
391
+ typename std::enable_if<is_supported_float_type<T>::value &&
392
+ std::is_integral<Int>::value &&
393
+ !std::is_signed<Int>::value,
394
+ T>::type
395
+ integer_times_pow10 (Int mantissa, int decimal_exponent) noexcept {
396
+ return integer_times_pow10<T>(static_cast <uint64_t >(mantissa),
397
+ decimal_exponent);
398
+ }
399
+
400
+ template <typename T, typename Int>
401
+ FASTFLOAT_CONSTEXPR20
402
+ typename std::enable_if<is_supported_float_type<T>::value &&
403
+ std::is_integral<Int>::value &&
404
+ std::is_signed<Int>::value,
405
+ T>::type
406
+ integer_times_pow10 (Int mantissa, int decimal_exponent) noexcept {
407
+ return integer_times_pow10<T>(static_cast <int64_t >(mantissa),
408
+ decimal_exponent);
409
+ }
410
+
376
411
template <typename Int>
377
- FASTFLOAT_CONSTEXPR20 inline typename std::enable_if<
412
+ FASTFLOAT_CONSTEXPR20 typename std::enable_if<
378
413
std::is_integral<Int>::value && !std::is_signed<Int>::value, double >::type
379
414
integer_times_pow10 (Int mantissa, int decimal_exponent) noexcept {
380
415
return integer_times_pow10 (static_cast <uint64_t >(mantissa), decimal_exponent);
381
416
}
382
417
383
418
template <typename Int>
384
- FASTFLOAT_CONSTEXPR20 inline typename std::enable_if<
419
+ FASTFLOAT_CONSTEXPR20 typename std::enable_if<
385
420
std::is_integral<Int>::value && std::is_signed<Int>::value, double >::type
386
421
integer_times_pow10 (Int mantissa, int decimal_exponent) noexcept {
387
422
return integer_times_pow10 (static_cast <int64_t >(mantissa), decimal_exponent);
0 commit comments