xref: /llvm-project/libcxx/src/charconv.cpp (revision 08159e6e117f5717d30230cb6568d7f3686b2c86)
1eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
2d2748964SZhihao Yuan //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d2748964SZhihao Yuan //
7d2748964SZhihao Yuan //===----------------------------------------------------------------------===//
8d2748964SZhihao Yuan 
9bbb0f2c7SArthur O'Dwyer #include <charconv>
10d2748964SZhihao Yuan #include <string.h>
11d2748964SZhihao Yuan 
126c4267fbSMichael Jones #include "include/from_chars_floating_point.h"
13abb5dd6eSMark de Wever #include "include/to_chars_floating_point.h"
14abb5dd6eSMark de Wever 
15d2748964SZhihao Yuan _LIBCPP_BEGIN_NAMESPACE_STD
16d2748964SZhihao Yuan 
1789818f2dSMark de Wever #ifndef _LIBCPP_ABI_DO_NOT_EXPORT_TO_CHARS_BASE_10
1889818f2dSMark de Wever 
199783f28cSLouis Dionne namespace __itoa {
20d2748964SZhihao Yuan 
219783f28cSLouis Dionne _LIBCPP_EXPORTED_FROM_ABI char* __u32toa(uint32_t value, char* buffer) noexcept { return __base_10_u32(buffer, value); }
22d2748964SZhihao Yuan 
239783f28cSLouis Dionne _LIBCPP_EXPORTED_FROM_ABI char* __u64toa(uint64_t value, char* buffer) noexcept { return __base_10_u64(buffer, value); }
24d2748964SZhihao Yuan 
25d2748964SZhihao Yuan } // namespace __itoa
26d2748964SZhihao Yuan 
2789818f2dSMark de Wever #endif // _LIBCPP_ABI_DO_NOT_EXPORT_TO_CHARS_BASE_10
2889818f2dSMark de Wever 
29abb5dd6eSMark de Wever // The original version of floating-point to_chars was written by Microsoft and
30abb5dd6eSMark de Wever // contributed with the following license.
31abb5dd6eSMark de Wever 
32abb5dd6eSMark de Wever // Copyright (c) Microsoft Corporation.
33abb5dd6eSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
34abb5dd6eSMark de Wever 
35abb5dd6eSMark de Wever // This implementation is dedicated to the memory of Mary and Thavatchai.
36abb5dd6eSMark de Wever 
37abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, float __value) {
38abb5dd6eSMark de Wever   return _Floating_to_chars<_Floating_to_chars_overload::_Plain>(__first, __last, __value, chars_format{}, 0);
39abb5dd6eSMark de Wever }
40abb5dd6eSMark de Wever 
41abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, double __value) {
42abb5dd6eSMark de Wever   return _Floating_to_chars<_Floating_to_chars_overload::_Plain>(__first, __last, __value, chars_format{}, 0);
43abb5dd6eSMark de Wever }
44abb5dd6eSMark de Wever 
45abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, long double __value) {
469783f28cSLouis Dionne   return _Floating_to_chars<_Floating_to_chars_overload::_Plain>(
479783f28cSLouis Dionne       __first, __last, static_cast<double>(__value), chars_format{}, 0);
48abb5dd6eSMark de Wever }
49abb5dd6eSMark de Wever 
50abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, float __value, chars_format __fmt) {
51abb5dd6eSMark de Wever   return _Floating_to_chars<_Floating_to_chars_overload::_Format_only>(__first, __last, __value, __fmt, 0);
52abb5dd6eSMark de Wever }
53abb5dd6eSMark de Wever 
54abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, double __value, chars_format __fmt) {
55abb5dd6eSMark de Wever   return _Floating_to_chars<_Floating_to_chars_overload::_Format_only>(__first, __last, __value, __fmt, 0);
56abb5dd6eSMark de Wever }
57abb5dd6eSMark de Wever 
58abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, long double __value, chars_format __fmt) {
599783f28cSLouis Dionne   return _Floating_to_chars<_Floating_to_chars_overload::_Format_only>(
609783f28cSLouis Dionne       __first, __last, static_cast<double>(__value), __fmt, 0);
61abb5dd6eSMark de Wever }
62abb5dd6eSMark de Wever 
63abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, float __value, chars_format __fmt, int __precision) {
649783f28cSLouis Dionne   return _Floating_to_chars<_Floating_to_chars_overload::_Format_precision>(
659783f28cSLouis Dionne       __first, __last, __value, __fmt, __precision);
66abb5dd6eSMark de Wever }
67abb5dd6eSMark de Wever 
68abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, double __value, chars_format __fmt, int __precision) {
699783f28cSLouis Dionne   return _Floating_to_chars<_Floating_to_chars_overload::_Format_precision>(
709783f28cSLouis Dionne       __first, __last, __value, __fmt, __precision);
71abb5dd6eSMark de Wever }
72abb5dd6eSMark de Wever 
73abb5dd6eSMark de Wever to_chars_result to_chars(char* __first, char* __last, long double __value, chars_format __fmt, int __precision) {
74abb5dd6eSMark de Wever   return _Floating_to_chars<_Floating_to_chars_overload::_Format_precision>(
75abb5dd6eSMark de Wever       __first, __last, static_cast<double>(__value), __fmt, __precision);
76abb5dd6eSMark de Wever }
77abb5dd6eSMark de Wever 
786c4267fbSMichael Jones template <class _Fp>
796c4267fbSMichael Jones __from_chars_result<_Fp> __from_chars_floating_point(
80*08159e6eSA. Jiang     _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt) {
816c4267fbSMichael Jones   return std::__from_chars_floating_point_impl<_Fp>(__first, __last, __fmt);
826c4267fbSMichael Jones }
836c4267fbSMichael Jones 
846c4267fbSMichael Jones template __from_chars_result<float> __from_chars_floating_point(
85*08159e6eSA. Jiang     _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt);
866c4267fbSMichael Jones 
876c4267fbSMichael Jones template __from_chars_result<double> __from_chars_floating_point(
88*08159e6eSA. Jiang     _LIBCPP_NOESCAPE const char* __first, _LIBCPP_NOESCAPE const char* __last, chars_format __fmt);
89d2748964SZhihao Yuan _LIBCPP_END_NAMESPACE_STD
90