@@ -344,44 +344,79 @@ from_chars(UC const *first, UC const *last, T &value, int base) noexcept {
344344 return from_chars_advanced (first, last, value, options);
345345}
346346
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;
350352 if (clinger_fast_path_impl (mantissa, decimal_exponent, false , value))
351353 return value;
352354
353355 adjusted_mantissa am =
354- compute_float<binary_format<double >>(decimal_exponent, mantissa);
356+ compute_float<binary_format<T >>(decimal_exponent, mantissa);
355357 to_float (false , am, value);
356358 return value;
357359}
358360
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 {
361365 const bool is_negative = mantissa < 0 ;
362366 const uint64_t m = static_cast <uint64_t >(is_negative ? -mantissa : mantissa);
363367
364- double value;
368+ T value;
365369 if (clinger_fast_path_impl (m, decimal_exponent, is_negative, value))
366370 return value;
367371
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);
370373 to_float (is_negative, am, value);
371374 return value;
372375}
373376
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+
374387// the following overloads are here to avoid surprising ambiguity for int,
375388// 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+
376411template <typename Int>
377- FASTFLOAT_CONSTEXPR20 inline typename std::enable_if<
412+ FASTFLOAT_CONSTEXPR20 typename std::enable_if<
378413 std::is_integral<Int>::value && !std::is_signed<Int>::value, double >::type
379414integer_times_pow10 (Int mantissa, int decimal_exponent) noexcept {
380415 return integer_times_pow10 (static_cast <uint64_t >(mantissa), decimal_exponent);
381416}
382417
383418template <typename Int>
384- FASTFLOAT_CONSTEXPR20 inline typename std::enable_if<
419+ FASTFLOAT_CONSTEXPR20 typename std::enable_if<
385420 std::is_integral<Int>::value && std::is_signed<Int>::value, double >::type
386421integer_times_pow10 (Int mantissa, int decimal_exponent) noexcept {
387422 return integer_times_pow10 (static_cast <int64_t >(mantissa), decimal_exponent);
0 commit comments