Skip to content
3 changes: 2 additions & 1 deletion include/boost/decimal.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,12 @@
#include <boost/decimal/hash.hpp>
#include <boost/decimal/cfloat.hpp>
#include <boost/decimal/charconv.hpp>
#include <boost/decimal/detail/io.hpp>
#include <boost/decimal/iostream.hpp>
#include <boost/decimal/format.hpp>
#include <boost/decimal/cstdio.hpp>
#include <boost/decimal/bid_conversion.hpp>
#include <boost/decimal/dpd_conversion.hpp>
#include <boost/decimal/string.hpp>

#if defined(__clang__) && !defined(__GNUC__)
# pragma clang diagnostic pop
Expand Down
1 change: 1 addition & 0 deletions include/boost/decimal/bid_conversion.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <boost/decimal/decimal128.hpp>
#include <boost/decimal/decimal32_fast.hpp>
#include <boost/decimal/decimal64_fast.hpp>
#include <boost/decimal/decimal128_fast.hpp>
#include <boost/decimal/detail/concepts.hpp>

namespace boost {
Expand Down
224 changes: 26 additions & 198 deletions include/boost/decimal/charconv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
#ifndef BOOST_DECIMAL_CHARCONV_HPP
#define BOOST_DECIMAL_CHARCONV_HPP

#include <boost/decimal/fwd.hpp>
#include <boost/decimal/decimal32.hpp>
#include <boost/decimal/decimal64.hpp>
#include <boost/decimal/decimal128.hpp>
#include <boost/decimal/decimal32_fast.hpp>
#include <boost/decimal/decimal64_fast.hpp>
#include <boost/decimal/decimal128_fast.hpp>
#include <boost/decimal/detail/config.hpp>
#include <boost/decimal/detail/parser.hpp>
#include <boost/decimal/detail/utilities.hpp>
Expand All @@ -20,6 +25,7 @@
#include <boost/decimal/detail/attributes.hpp>
#include <boost/decimal/detail/countl.hpp>
#include <boost/decimal/detail/remove_trailing_zeros.hpp>
#include <boost/decimal/detail/promotion.hpp>

#ifndef BOOST_DECIMAL_BUILD_MODULE
#include <cstdint>
Expand All @@ -43,8 +49,7 @@ namespace detail {
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
constexpr auto from_chars_general_impl(const char* first, const char* last, TargetDecimalType& value, chars_format fmt) noexcept -> from_chars_result
{
using significand_type = std::conditional_t<std::is_same<TargetDecimalType, decimal128>::value ||
std::is_same<TargetDecimalType, decimal128_fast>::value, detail::uint128, std::uint64_t>;
using significand_type = std::conditional_t<std::is_same<typename TargetDecimalType::significand_type, uint128>::value, uint128, std::uint64_t>;

if (first >= last)
{
Expand Down Expand Up @@ -93,106 +98,28 @@ constexpr auto from_chars_general_impl(const char* first, const char* last, Targ

} //namespace detail

BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal32& value, chars_format fmt = chars_format::general) noexcept
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, TargetDecimalType& value, chars_format fmt = chars_format::general) noexcept -> from_chars_result
{
return detail::from_chars_general_impl(first, last, value, fmt);
}

#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
BOOST_DECIMAL_EXPORT inline auto from_chars(const std::string& str, decimal32& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#else
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal32& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#endif

BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal32_fast& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(first, last, value, fmt);
}

#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
BOOST_DECIMAL_EXPORT inline auto from_chars(const std::string& str, decimal32_fast& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#else
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal32_fast& value, chars_format fmt = chars_format::general) noexcept
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
BOOST_DECIMAL_EXPORT constexpr auto from_chars(const std::string& str, TargetDecimalType& value, chars_format fmt = chars_format::general) noexcept -> from_chars_result
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#endif

BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal64& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(first, last, value, fmt);
}

#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
BOOST_DECIMAL_EXPORT inline auto from_chars(const std::string& str, decimal64& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#else
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal64& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#endif

BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal64_fast& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(first, last, value, fmt);
}

#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
BOOST_DECIMAL_EXPORT inline auto from_chars(const std::string& str, decimal64_fast& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#else
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal64_fast& value, chars_format fmt = chars_format::general) noexcept
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, TargetDecimalType& value, chars_format fmt = chars_format::general) noexcept -> from_chars_result
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#endif

BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal128& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(first, last, value, fmt);
}

#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
BOOST_DECIMAL_EXPORT inline auto from_chars(const std::string& str, decimal128& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#else
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal128& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#endif

BOOST_DECIMAL_EXPORT constexpr auto from_chars(const char* first, const char* last, decimal128_fast& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(first, last, value, fmt);
}

#ifndef BOOST_DECIMAL_HAS_STD_STRING_VIEW
BOOST_DECIMAL_EXPORT inline auto from_chars(const std::string& str, decimal128_fast& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#else
BOOST_DECIMAL_EXPORT constexpr auto from_chars(std::string_view str, decimal128_fast& value, chars_format fmt = chars_format::general) noexcept
{
return detail::from_chars_general_impl(str.data(), str.data() + str.size(), value, fmt);
}
#endif

#ifdef BOOST_DECIMAL_HAS_STD_CHARCONV
Expand Down Expand Up @@ -361,7 +288,7 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_scientific_impl(char* first, char* last, c
int exp {};
auto significand {frexp10(value, &exp)};

using uint_type = std::conditional_t<std::is_same<TargetDecimalType, decimal128>::value || std::is_same<TargetDecimalType, decimal128_fast>::value, uint128, std::uint64_t>;
using uint_type = std::conditional_t<std::is_same<typename TargetDecimalType::significand_type, uint128>::value, uint128, std::uint64_t>;
auto significand_digits = num_digits(significand);
exp += significand_digits - 1;
bool append_zeros = false;
Expand Down Expand Up @@ -599,8 +526,7 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_fixed_impl(char* first, char* last, const
}
}

using uint_type = std::conditional_t<std::is_same<TargetDecimalType, decimal128>::value ||
std::is_same<TargetDecimalType, decimal128_fast>::value, uint128, std::uint64_t>;
using uint_type = std::conditional_t<std::is_same<typename TargetDecimalType::significand_type, uint128>::value, uint128, std::uint64_t>;
auto r = to_chars_integer_impl<uint_type, uint_type>(first, last, significand, 10);

if (BOOST_DECIMAL_UNLIKELY(!r))
Expand Down Expand Up @@ -711,8 +637,7 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_fixed_impl(char* first, char* last, const
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
BOOST_DECIMAL_CONSTEXPR auto to_chars_hex_impl(char* first, char* last, const TargetDecimalType& value, int precision = -1) noexcept -> to_chars_result
{
using Unsigned_Integer = std::conditional_t<std::is_same<TargetDecimalType, decimal128>::value ||
std::is_same<TargetDecimalType, decimal128_fast>::value, uint128, std::uint64_t>;
using Unsigned_Integer = std::conditional_t<std::is_same<typename TargetDecimalType::significand_type, uint128>::value, uint128, std::uint64_t>;

if (signbit(value))
{
Expand Down Expand Up @@ -855,9 +780,9 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_impl(char* first, char* last, TargetDecima
}

auto abs_value = abs(value);
constexpr auto max_fractional_value = std::is_same<TargetDecimalType, decimal32>::value || std::is_same<TargetDecimalType, decimal32_fast>::value ? TargetDecimalType{1, 7} :
std::is_same<TargetDecimalType, decimal64>::value || std::is_same<TargetDecimalType, decimal64_fast>::value ? TargetDecimalType{1, 16} :
TargetDecimalType{1, 34};
constexpr auto max_fractional_value = impl::decimal_val_v<TargetDecimalType> < 64 ? TargetDecimalType{1, 7} :
impl::decimal_val_v<TargetDecimalType> < 128 ? TargetDecimalType{1, 16} :
TargetDecimalType{1, 34};

constexpr auto min_fractional_value = TargetDecimalType{1, -4};

Expand Down Expand Up @@ -916,117 +841,20 @@ BOOST_DECIMAL_CONSTEXPR auto to_chars_impl(char* first, char* last, TargetDecima

} //namespace detail

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal32 value) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal32 value, chars_format fmt) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value, fmt);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal32 value, chars_format fmt, int precision) noexcept -> to_chars_result
{
if (precision < 0)
{
precision = 6;
}

return detail::to_chars_impl(first, last, value, fmt, precision);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal32_fast value) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal32_fast value, chars_format fmt) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value, fmt);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal32_fast value, chars_format fmt, int precision) noexcept -> to_chars_result
{
if (precision < 0)
{
precision = 6;
}

return detail::to_chars_impl(first, last, value, fmt, precision);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal64 value) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal64 value, chars_format fmt) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value, fmt);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal64 value, chars_format fmt, int precision) noexcept -> to_chars_result
{
if (precision < 0)
{
precision = 6;
}

return detail::to_chars_impl(first, last, value, fmt, precision);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal64_fast value) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal64_fast value, chars_format fmt) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value, fmt);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal64_fast value, chars_format fmt, int precision) noexcept -> to_chars_result
{
if (precision < 0)
{
precision = 6;
}

return detail::to_chars_impl(first, last, value, fmt, precision);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal128 value) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal128 value, chars_format fmt) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value, fmt);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal128 value, chars_format fmt, int precision) noexcept -> to_chars_result
{
if (precision < 0)
{
precision = 6;
}

return detail::to_chars_impl(first, last, value, fmt, precision);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal128_fast value) noexcept -> to_chars_result
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, TargetDecimalType value) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal128_fast value, chars_format fmt) noexcept -> to_chars_result
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, TargetDecimalType value, chars_format fmt) noexcept -> to_chars_result
{
return detail::to_chars_impl(first, last, value, fmt);
}

BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, decimal128_fast value, chars_format fmt, int precision) noexcept -> to_chars_result
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE TargetDecimalType>
BOOST_DECIMAL_EXPORT BOOST_DECIMAL_CONSTEXPR auto to_chars(char* first, char* last, TargetDecimalType value, chars_format fmt, int precision) noexcept -> to_chars_result
{
if (precision < 0)
{
Expand Down
6 changes: 6 additions & 0 deletions include/boost/decimal/cstdio.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
#ifndef BOOST_DECIMAL_CSTDIO_HPP
#define BOOST_DECIMAL_CSTDIO_HPP

#include <boost/decimal/decimal32.hpp>
#include <boost/decimal/decimal64.hpp>
#include <boost/decimal/decimal128.hpp>
#include <boost/decimal/decimal32_fast.hpp>
#include <boost/decimal/decimal64_fast.hpp>
#include <boost/decimal/decimal128_fast.hpp>
#include <boost/decimal/detail/config.hpp>
#include <boost/decimal/detail/locale_conversion.hpp>
#include <boost/decimal/detail/parser.hpp>
Expand Down
7 changes: 6 additions & 1 deletion include/boost/decimal/cstdlib.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
#ifndef BOOST_DECIMAL_CSTDLIB_HPP
#define BOOST_DECIMAL_CSTDLIB_HPP

#include <boost/decimal/fwd.hpp>
#include <boost/decimal/decimal32.hpp>
#include <boost/decimal/decimal64.hpp>
#include <boost/decimal/decimal128.hpp>
#include <boost/decimal/decimal32_fast.hpp>
#include <boost/decimal/decimal64_fast.hpp>
#include <boost/decimal/decimal128_fast.hpp>
#include <boost/decimal/detail/config.hpp>
#include <boost/decimal/detail/parser.hpp>
#include <boost/decimal/detail/utilities.hpp>
Expand Down
8 changes: 8 additions & 0 deletions include/boost/decimal/detail/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@
#ifndef BOOST_DECIMAL_DETAIL_CONFIG_HPP
#define BOOST_DECIMAL_DETAIL_CONFIG_HPP

// 3.4.7 evaluation format:
// This is defined at top level because it has ramifications for every successive header
//
// We add an extra definition here in case users want to pick and choose headers
#ifndef BOOST_DECIMAL_DEC_EVAL_METHOD
# define BOOST_DECIMAL_DEC_EVAL_METHOD 0
#endif

// Determine endianness
#if defined(_WIN32)

Expand Down
1 change: 0 additions & 1 deletion include/boost/decimal/detail/io.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include <boost/decimal/detail/parser.hpp>
#include <boost/decimal/detail/attributes.hpp>
#include <boost/decimal/detail/fenv_rounding.hpp>
#include <boost/decimal/detail/to_string.hpp>
#include <boost/decimal/detail/concepts.hpp>
#include <boost/decimal/detail/locale_conversion.hpp>
#include <boost/decimal/charconv.hpp>
Expand Down
6 changes: 6 additions & 0 deletions include/boost/decimal/dpd_conversion.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
#ifndef BOOST_DECIMAL_DPD_CONVERSION_HPP
#define BOOST_DECIMAL_DPD_CONVERSION_HPP

#include <boost/decimal/decimal32.hpp>
#include <boost/decimal/decimal64.hpp>
#include <boost/decimal/decimal128.hpp>
#include <boost/decimal/decimal32_fast.hpp>
#include <boost/decimal/decimal64_fast.hpp>
#include <boost/decimal/decimal128_fast.hpp>
#include <boost/decimal/bid_conversion.hpp>
#include <boost/decimal/detail/config.hpp>
#include <boost/decimal/detail/concepts.hpp>
Expand Down
Loading
Loading