1a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//===------------------------- string.cpp ---------------------------------===//
2a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//
3a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//                     The LLVM Compiler Infrastructure
4a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//
8a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//===----------------------------------------------------------------------===//
9a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
1004a2c71d674a261e65d5afc603b7a3efa77e88efHoward Hinnant#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
1104a2c71d674a261e65d5afc603b7a3efa77e88efHoward Hinnant
12a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "string"
13a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "cstdlib"
14a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "cwchar"
15a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "cerrno"
169e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include "limits"
179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include "stdexcept"
18e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#ifdef _LIBCPP_MSVCRT
196cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#include "support/win32/support.h"
20e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // _LIBCPP_MSVCRT
21ed14a76beba8f2a0e30f5c66d327d60f87a75921Howard Hinnant#include <stdio.h>
22a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
23a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
24a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
25a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate class __basic_string_common<true>;
26a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
27a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate class basic_string<char>;
28a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate class basic_string<wchar_t>;
29a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
30a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate
31a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    string
32a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
33a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantnamespace
359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
369e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename T>
389e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantvoid throw_helper( const string& msg )
409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    throw T( msg );
439e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#else
44ed14a76beba8f2a0e30f5c66d327d60f87a75921Howard Hinnant    printf("%s\n", msg.c_str());
459e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    abort();
469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#endif
479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
489e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantvoid throw_from_string_out_of_range( const string& func )
519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    throw_helper<out_of_range>(func + ": out of range");
539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantvoid throw_from_string_invalid_arg( const string& func )
579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    throw_helper<invalid_argument>(func + ": no conversion");
599e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
619e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// as_integer
629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S, typename F>
649e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
659e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV
669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer_helper(const string& func, const S& str, size_t* idx, int base, F f)
67a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    typename S::value_type* ptr;
699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    const typename S::value_type* const p = str.c_str();
7054e2fff2e1e3b2b4c317651bbbf1aadc27b1e378Howard Hinnant    typename remove_reference<decltype(errno)>::type errno_save = errno;
713e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant    errno = 0;
729e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    V r = f(p, &ptr, base);
733e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant    swap(errno, errno_save);
749e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    if (errno_save == ERANGE)
759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        throw_from_string_out_of_range(func);
763e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant    if (ptr == p)
779e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        throw_from_string_invalid_arg(func);
78a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    if (idx)
79a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        *idx = static_cast<size_t>(ptr - p);
809e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return r;
819e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
829e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
839e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S>
849e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
859e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV
869e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer(const string& func, const S& s, size_t* idx, int base);
879e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
889e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// string
899e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
909e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
919e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint
929e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer(const string& func, const string& s, size_t* idx, int base )
939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
94bd64f140d4ebac5324a03d75c6d5d9b114dafc6bJoerg Sonnenberger    // Use long as no Standard string to integer exists.
959e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    long r = as_integer_helper<long>( func, s, idx, base, strtol );
969e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
979e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        throw_from_string_out_of_range(func);
98a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    return static_cast<int>(r);
99a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
100a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
1019e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1029e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong
1049e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer(const string& func, const string& s, size_t* idx, int base )
1059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1069e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<long>( func, s, idx, base, strtol );
1079e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1099e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1109e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1119e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long
1129e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const string& s, size_t* idx, int base )
1139e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1149e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<unsigned long>( func, s, idx, base, strtoul );
1159e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1169e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1199e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong long
1209e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const string& s, size_t* idx, int base )
1219e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1229e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<long long>( func, s, idx, base, strtoll );
1239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1249e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1279e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long long
1289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const string& s, size_t* idx, int base )
1299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1309e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull );
1319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1329e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1339e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// wstring
1349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
136a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantint
1379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base )
138a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
1399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    // Use long as no Stantard string to integer exists.
1409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    long r = as_integer_helper<long>( func, s, idx, base, wcstol );
1419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
1429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        throw_from_string_out_of_range(func);
143a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    return static_cast<int>(r);
144a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
145a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
1469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
148a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong
1499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base )
1509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<long>( func, s, idx, base, wcstol );
1529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long
1579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base )
1589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1599e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<unsigned long>( func, s, idx, base, wcstoul );
1609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1619e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1649e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong long
1659e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base )
1669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1679e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<long long>( func, s, idx, base, wcstoll );
1689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1709e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
1719e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1729e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long long
1739e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base )
1749e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
1759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull );
1769e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
1779e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1789e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// as_float
1799e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
1809e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S, typename F>
1819e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
1829e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV
1839e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float_helper(const string& func, const S& str, size_t* idx, F f )
184a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
1859e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    typename S::value_type* ptr;
1869e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    const typename S::value_type* const p = str.c_str();
18754e2fff2e1e3b2b4c317651bbbf1aadc27b1e378Howard Hinnant    typename remove_reference<decltype(errno)>::type errno_save = errno;
1883e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant    errno = 0;
1899e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    V r = f(p, &ptr);
1903e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant    swap(errno, errno_save);
1913e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant    if (errno_save == ERANGE)
1929e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        throw_from_string_out_of_range(func);
1933e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant    if (ptr == p)
1949e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        throw_from_string_invalid_arg(func);
195a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    if (idx)
196a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        *idx = static_cast<size_t>(ptr - p);
197a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    return r;
198a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
199a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
2009e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S>
2019e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
2029e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV as_float( const string& func, const S& s, size_t* idx = nullptr );
2039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2049e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
2059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
2069e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantfloat
2079e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const string& s, size_t* idx )
2089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2099e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float_helper<float>( func, s, idx, strtof );
2109e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2119e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2129e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
2139e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
2149e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantdouble
2159e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float(const string& func, const string& s, size_t* idx )
2169e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float_helper<double>( func, s, idx, strtod );
2189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2199e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2209e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
2219e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
2229e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong double
2239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const string& s, size_t* idx )
2249e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float_helper<long double>( func, s, idx, strtold );
2269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2279e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
2299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
2309e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantfloat
2319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const wstring& s, size_t* idx )
2329e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2339e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float_helper<float>( func, s, idx, wcstof );
2349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2369e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
2379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
2389e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantdouble
2399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const wstring& s, size_t* idx )
2409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float_helper<double>( func, s, idx, wcstod );
2429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2439e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2449e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<>
2459e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
2469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong double
2479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const wstring& s, size_t* idx )
2489e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float_helper<long double>( func, s, idx, wcstold );
2509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}  // unnamed namespace
2539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint
2559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstoi(const string& str, size_t* idx, int base)
2569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<int>( "stoi", str, idx, base );
2589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2599e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint
2619e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstoi(const wstring& str, size_t* idx, int base)
2629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<int>( "stoi", str, idx, base );
2649e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2659e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
2669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong
2679e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstol(const string& str, size_t* idx, int base)
2689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
2699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<long>( "stol", str, idx, base );
2709e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
2719e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
272a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong
273a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstol(const wstring& str, size_t* idx, int base)
274a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
2759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<long>( "stol", str, idx, base );
276a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
277a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
278a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long
279a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoul(const string& str, size_t* idx, int base)
280a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
2819e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<unsigned long>( "stoul", str, idx, base );
282a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
283a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
284a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long
285a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoul(const wstring& str, size_t* idx, int base)
286a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
2879e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<unsigned long>( "stoul", str, idx, base );
288a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
289a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
290a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong long
291a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoll(const string& str, size_t* idx, int base)
292a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
2939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<long long>( "stoll", str, idx, base );
294a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
295a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
296a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong long
297a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoll(const wstring& str, size_t* idx, int base)
298a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
2999e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<long long>( "stoll", str, idx, base );
300a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
301a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
302a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long long
303a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoull(const string& str, size_t* idx, int base)
304a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<unsigned long long>( "stoull", str, idx, base );
306a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
307a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
308a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long long
309a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoull(const wstring& str, size_t* idx, int base)
310a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3119e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_integer<unsigned long long>( "stoull", str, idx, base );
312a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
313a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
314a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantfloat
315a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstof(const string& str, size_t* idx)
316a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float<float>( "stof", str, idx );
318a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
319a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
320a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantfloat
321a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstof(const wstring& str, size_t* idx)
322a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float<float>( "stof", str, idx );
324a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
325a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
326a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantdouble
327a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstod(const string& str, size_t* idx)
328a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float<double>( "stod", str, idx );
330a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
331a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
332a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantdouble
333a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstod(const wstring& str, size_t* idx)
334a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float<double>( "stod", str, idx );
336a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
337a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
338a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong double
339a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstold(const string& str, size_t* idx)
340a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float<long double>( "stold", str, idx );
342a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
343a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
344a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong double
345a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstold(const wstring& str, size_t* idx)
346a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_float<long double>( "stold", str, idx );
348a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
349a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
3509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// to_string
3519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
3529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantnamespace
3539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
3549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
3559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// as_string
3569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
3579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename S, typename P, typename V >
3589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
3599e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantS
3609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_string(P sprintf_like, S s, const typename S::value_type* fmt, V a)
361a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    typedef typename S::size_type size_type;
3639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    size_type available = s.size();
364a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    while (true)
365a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
3669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        int status = sprintf_like(&s[0], available + 1, fmt, a);
3679e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        if ( status >= 0 )
368a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        {
3699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant            size_type used = static_cast<size_type>(status);
3709e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant            if ( used <= available )
3719e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant            {
3729e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant                s.resize( used );
3739e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant                break;
3749e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant            }
3759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant            available = used; // Assume this is advice of how much space we need.
376a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        }
3779e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        else
3789e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant            available = available * 2 + 1;
3799e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        s.resize(available);
380a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
381a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    return s;
382a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
383a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
3849e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class S, class V, bool = is_floating_point<V>::value>
3859e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string;
3869e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
3879e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class V, bool b>
3889e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string<string, V, b>
389a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
3909e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    string
3919e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    operator()() const
392a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
3939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        string s;
3949e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        s.resize(s.capacity());
3959e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        return s;
396a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
3979e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant};
398a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
3999e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class V>
4009e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string<wstring, V, false>
401a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4029e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    wstring
4039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    operator()() const
404a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
4059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        const size_t n = (numeric_limits<unsigned long long>::digits / 3)
4069e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant          + ((numeric_limits<unsigned long long>::digits % 3) != 0)
4079e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant          + 1;
4089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        wstring s(n, wchar_t());
4099e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        s.resize(s.capacity());
4109e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        return s;
411a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
4129e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant};
413a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
4149e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class V>
4159e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string<wstring, V, true>
416a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    wstring
4189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    operator()() const
419a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
4209e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        wstring s(20, wchar_t());
4219e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        s.resize(s.capacity());
4229e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant        return s;
423a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
4249e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant};
4259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
4269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttypedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...);
4279e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
4289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline
4299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantwide_printf
4309e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantget_swprintf()
4319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
432e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#ifndef _LIBCPP_MSVCRT
4339e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return swprintf;
4349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#else
4359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(swprintf);
4369e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#endif
4379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
4389e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
4399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}  // unnamed namespace
4409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
4419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(int val)
4429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
4439e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, int>()(), "%d", val);
4449e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
4459e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
4469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(unsigned val)
4479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
4489e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, unsigned>()(), "%u", val);
4499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
4509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
4519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(long val)
4529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
4539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, long>()(), "%ld", val);
4549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
4559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
4569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(unsigned long val)
4579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{
4589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, unsigned long>()(), "%lu", val);
459a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
460a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
461a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(long long val)
462a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, long long>()(), "%lld", val);
464a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
465a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
466a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(unsigned long long val)
467a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, unsigned long long>()(), "%llu", val);
469a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
470a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
471a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(float val)
472a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4739e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, float>()(), "%f", val);
474a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
475a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
476a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(double val)
477a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4789e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, double>()(), "%f", val);
479a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
480a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
481a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(long double val)
482a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4839e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(snprintf, initial_string<string, long double>()(), "%Lf", val);
484a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
485a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
486a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(int val)
487a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4889e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, int>()(), L"%d", val);
489a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
490a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
491a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(unsigned val)
492a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, unsigned>()(), L"%u", val);
494a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
495a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
496a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(long val)
497a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
4989e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, long>()(), L"%ld", val);
499a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
500a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
501a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(unsigned long val)
502a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
5039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, unsigned long>()(), L"%lu", val);
504a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
505a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
506a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(long long val)
507a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
5089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, long long>()(), L"%lld", val);
509a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
510a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
511a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(unsigned long long val)
512a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
5139e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, unsigned long long>()(), L"%llu", val);
514a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
515a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
516a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(float val)
517a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
5189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, float>()(), L"%f", val);
519a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
520a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
521a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(double val)
522a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
5239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, double>()(), L"%f", val);
524a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
525a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
526a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(long double val)
527a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
5289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant    return as_string(get_swprintf(), initial_string<wstring, long double>()(), L"%Lf", val);
529a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
530a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant_LIBCPP_END_NAMESPACE_STD
531