#ifndef _STRING_CONVERSIONS_H
#define _STRING_CONVERSIONS_H 1
#pragma GCC system_header
#include <ext/numeric_traits.h>
#include <bits/functexcept.h>
#include <cstddef>
#include <cstdlib>
#include <cwchar>
#include <cstdio>
#include <cerrno>
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
template<typename _TRet, typename _Ret = _TRet, typename _CharT,
typename... _Base>
_Ret
__stoa(_TRet (*__convf) (const _CharT*, _CharT**, _Base...),
const char* __name, const _CharT* __str, std::size_t* __idx,
_Base... __base)
{
_Ret __ret;
_CharT* __endptr;
errno = 0;
const _TRet __tmp = __convf(__str, &__endptr, __base...);
if (__endptr == __str)
std::__throw_invalid_argument(__name);
else if (errno == ERANGE
|| (std::__are_same<_Ret, int>::__value
&& (__tmp < __numeric_traits<int>::__min
|| __tmp > __numeric_traits<int>::__max)))
std::__throw_out_of_range(__name);
else
__ret = __tmp;
if (__idx)
*__idx = __endptr - __str;
return __ret;
}
template<typename _String, typename _CharT = typename _String::value_type>
_String
__to_xstring(int (*__convf) (_CharT*, std::size_t, const _CharT*,
__builtin_va_list), std::size_t __n,
const _CharT* __fmt, ...)
{
_CharT* __s = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __n));
__builtin_va_list __args;
__builtin_va_start(__args, __fmt);
const int __len = __convf(__s, __n, __fmt, __args);
__builtin_va_end(__args);
return _String(__s, __s + __len);
}
_GLIBCXX_END_NAMESPACE
#endif