xref: /freebsd/contrib/llvm-project/libcxx/include/charconv (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_CHARCONV
110b57cec5SDimitry Andric#define _LIBCPP_CHARCONV
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    charconv synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std {
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric  // floating-point format for primitive numerical conversion
190b57cec5SDimitry Andric  enum class chars_format {
200b57cec5SDimitry Andric    scientific = unspecified,
210b57cec5SDimitry Andric    fixed = unspecified,
220b57cec5SDimitry Andric    hex = unspecified,
230b57cec5SDimitry Andric    general = fixed | scientific
240b57cec5SDimitry Andric  };
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric  // 23.20.2, primitive numerical output conversion
270b57cec5SDimitry Andric  struct to_chars_result {
280b57cec5SDimitry Andric    char* ptr;
290b57cec5SDimitry Andric    errc ec;
30349cc55cSDimitry Andric    friend bool operator==(const to_chars_result&, const to_chars_result&) = default; // since C++20
315f757f3fSDimitry Andric    constexpr explicit operator bool() const noexcept { return ec == errc{}; }        // since C++26
320b57cec5SDimitry Andric  };
330b57cec5SDimitry Andric
34bdd1243dSDimitry Andric  constexpr to_chars_result to_chars(char* first, char* last, see below value,
35bdd1243dSDimitry Andric                                     int base = 10);                                  // constexpr since C++23
36349cc55cSDimitry Andric  to_chars_result to_chars(char* first, char* last, bool value,
37349cc55cSDimitry Andric                           int base = 10) = delete;
380b57cec5SDimitry Andric
390b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, float value);
400b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, double value);
410b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, long double value);
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, float value,
440b57cec5SDimitry Andric                           chars_format fmt);
450b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, double value,
460b57cec5SDimitry Andric                           chars_format fmt);
470b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, long double value,
480b57cec5SDimitry Andric                           chars_format fmt);
490b57cec5SDimitry Andric
500b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, float value,
510b57cec5SDimitry Andric                           chars_format fmt, int precision);
520b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, double value,
530b57cec5SDimitry Andric                           chars_format fmt, int precision);
540b57cec5SDimitry Andric  to_chars_result to_chars(char* first, char* last, long double value,
550b57cec5SDimitry Andric                           chars_format fmt, int precision);
560b57cec5SDimitry Andric
570b57cec5SDimitry Andric  // 23.20.3, primitive numerical input conversion
580b57cec5SDimitry Andric  struct from_chars_result {
590b57cec5SDimitry Andric    const char* ptr;
600b57cec5SDimitry Andric    errc ec;
61349cc55cSDimitry Andric    friend bool operator==(const from_chars_result&, const from_chars_result&) = default; // since C++20
625f757f3fSDimitry Andric    constexpr explicit operator bool() const noexcept { return ec == errc{}; }            // since C++26
630b57cec5SDimitry Andric  };
640b57cec5SDimitry Andric
65bdd1243dSDimitry Andric  constexpr from_chars_result from_chars(const char* first, const char* last,
66bdd1243dSDimitry Andric                               see below& value, int base = 10);                         // constexpr since C++23
670b57cec5SDimitry Andric
680b57cec5SDimitry Andric} // namespace std
690b57cec5SDimitry Andric
700b57cec5SDimitry Andric*/
710b57cec5SDimitry Andric
72*0fca6ea1SDimitry Andric#include <__config>
73*0fca6ea1SDimitry Andric
74*0fca6ea1SDimitry Andric#if _LIBCPP_STD_VER >= 17
75349cc55cSDimitry Andric#  include <__charconv/chars_format.h>
7606c3fb27SDimitry Andric#  include <__charconv/from_chars_integral.h>
77349cc55cSDimitry Andric#  include <__charconv/from_chars_result.h>
7881ad6265SDimitry Andric#  include <__charconv/tables.h>
7906c3fb27SDimitry Andric#  include <__charconv/to_chars.h>
8081ad6265SDimitry Andric#  include <__charconv/to_chars_base_10.h>
8106c3fb27SDimitry Andric#  include <__charconv/to_chars_floating_point.h>
8206c3fb27SDimitry Andric#  include <__charconv/to_chars_integral.h>
83349cc55cSDimitry Andric#  include <__charconv/to_chars_result.h>
8406c3fb27SDimitry Andric#  include <__charconv/traits.h>
85*0fca6ea1SDimitry Andric#endif // _LIBCPP_STD_VER >= 17
86*0fca6ea1SDimitry Andric
875f757f3fSDimitry Andric#include <version>
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
900b57cec5SDimitry Andric#  pragma GCC system_header
910b57cec5SDimitry Andric#endif
920b57cec5SDimitry Andric
930b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
940b57cec5SDimitry Andric
950b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
960b57cec5SDimitry Andric
97*0fca6ea1SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 14
98*0fca6ea1SDimitry Andric#  include <cerrno>
99*0fca6ea1SDimitry Andric#  include <cstddef>
100*0fca6ea1SDimitry Andric#  include <initializer_list>
101*0fca6ea1SDimitry Andric#  include <new>
102*0fca6ea1SDimitry Andric#endif
103*0fca6ea1SDimitry Andric
104bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1055f757f3fSDimitry Andric#  include <cmath>
106bdd1243dSDimitry Andric#  include <concepts>
1075f757f3fSDimitry Andric#  include <cstdint>
10806c3fb27SDimitry Andric#  include <cstdlib>
10906c3fb27SDimitry Andric#  include <cstring>
110bdd1243dSDimitry Andric#  include <iosfwd>
1115f757f3fSDimitry Andric#  include <limits>
11206c3fb27SDimitry Andric#  include <type_traits>
113bdd1243dSDimitry Andric#endif
114bdd1243dSDimitry Andric
1150b57cec5SDimitry Andric#endif // _LIBCPP_CHARCONV
116