//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <__assert>
#include <cerrno>
#include <charconv>
#include <cstdlib>
#include <limits>
#include <stdexcept>
#include <stdio.h>
#include <string>

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
#  include <cwchar>
#endif

_LIBCPP_BEGIN_NAMESPACE_STD

#ifndef _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON

template <bool>
struct __basic_string_common;

// The struct isn't declared anymore in the headers. It's only here for ABI compatibility.
template <>
struct __basic_string_common<true> {
    _LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_length_error() const;
    _LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_out_of_range() const;
};

void __basic_string_common<true>::__throw_length_error() const {
    std::__throw_length_error("basic_string");
}
void __basic_string_common<true>::__throw_out_of_range() const {
    std::__throw_out_of_range("basic_string");
}

#endif // _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON

#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__;
#ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
    _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
        _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
#   endif
#else
    _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
        _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
#   endif
#endif
#undef _LIBCPP_EXTERN_TEMPLATE_DEFINE

template string operator+<char, char_traits<char>, allocator<char>>(char const*, string const&);

namespace
{

template<typename T>
inline void throw_helper(const string& msg) {
#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
    throw T(msg);
#else
    fprintf(stderr, "%s\n", msg.c_str());
    _VSTD::abort();
#endif
}

inline void throw_from_string_out_of_range(const string& func) {
    throw_helper<out_of_range>(func + ": out of range");
}

inline void throw_from_string_invalid_arg(const string& func) {
    throw_helper<invalid_argument>(func + ": no conversion");
}

// as_integer

template<typename V, typename S, typename F>
inline V as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f) {
    typename S::value_type* ptr = nullptr;
    const typename S::value_type* const p = str.c_str();
    __libcpp_remove_reference_t<decltype(errno)> errno_save = errno;
    errno = 0;
    V r = f(p, &ptr, base);
    swap(errno, errno_save);
    if (errno_save == ERANGE)
        throw_from_string_out_of_range(func);
    if (ptr == p)
        throw_from_string_invalid_arg(func);
    if (idx)
        *idx = static_cast<size_t>(ptr - p);
    return r;
}

template<typename V, typename S>
inline V as_integer(const string& func, const S& s, size_t* idx, int base);

// string
template<>
inline int as_integer(const string& func, const string& s, size_t* idx, int base) {
    // Use long as no Standard string to integer exists.
    long r = as_integer_helper<long>(func, s, idx, base, strtol);
    if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
        throw_from_string_out_of_range(func);
    return static_cast<int>(r);
}

template<>
inline long as_integer(const string& func, const string& s, size_t* idx, int base) {
    return as_integer_helper<long>(func, s, idx, base, strtol);
}

template<>
inline unsigned long as_integer(const string& func, const string& s, size_t* idx, int base) {
    return as_integer_helper<unsigned long>(func, s, idx, base, strtoul);
}

template<>
inline long long as_integer(const string& func, const string& s, size_t* idx, int base) {
    return as_integer_helper<long long>(func, s, idx, base, strtoll);
}

template<>
inline unsigned long long as_integer(const string& func, const string& s, size_t* idx, int base) {
    return as_integer_helper<unsigned long long>(func, s, idx, base, strtoull);
}

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
// wstring
template<>
inline int as_integer(const string& func, const wstring& s, size_t* idx, int base) {
    // Use long as no Stantard string to integer exists.
    long r = as_integer_helper<long>(func, s, idx, base, wcstol);
    if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
        throw_from_string_out_of_range(func);
    return static_cast<int>(r);
}

template<>
inline long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
    return as_integer_helper<long>(func, s, idx, base, wcstol);
}

template<>
inline
unsigned long
as_integer(const string& func, const wstring& s, size_t* idx, int base)
{
    return as_integer_helper<unsigned long>(func, s, idx, base, wcstoul);
}

template<>
inline long long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
    return as_integer_helper<long long>(func, s, idx, base, wcstoll);
}

template<>
inline unsigned long long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
    return as_integer_helper<unsigned long long>(func, s, idx, base, wcstoull);
}
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

// as_float

template<typename V, typename S, typename F>
inline V as_float_helper(const string& func, const S& str, size_t* idx, F f) {
    typename S::value_type* ptr = nullptr;
    const typename S::value_type* const p = str.c_str();
    __libcpp_remove_reference_t<decltype(errno)> errno_save = errno;
    errno = 0;
    V r = f(p, &ptr);
    swap(errno, errno_save);
    if (errno_save == ERANGE)
        throw_from_string_out_of_range(func);
    if (ptr == p)
        throw_from_string_invalid_arg(func);
    if (idx)
        *idx = static_cast<size_t>(ptr - p);
    return r;
}

template<typename V, typename S>
inline V as_float(const string& func, const S& s, size_t* idx = nullptr);

template<>
inline float as_float(const string& func, const string& s, size_t* idx) {
    return as_float_helper<float>(func, s, idx, strtof);
}

template<>
inline double as_float(const string& func, const string& s, size_t* idx) {
    return as_float_helper<double>(func, s, idx, strtod);
}

template<>
inline long double as_float(const string& func, const string& s, size_t* idx) {
    return as_float_helper<long double>(func, s, idx, strtold);
}

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
template<>
inline float as_float(const string& func, const wstring& s, size_t* idx) {
    return as_float_helper<float>(func, s, idx, wcstof);
}

template<>
inline double as_float(const string& func, const wstring& s, size_t* idx) {
    return as_float_helper<double>(func, s, idx, wcstod);
}

template<>
inline long double as_float(const string& func, const wstring& s, size_t* idx) {
    return as_float_helper<long double>(func, s, idx, wcstold);
}
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

}  // unnamed namespace

int stoi(const string& str, size_t* idx, int base) {
    return as_integer<int>("stoi", str, idx, base);
}

long stol(const string& str, size_t* idx, int base) {
    return as_integer<long>("stol", str, idx, base);
}

unsigned long stoul(const string& str, size_t* idx, int base) {
    return as_integer<unsigned long>("stoul", str, idx, base);
}

long long stoll(const string& str, size_t* idx, int base) {
    return as_integer<long long>("stoll", str, idx, base);
}

unsigned long long stoull(const string& str, size_t* idx, int base) {
    return as_integer<unsigned long long>("stoull", str, idx, base);
}

float stof(const string& str, size_t* idx) {
    return as_float<float>("stof", str, idx);
}

double stod(const string& str, size_t* idx) {
    return as_float<double>("stod", str, idx);
}

long double stold(const string& str, size_t* idx) {
    return as_float<long double>("stold", str, idx);
}

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
int stoi(const wstring& str, size_t* idx, int base) {
    return as_integer<int>("stoi", str, idx, base);
}

long stol(const wstring& str, size_t* idx, int base) {
    return as_integer<long>("stol", str, idx, base);
}

unsigned long stoul(const wstring& str, size_t* idx, int base) {
    return as_integer<unsigned long>("stoul", str, idx, base);
}

long long stoll(const wstring& str, size_t* idx, int base) {
    return as_integer<long long>("stoll", str, idx, base);
}

unsigned long long stoull(const wstring& str, size_t* idx, int base) {
    return as_integer<unsigned long long>("stoull", str, idx, base);
}

float stof(const wstring& str, size_t* idx) {
    return as_float<float>("stof", str, idx);
}

double stod(const wstring& str, size_t* idx) {
    return as_float<double>("stod", str, idx);
}

long double stold(const wstring& str, size_t* idx) {
    return as_float<long double>("stold", str, idx);
}
#endif // !_LIBCPP_HAS_NO_WIDE_CHARACTERS

// to_string

namespace
{

// as_string

template<typename S, typename P, typename V >
inline S as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) {
    typedef typename S::size_type size_type;
    size_type available = s.size();
    while (true) {
        int status = sprintf_like(&s[0], available + 1, fmt, a);
        if (status >= 0) {
            size_type used = static_cast<size_type>(status);
            if (used <= available) {
                s.resize(used);
                break;
            }
            available = used; // Assume this is advice of how much space we need.
        }
        else
            available = available * 2 + 1;
        s.resize(available);
    }
    return s;
}

template <class S>
struct initial_string;

template <>
struct initial_string<string> {
    string operator()() const {
        string s;
        s.resize(s.capacity());
        return s;
    }
};

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
template <>
struct initial_string<wstring> {
    wstring operator()() const {
        wstring s(20, wchar_t());
        s.resize(s.capacity());
        return s;
    }
};

typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...);

inline wide_printf get_swprintf() {
#ifndef _LIBCPP_MSVCRT
    return swprintf;
#else
    return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(_snwprintf);
#endif
}
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

template <typename S, typename V>
S i_to_string(V v) {
//  numeric_limits::digits10 returns value less on 1 than desired for unsigned numbers.
//  For example, for 1-byte unsigned value digits10 is 2 (999 can not be represented),
//  so we need +1 here.
    constexpr size_t bufsize = numeric_limits<V>::digits10 + 2;  // +1 for minus, +1 for digits10
    char buf[bufsize];
    const auto res = to_chars(buf, buf + bufsize, v);
    _LIBCPP_ASSERT(res.ec == errc(), "bufsize must be large enough to accomodate the value");
    return S(buf, res.ptr);
}

}  // unnamed namespace

string  to_string (int val)                { return i_to_string< string>(val); }
string  to_string (long val)               { return i_to_string< string>(val); }
string  to_string (long long val)          { return i_to_string< string>(val); }
string  to_string (unsigned val)           { return i_to_string< string>(val); }
string  to_string (unsigned long val)      { return i_to_string< string>(val); }
string  to_string (unsigned long long val) { return i_to_string< string>(val); }

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
wstring to_wstring(int val)                { return i_to_string<wstring>(val); }
wstring to_wstring(long val)               { return i_to_string<wstring>(val); }
wstring to_wstring(long long val)          { return i_to_string<wstring>(val); }
wstring to_wstring(unsigned val)           { return i_to_string<wstring>(val); }
wstring to_wstring(unsigned long val)      { return i_to_string<wstring>(val); }
wstring to_wstring(unsigned long long val) { return i_to_string<wstring>(val); }
#endif

string  to_string (float val)       { return as_string(snprintf,       initial_string< string>()(),   "%f", val); }
string  to_string (double val)      { return as_string(snprintf,       initial_string< string>()(),   "%f", val); }
string  to_string (long double val) { return as_string(snprintf,       initial_string< string>()(),  "%Lf", val); }

#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
wstring to_wstring(float val)       { return as_string(get_swprintf(), initial_string<wstring>()(),  L"%f", val); }
wstring to_wstring(double val)      { return as_string(get_swprintf(), initial_string<wstring>()(),  L"%f", val); }
wstring to_wstring(long double val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%Lf", val); }
#endif

_LIBCPP_END_NAMESPACE_STD
