diff options
-rw-r--r-- | libcxx/include/string | 136 | ||||
-rw-r--r-- | libcxx/include/thread | 4 | ||||
-rwxr-xr-x | libcxx/lib/buildit | 2 | ||||
-rw-r--r-- | libcxx/src/ios.cpp | 55 | ||||
-rw-r--r-- | libcxx/src/string.cpp | 690 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stod.pass.cpp | 166 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stof.pass.cpp | 166 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stoi.pass.cpp | 108 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stol.pass.cpp | 89 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stold.pass.cpp | 168 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stoll.pass.cpp | 89 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stoul.pass.cpp | 87 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/stoull.pass.cpp | 88 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/to_string.pass.cpp | 126 | ||||
-rw-r--r-- | libcxx/test/strings/string.conversions/to_wstring.pass.cpp | 126 | ||||
-rw-r--r-- | libcxx/test/strings/strings.general/nothing_to_do.pass.cpp | 13 |
16 files changed, 2037 insertions, 76 deletions
diff --git a/libcxx/include/string b/libcxx/include/string index 15713f07f52..3428fb84028 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -95,12 +95,14 @@ public: explicit basic_string(const allocator_type& a = allocator_type()); basic_string(const basic_string& str); basic_string(basic_string&& str); - basic_string(const basic_string& str, size_type pos, size_type n = npos, const allocator_type& a = allocator_type()); + basic_string(const basic_string& str, size_type pos, size_type n = npos, + const allocator_type& a = allocator_type()); basic_string(const_pointer s, const allocator_type& a = allocator_type()); basic_string(const_pointer s, size_type n, const allocator_type& a = allocator_type()); basic_string(size_type n, value_type c, const allocator_type& a = allocator_type()); template<class InputIterator> - basic_string(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()); + basic_string(InputIterator begin, InputIterator end, + const allocator_type& a = allocator_type()); basic_string(initializer_list<value_type>, const Allocator& = Allocator()); basic_string(const basic_string&, const Allocator&); basic_string(basic_string&&, const Allocator&); @@ -156,7 +158,8 @@ public: basic_string& append(const_pointer s, size_type n); basic_string& append(const_pointer s); basic_string& append(size_type n, value_type c); - template<class InputIterator> basic_string& append(InputIterator first, InputIterator last); + template<class InputIterator> + basic_string& append(InputIterator first, InputIterator last); basic_string& append(initializer_list<value_type>); void push_back(value_type c); @@ -171,17 +174,20 @@ public: basic_string& assign(const_pointer s, size_type n); basic_string& assign(const_pointer s); basic_string& assign(size_type n, value_type c); - template<class InputIterator> basic_string& assign(InputIterator first, InputIterator last); + template<class InputIterator> + basic_string& assign(InputIterator first, InputIterator last); basic_string& assign(initializer_list<value_type>); basic_string& insert(size_type pos1, const basic_string& str); - basic_string& insert(size_type pos1, const basic_string& str, size_type pos2, size_type n); + basic_string& insert(size_type pos1, const basic_string& str, + size_type pos2, size_type n); basic_string& insert(size_type pos, const_pointer s, size_type n); basic_string& insert(size_type pos, const_pointer s); basic_string& insert(size_type pos, size_type n, value_type c); iterator insert(const_iterator p, value_type c); iterator insert(const_iterator p, size_type n, value_type c); - template<class InputIterator> iterator insert(const_iterator p, InputIterator first, InputIterator last); + template<class InputIterator> + iterator insert(const_iterator p, InputIterator first, InputIterator last); iterator insert(const_iterator p, initializer_list<value_type>); basic_string& erase(size_type pos = 0, size_type n = npos); @@ -189,7 +195,8 @@ public: iterator erase(const_iterator first, const_iterator last); basic_string& replace(size_type pos1, size_type n1, const basic_string& str); - basic_string& replace(size_type pos1, size_type n1, const basic_string& str, size_type pos2, size_type n2); + basic_string& replace(size_type pos1, size_type n1, const basic_string& str, + size_type pos2, size_type n2); basic_string& replace(size_type pos, size_type n1, const_pointer s, size_type n2); basic_string& replace(size_type pos, size_type n1, const_pointer s); basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c); @@ -197,7 +204,8 @@ public: basic_string& replace(iterator i1, iterator i2, const_pointer s, size_type n); basic_string& replace(iterator i1, iterator i2, const_pointer s); basic_string& replace(iterator i1, iterator i2, size_type n, value_type c); - template<class InputIterator> basic_string& replace(iterator i1, iterator i2, InputIterator j1, InputIterator j2); + template<class InputIterator> + basic_string& replace(iterator i1, iterator i2, InputIterator j1, InputIterator j2); basic_string& replace(iterator i1, iterator i2, initializer_list<value_type>); size_type copy(pointer s, size_type n, size_type pos = 0) const; @@ -242,7 +250,8 @@ public: int compare(const basic_string& str) const; int compare(size_type pos1, size_type n1, const basic_string& str) const; - int compare(size_type pos1, size_type n1, const basic_string& str, size_type pos2, size_type n2) const; + int compare(size_type pos1, size_type n1, const basic_string& str, + size_type pos2, size_type n2) const; int compare(const_pointer s) const; int compare(size_type pos1, size_type n1, const_pointer s) const; int compare(size_type pos1, size_type n1, const_pointer s, size_type n2) const; @@ -252,7 +261,8 @@ public: template<class charT, class traits, class Allocator> basic_string<charT, traits, Allocator> -operator+(const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs); +operator+(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> basic_string<charT, traits, Allocator> @@ -271,7 +281,8 @@ basic_string<charT, traits, Allocator> operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs); template<class charT, class traits, class Allocator> -bool operator==(const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs); +bool operator==(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs); @@ -280,7 +291,8 @@ template<class charT, class traits, class Allocator> bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs); template<class charT, class traits, class Allocator> -bool operator!=(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs); +bool operator!=(const basic_string<charT,traits,Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs); @@ -289,7 +301,8 @@ template<class charT, class traits, class Allocator> bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); template<class charT, class traits, class Allocator> -bool operator< (const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs); +bool operator< (const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); @@ -298,7 +311,8 @@ template<class charT, class traits, class Allocator> bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> -bool operator> (const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs); +bool operator> (const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); @@ -307,7 +321,8 @@ template<class charT, class traits, class Allocator> bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> -bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs); +bool operator<=(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); @@ -316,7 +331,8 @@ template<class charT, class traits, class Allocator> bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> -bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs); +bool operator>=(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); @@ -325,7 +341,8 @@ template<class charT, class traits, class Allocator> bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> -void swap(basic_string<charT, traits, Allocator>& lhs, basic_string<charT, traits, Allocator>& rhs); +void swap(basic_string<charT, traits, Allocator>& lhs, + basic_string<charT, traits, Allocator>& rhs); template<class charT, class traits, class Allocator> basic_istream<charT, traits>& @@ -337,7 +354,8 @@ operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, A template<class charT, class traits, class Allocator> basic_istream<charT, traits>& -getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str, charT delim); +getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str, + charT delim); template<class charT, class traits, class Allocator> basic_istream<charT, traits>& @@ -345,6 +363,48 @@ getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator> typedef basic_string<char> string; typedef basic_string<wchar_t> wstring; +typedef basic_string<char16_t> u16string; +typedef basic_string<char32_t> u32string; + +int stoi (const string& str, size_t* idx = 0, int base = 10); +long stol (const string& str, size_t* idx = 0, int base = 10); +unsigned long stoul (const string& str, size_t* idx = 0, int base = 10); +long long stoll (const string& str, size_t* idx = 0, int base = 10); +unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10); + +float stof (const string& str, size_t* idx = 0); +double stod (const string& str, size_t* idx = 0); +long double stold(const string& str, size_t* idx = 0); + +string to_string(int val); +string to_string(unsigned val); +string to_string(long val); +string to_string(unsigned long val); +string to_string(long long val); +string to_string(unsigned long long val); +string to_string(float val); +string to_string(double val); +string to_string(long double val); + +int stoi (const wstring& str, size_t* idx = 0, int base = 10); +long stol (const wstring& str, size_t* idx = 0, int base = 10); +unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10); +long long stoll (const wstring& str, size_t* idx = 0, int base = 10); +unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10); + +float stof (const wstring& str, size_t* idx = 0); +double stod (const wstring& str, size_t* idx = 0); +long double stold(const wstring& str, size_t* idx = 0); + +wstring to_wstring(int val); +wstring to_wstring(unsigned val); +wstring to_wstring(long val); +wstring to_wstring(unsigned long val); +wstring to_wstring(long long val); +wstring to_wstring(unsigned long long val); +wstring to_wstring(float val); +wstring to_wstring(double val); +wstring to_wstring(long double val); template <> struct hash<string>; template <> struct hash<u16string>; @@ -3449,6 +3509,46 @@ typedef basic_string<char32_t> u32string; #endif +int stoi (const string& __str, size_t* __idx = 0, int __base = 10); +long stol (const string& __str, size_t* __idx = 0, int __base = 10); +unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10); +long long stoll (const string& __str, size_t* __idx = 0, int __base = 10); +unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10); + +float stof (const string& __str, size_t* __idx = 0); +double stod (const string& __str, size_t* __idx = 0); +long double stold(const string& __str, size_t* __idx = 0); + +string to_string(int __val); +string to_string(unsigned __val); +string to_string(long __val); +string to_string(unsigned long __val); +string to_string(long long __val); +string to_string(unsigned long long __val); +string to_string(float __val); +string to_string(double __val); +string to_string(long double __val); + +int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10); +long stol (const wstring& __str, size_t* __idx = 0, int __base = 10); +unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10); +long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10); +unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10); + +float stof (const wstring& __str, size_t* __idx = 0); +double stod (const wstring& __str, size_t* __idx = 0); +long double stold(const wstring& __str, size_t* __idx = 0); + +wstring to_wstring(int __val); +wstring to_wstring(unsigned __val); +wstring to_wstring(long __val); +wstring to_wstring(unsigned long __val); +wstring to_wstring(long long __val); +wstring to_wstring(unsigned long long __val); +wstring to_wstring(float __val); +wstring to_wstring(double __val); +wstring to_wstring(long double __val); + template<class _CharT, class _Traits, class _Allocator> const typename basic_string<_CharT, _Traits, _Allocator>::size_type basic_string<_CharT, _Traits, _Allocator>::npos; diff --git a/libcxx/include/thread b/libcxx/include/thread index 16faed9380d..5fcd2c988de 100644 --- a/libcxx/include/thread +++ b/libcxx/include/thread @@ -265,10 +265,10 @@ inline thread& thread::operator=(thread&& __t) { - if (__t_ != nullptr) + if (__t_ != 0) terminate(); __t_ = __t.__t_; - __t.__t_ = nullptr; + __t.__t_ = 0; return *this; } diff --git a/libcxx/lib/buildit b/libcxx/lib/buildit index 43341f97029..19d195988a2 100755 --- a/libcxx/lib/buildit +++ b/libcxx/lib/buildit @@ -12,7 +12,7 @@ then exit 1 fi -if [ -z $CXX ] +if [ -z "$CXX" ] then CXX=g++ fi diff --git a/libcxx/src/ios.cpp b/libcxx/src/ios.cpp index 4d1261e3854..eb597bfbdfd 100644 --- a/libcxx/src/ios.cpp +++ b/libcxx/src/ios.cpp @@ -20,61 +20,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD -template class __basic_string_common<true>; - -template class basic_string<char>; -template class basic_string<wchar_t>; - -template enable_if<__is_forward_iterator<char const*>::value, void>::type - basic_string<char, char_traits<char>, allocator<char> > - ::__init<char const*>(char const*, char const*); - -template enable_if<__is_forward_iterator<wchar_t const*>::value, void>::type - basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > - ::__init<wchar_t const*>(wchar_t const*, wchar_t const*); - -template - enable_if<__is_forward_iterator<char*>::value, - basic_string<char, char_traits<char>, allocator<char> >&>::type - basic_string<char, char_traits<char>, allocator<char> >:: - append<char*>(char*, char*); - -template - enable_if<__is_forward_iterator<wchar_t*>::value, - basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&>::type - basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >:: - append<wchar_t*>(wchar_t*, wchar_t*); - -template - enable_if<__is_forward_iterator<char const*>::value, - string::iterator>::type - string:: - insert<char const*>(string::const_iterator, char const*, char const*); - -template - enable_if<__is_forward_iterator<wchar_t const*>::value, - wstring::iterator>::type - wstring:: - insert<wchar_t const*>(wstring::const_iterator, wchar_t const*, wchar_t const*); - -template - enable_if<__is_input_iterator<char const*>::value, string&>::type - string:: - replace<char const*>(string::iterator, string::iterator, char const*, char const*); - -template - enable_if<__is_input_iterator<wchar_t const*>::value, wstring&>::type - wstring:: - replace<wchar_t const*>(wstring::iterator, wstring::iterator, wchar_t const*, wchar_t const*); - -template - enable_if<__is_forward_iterator<wchar_t*>::value, wstring&>::type - wstring::assign<wchar_t*>(wchar_t*, wchar_t*); - -template - string - operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); - template class basic_ios<char>; template class basic_ios<wchar_t>; diff --git a/libcxx/src/string.cpp b/libcxx/src/string.cpp new file mode 100644 index 00000000000..819935c07d0 --- /dev/null +++ b/libcxx/src/string.cpp @@ -0,0 +1,690 @@ +//===------------------------- string.cpp ---------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "string" +#include "cstdlib" +#include "cwchar" +#include "cerrno" + +_LIBCPP_BEGIN_NAMESPACE_STD + +template class __basic_string_common<true>; + +template class basic_string<char>; +template class basic_string<wchar_t>; + +template enable_if<__is_forward_iterator<char const*>::value, void>::type + basic_string<char, char_traits<char>, allocator<char> > + ::__init<char const*>(char const*, char const*); + +template enable_if<__is_forward_iterator<wchar_t const*>::value, void>::type + basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > + ::__init<wchar_t const*>(wchar_t const*, wchar_t const*); + +template + enable_if<__is_forward_iterator<char*>::value, + basic_string<char, char_traits<char>, allocator<char> >&>::type + basic_string<char, char_traits<char>, allocator<char> >:: + append<char*>(char*, char*); + +template + enable_if<__is_forward_iterator<wchar_t*>::value, + basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&>::type + basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >:: + append<wchar_t*>(wchar_t*, wchar_t*); + +template + enable_if<__is_forward_iterator<char const*>::value, + string::iterator>::type + string:: + insert<char const*>(string::const_iterator, char const*, char const*); + +template + enable_if<__is_forward_iterator<wchar_t const*>::value, + wstring::iterator>::type + wstring:: + insert<wchar_t const*>(wstring::const_iterator, wchar_t const*, wchar_t const*); + +template + enable_if<__is_input_iterator<char const*>::value, string&>::type + string:: + replace<char const*>(string::iterator, string::iterator, char const*, char const*); + +template + enable_if<__is_input_iterator<wchar_t const*>::value, wstring&>::type + wstring:: + replace<wchar_t const*>(wstring::iterator, wstring::iterator, wchar_t const*, wchar_t const*); + +template + enable_if<__is_forward_iterator<wchar_t*>::value, wstring&>::type + wstring::assign<wchar_t*>(wchar_t*, wchar_t*); + +template + string + operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); + +int +stoi(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + long r = strtol(p, &ptr, base); + if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) + ptr = const_cast<char*>(p); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoi: no conversion"); + throw out_of_range("stoi: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<int>(r); +} + +int +stoi(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + long r = wcstol(p, &ptr, base); + if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) + ptr = const_cast<wchar_t*>(p); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoi: no conversion"); + throw out_of_range("stoi: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<int>(r); +} + +long +stol(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + long r = strtol(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stol: no conversion"); + throw out_of_range("stol: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long +stol(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + long r = wcstol(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stol: no conversion"); + throw out_of_range("stol: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long +stoul(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + unsigned long r = strtoul(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoul: no conversion"); + throw out_of_range("stoul: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long +stoul(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + unsigned long r = wcstoul(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoul: no conversion"); + throw out_of_range("stoul: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long long +stoll(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + long long r = strtoll(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoll: no conversion"); + throw out_of_range("stoll: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long long +stoll(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + long long r = wcstoll(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoll: no conversion"); + throw out_of_range("stoll: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long long +stoull(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + unsigned long long r = strtoull(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoull: no conversion"); + throw out_of_range("stoull: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long long +stoull(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + unsigned long long r = wcstoull(p, &ptr, base); + if (ptr == p) + { + if (r == 0) + throw invalid_argument("stoull: no conversion"); + throw out_of_range("stoull: out of range"); + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +float +stof(const string& str, size_t* idx) +{ + char* ptr; + const char* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = strtod(p, &ptr); + swap(errno, errno_save); + if (errno_save == ERANGE) + throw out_of_range("stof: out of range"); + if (ptr == p) + throw invalid_argument("stof: no conversion"); + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<float>(r); +} + +float +stof(const wstring& str, size_t* idx) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = wcstod(p, &ptr); + swap(errno, errno_save); + if (errno_save == ERANGE) + throw out_of_range("stof: out of range"); + if (ptr == p) + throw invalid_argument("stof: no conversion"); + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<float>(r); +} + +double +stod(const string& str, size_t* idx) +{ + char* ptr; + const char* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = strtod(p, &ptr); + swap(errno, errno_save); + if (errno_save == ERANGE) + throw out_of_range("stod: out of range"); + if (ptr == p) + throw invalid_argument("stod: no conversion"); + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +double +stod(const wstring& str, size_t* idx) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = wcstod(p, &ptr); + swap(errno, errno_save); + if (errno_save == ERANGE) + throw out_of_range("stod: out of range"); + if (ptr == p) + throw invalid_argument("stod: no conversion"); + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long double +stold(const string& str, size_t* idx) +{ + char* ptr; + const char* const p = str.c_str(); + int errno_save = errno; + errno = 0; + long double r = strtold(p, &ptr); + swap(errno, errno_save); + if (errno_save == ERANGE) + throw out_of_range("stold: out of range"); + if (ptr == p) + throw invalid_argument("stold: no conversion"); + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long double +stold(const wstring& str, size_t* idx) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + int errno_save = errno; + errno = 0; + long double r = wcstold(p, &ptr); + swap(errno, errno_save); + if (errno_save == ERANGE) + throw out_of_range("stold: out of range"); + if (ptr == p) + throw invalid_argument("stold: no conversion"); + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +string to_string(int val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%d", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(unsigned val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%u", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%ld", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(unsigned long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%lu", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(long long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%lld", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(unsigned long long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%llu", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(float val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%f", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(double val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%f", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(long double val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + int n2 = snprintf(&s[0], s.size()+1, "%Lf", val); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +wstring to_wstring(int val) +{ + const size_t n = (numeric_limits<int>::digits / 3) + + ((numeric_limits<int>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%d", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(unsigned val) +{ + const size_t n = (numeric_limits<unsigned>::digits / 3) + + ((numeric_limits<unsigned>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%u", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(long val) +{ + const size_t n = (numeric_limits<long>::digits / 3) + + ((numeric_limits<long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%ld", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(unsigned long val) +{ + const size_t n = (numeric_limits<unsigned long>::digits / 3) + + ((numeric_limits<unsigned long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%lu", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(long long val) +{ + const size_t n = (numeric_limits<long long>::digits / 3) + + ((numeric_limits<long long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%lld", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(unsigned long long val) +{ + const size_t n = (numeric_limits<unsigned long long>::digits / 3) + + ((numeric_limits<unsigned long long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%llu", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(float val) +{ + const size_t n = 20; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%f", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(double val) +{ + const size_t n = 20; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%f", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(long double val) +{ + const size_t n = 20; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val); + if (n2 > 0) + { + s.resize(n2); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/test/strings/string.conversions/stod.pass.cpp b/libcxx/test/strings/string.conversions/stod.pass.cpp new file mode 100644 index 00000000000..4c75f0a3746 --- /dev/null +++ b/libcxx/test/strings/string.conversions/stod.pass.cpp @@ -0,0 +1,166 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// double stod(const string& str, size_t *idx = 0); +// double stod(const wstring& str, size_t *idx = 0); + +#include <string> +#include <cmath> +#include <cassert> + +int main() +{ + assert(std::stod("0") == 0); + assert(std::stod(L"0") == 0); + assert(std::stod("-0") == 0); + assert(std::stod(L"-0") == 0); + assert(std::stod("-10") == -10); + assert(std::stod(L"-10.5") == -10.5); + assert(std::stod(" 10") == 10); + assert(std::stod(L" 10") == 10); + size_t idx = 0; + assert(std::stod("10g", &idx) == 10); + assert(idx == 2); + idx = 0; + assert(std::stod(L"10g", &idx) == 10); + assert(idx == 2); + try + { + assert(std::stod("1.e60", &idx) == 1.e60); + assert(idx == 5); + } + catch (const std::out_of_range&) + { + assert(false); + } + try + { + assert(std::stod(L"1.e60", &idx) == 1.e60); + assert(idx == 5); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::stod("1.e360", &idx) == INFINITY); + assert(false); + } + catch (const std::out_of_range&) + { + assert(idx == 0); + } + try + { + assert(std::stod(L"1.e360", &idx) == INFINITY); + assert(false); + } + catch (const std::out_of_range&) + { + assert(idx == 0); + } + try + { + assert(std::stod("INF", &idx) == INFINITY); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::stod(L"INF", &idx) == INFINITY); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::isnan(std::stod("NAN", &idx))); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::isnan(std::stod(L"NAN", &idx))); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + std::stod("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stod(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stod(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stod(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stod("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stod(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/stof.pass.cpp b/libcxx/test/strings/string.conversions/stof.pass.cpp new file mode 100644 index 00000000000..14a5bd03623 --- /dev/null +++ b/libcxx/test/strings/string.conversions/stof.pass.cpp @@ -0,0 +1,166 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// float stof(const string& str, size_t *idx = 0); +// float stof(const wstring& str, size_t *idx = 0); + +#include <string> +#include <cmath> +#include <cassert> + +int main() +{ + assert(std::stof("0") == 0); + assert(std::stof(L"0") == 0); + assert(std::stof("-0") == 0); + assert(std::stof(L"-0") == 0); + assert(std::stof("-10") == -10); + assert(std::stof(L"-10.5") == -10.5); + assert(std::stof(" 10") == 10); + assert(std::stof(L" 10") == 10); + size_t idx = 0; + assert(std::stof("10g", &idx) == 10); + assert(idx == 2); + idx = 0; + assert(std::stof(L"10g", &idx) == 10); + assert(idx == 2); + try + { + assert(std::stof("1.e60", &idx) == INFINITY); + assert(idx == 5); + } + catch (const std::out_of_range&) + { + assert(false); + } + try + { + assert(std::stof(L"1.e60", &idx) == INFINITY); + assert(idx == 5); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::stof("1.e360", &idx) == INFINITY); + assert(false); + } + catch (const std::out_of_range&) + { + assert(idx == 0); + } + try + { + assert(std::stof(L"1.e360", &idx) == INFINITY); + assert(false); + } + catch (const std::out_of_range&) + { + assert(idx == 0); + } + try + { + assert(std::stof("INF", &idx) == INFINITY); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::stof(L"INF", &idx) == INFINITY); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::isnan(std::stof("NAN", &idx))); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::isnan(std::stof(L"NAN", &idx))); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + std::stof("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stof(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stof(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stof(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stof("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stof(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/stoi.pass.cpp b/libcxx/test/strings/string.conversions/stoi.pass.cpp new file mode 100644 index 00000000000..684518069bb --- /dev/null +++ b/libcxx/test/strings/string.conversions/stoi.pass.cpp @@ -0,0 +1,108 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// int stoi(const string& str, size_t *idx = 0, int base = 10); +// int stoi(const wstring& str, size_t *idx = 0, int base = 10); + +#include <string> +#include <cassert> + +int main() +{ + assert(std::stoi("0") == 0); + assert(std::stoi(L"0") == 0); + assert(std::stoi("-0") == 0); + assert(std::stoi(L"-0") == 0); + assert(std::stoi("-10") == -10); + assert(std::stoi(L"-10") == -10); + assert(std::stoi(" 10") == 10); + assert(std::stoi(L" 10") == 10); + size_t idx = 0; + assert(std::stoi("10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + assert(std::stoi(L"10g", &idx, 16) == 16); + assert(idx == 2); + if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max()) + { + try + { + std::stoi("0x100000000", &idx, 16); + assert(false); + } + catch (const std::out_of_range&) + { + } + try + { + std::stoi(L"0x100000000", &idx, 16); + assert(false); + } + catch (const std::out_of_range&) + { + } + } + idx = 0; + try + { + std::stoi("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoi(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoi(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoi(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoi("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoi(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/stol.pass.cpp b/libcxx/test/strings/string.conversions/stol.pass.cpp new file mode 100644 index 00000000000..f31326310d1 --- /dev/null +++ b/libcxx/test/strings/string.conversions/stol.pass.cpp @@ -0,0 +1,89 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// long stol(const string& str, size_t *idx = 0, int base = 10); +// long stol(const wstring& str, size_t *idx = 0, int base = 10); + +#include <string> +#include <cassert> + +int main() +{ + assert(std::stol("0") == 0); + assert(std::stol(L"0") == 0); + assert(std::stol("-0") == 0); + assert(std::stol(L"-0") == 0); + assert(std::stol("-10") == -10); + assert(std::stol(L"-10") == -10); + assert(std::stol(" 10") == 10); + assert(std::stol(L" 10") == 10); + size_t idx = 0; + assert(std::stol("10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + assert(std::stol(L"10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + try + { + std::stol("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stol(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stol(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stol(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stol("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stol(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/stold.pass.cpp b/libcxx/test/strings/string.conversions/stold.pass.cpp new file mode 100644 index 00000000000..86666d80380 --- /dev/null +++ b/libcxx/test/strings/string.conversions/stold.pass.cpp @@ -0,0 +1,168 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// long double stold(const string& str, size_t *idx = 0); +// long double stold(const wstring& str, size_t *idx = 0); + +#include <iostream> + +#include <string> +#include <cmath> +#include <cassert> + +int main() +{ + assert(std::stold("0") == 0); + assert(std::stold(L"0") == 0); + assert(std::stold("-0") == 0); + assert(std::stold(L"-0") == 0); + assert(std::stold("-10") == -10); + assert(std::stold(L"-10.5") == -10.5); + assert(std::stold(" 10") == 10); + assert(std::stold(L" 10") == 10); + size_t idx = 0; + assert(std::stold("10g", &idx) == 10); + assert(idx == 2); + idx = 0; + assert(std::stold(L"10g", &idx) == 10); + assert(idx == 2); + try + { + assert(std::stold("1.e60", &idx) == 1.e60L); + assert(idx == 5); + } + catch (const std::out_of_range&) + { + assert(false); + } + try + { + assert(std::stold(L"1.e60", &idx) == 1.e60L); + assert(idx == 5); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::stold("1.e6000", &idx) == INFINITY); + assert(false); + } + catch (const std::out_of_range&) + { + assert(idx == 0); + } + try + { + assert(std::stold(L"1.e6000", &idx) == INFINITY); + assert(false); + } + catch (const std::out_of_range&) + { + assert(idx == 0); + } + try + { + assert(std::stold("INF", &idx) == INFINITY); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::stold(L"INF", &idx) == INFINITY); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::isnan(std::stold("NAN", &idx))); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + assert(std::isnan(std::stold(L"NAN", &idx))); + assert(idx == 3); + } + catch (const std::out_of_range&) + { + assert(false); + } + idx = 0; + try + { + std::stold("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stold(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stold(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stold(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stold("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stold(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/stoll.pass.cpp b/libcxx/test/strings/string.conversions/stoll.pass.cpp new file mode 100644 index 00000000000..8e904037055 --- /dev/null +++ b/libcxx/test/strings/string.conversions/stoll.pass.cpp @@ -0,0 +1,89 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// long long stoll(const string& str, size_t *idx = 0, int base = 10); +// long long stoll(const wstring& str, size_t *idx = 0, int base = 10); + +#include <string> +#include <cassert> + +int main() +{ + assert(std::stoll("0") == 0); + assert(std::stoll(L"0") == 0); + assert(std::stoll("-0") == 0); + assert(std::stoll(L"-0") == 0); + assert(std::stoll("-10") == -10); + assert(std::stoll(L"-10") == -10); + assert(std::stoll(" 10") == 10); + assert(std::stoll(L" 10") == 10); + size_t idx = 0; + assert(std::stoll("10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + assert(std::stoll(L"10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + try + { + std::stoll("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoll(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoll(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoll(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoll("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoll(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/stoul.pass.cpp b/libcxx/test/strings/string.conversions/stoul.pass.cpp new file mode 100644 index 00000000000..c31b2cc2c3f --- /dev/null +++ b/libcxx/test/strings/string.conversions/stoul.pass.cpp @@ -0,0 +1,87 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// unsigned long stoul(const string& str, size_t *idx = 0, int base = 10); +// unsigned long stoul(const wstring& str, size_t *idx = 0, int base = 10); + +#include <string> +#include <cassert> + +int main() +{ + assert(std::stoul("0") == 0); + assert(std::stoul(L"0") == 0); + assert(std::stoul("-0") == 0); + assert(std::stoul(L"-0") == 0); + assert(std::stoul(" 10") == 10); + assert(std::stoul(L" 10") == 10); + size_t idx = 0; + assert(std::stoul("10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + assert(std::stoul(L"10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + try + { + std::stoul("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoul(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoul(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoul(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoul("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoul(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/stoull.pass.cpp b/libcxx/test/strings/string.conversions/stoull.pass.cpp new file mode 100644 index 00000000000..9432750b6fb --- /dev/null +++ b/libcxx/test/strings/string.conversions/stoull.pass.cpp @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10); +// unsigned long long stoull(const wstring& str, size_t *idx = 0, int base = 10); + +#include <string> +#include <cassert> + +int main() +{ + assert(std::stoull("0") == 0); + assert(std::stoull(L"0") == 0); + assert(std::stoull("-0") == 0); + assert(std::stoull(L"-0") == 0); + assert(std::stoull(" 10") == 10); + assert(std::stoull(L" 10") == 10); + size_t idx = 0; + assert(std::stoull("10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + assert(std::stoull(L"10g", &idx, 16) == 16); + assert(idx == 2); + idx = 0; + try + { + std::stoull("", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + idx = 0; + try + { + std::stoull(L"", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoull(" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoull(L" - 8", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoull("a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } + try + { + std::stoull(L"a1", &idx); + assert(false); + } + catch (const std::invalid_argument&) + { + assert(idx == 0); + } +} diff --git a/libcxx/test/strings/string.conversions/to_string.pass.cpp b/libcxx/test/strings/string.conversions/to_string.pass.cpp new file mode 100644 index 00000000000..86e2b6b4c74 --- /dev/null +++ b/libcxx/test/strings/string.conversions/to_string.pass.cpp @@ -0,0 +1,126 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// string to_string(int val); +// string to_string(unsigned val); +// string to_string(long val); +// string to_string(unsigned long val); +// string to_string(long long val); +// string to_string(unsigned long long val); +// string to_string(float val); +// string to_string(double val); +// string to_string(long double val); + +#include <string> +#include <cassert> +#include <sstream> + +template <class T> +void +test_signed() +{ + { + std::string s = std::to_string(T(0)); + assert(s.size() == 1); + assert(s[s.size()] == 0); + assert(s == "0"); + } + { + std::string s = std::to_string(T(12345)); + assert(s.size() == 5); + assert(s[s.size()] == 0); + assert(s == "12345"); + } + { + std::string s = std::to_string(T(-12345)); + assert(s.size() == 6); + assert(s[s.size()] == 0); + assert(s == "-12345"); + } + { + std::string s = std::to_string(std::numeric_limits<T>::max()); + assert(s.size() == std::numeric_limits<T>::digits10 + 1); + std::istringstream is(s); + T t(0); + is >> t; + assert(t == std::numeric_limits<T>::max()); + } + { + std::string s = std::to_string(std::numeric_limits<T>::min()); + std::istringstream is(s); + T t(0); + is >> t; + assert(t == std::numeric_limits<T>::min()); + } +} + +template <class T> +void +test_unsigned() +{ + { + std::string s = std::to_string(T(0)); + assert(s.size() == 1); + assert(s[s.size()] == 0); + assert(s == "0"); + } + { + std::string s = std::to_string(T(12345)); + assert(s.size() == 5); + assert(s[s.size()] == 0); + assert(s == "12345"); + } + { + std::string s = std::to_string(std::numeric_limits<T>::max()); + assert(s.size() == std::numeric_limits<T>::digits10 + 1); + std::istringstream is(s); + T t(0); + is >> t; + assert(t == std::numeric_limits<T>::max()); + } +} + +template <class T> +void +test_float() +{ + { + std::string s = std::to_string(T(0)); + assert(s.size() == 8); + assert(s[s.size()] == 0); + assert(s == "0.000000"); + } + { + std::string s = std::to_string(T(12345)); + assert(s.size() == 12); + assert(s[s.size()] == 0); + assert(s == "12345.000000"); + } + { + std::string s = std::to_string(T(-12345)); + assert(s.size() == 13); + assert(s[s.size()] == 0); + assert(s == "-12345.000000"); + } +} + +int main() +{ + test_signed<int>(); + test_signed<long>(); + test_signed<long long>(); + test_unsigned<unsigned>(); + test_unsigned<unsigned long>(); + test_unsigned<unsigned long long>(); + test_float<float>(); + test_float<double>(); + test_float<long double>(); +} diff --git a/libcxx/test/strings/string.conversions/to_wstring.pass.cpp b/libcxx/test/strings/string.conversions/to_wstring.pass.cpp new file mode 100644 index 00000000000..a96abf2e705 --- /dev/null +++ b/libcxx/test/strings/string.conversions/to_wstring.pass.cpp @@ -0,0 +1,126 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <string> + +// wstring to_wstring(int val); +// wstring to_wstring(unsigned val); +// wstring to_wstring(long val); +// wstring to_wstring(unsigned long val); +// wstring to_wstring(long long val); +// wstring to_wstring(unsigned long long val); +// wstring to_wstring(float val); +// wstring to_wstring(double val); +// wstring to_wstring(long double val); + +#include <string> +#include <cassert> +#include <sstream> + +template <class T> +void +test_signed() +{ + { + std::wstring s = std::to_wstring(T(0)); + assert(s.size() == 1); + assert(s[s.size()] == 0); + assert(s == L"0"); + } + { + std::wstring s = std::to_wstring(T(12345)); + assert(s.size() == 5); + assert(s[s.size()] == 0); + assert(s == L"12345"); + } + { + std::wstring s = std::to_wstring(T(-12345)); + assert(s.size() == 6); + assert(s[s.size()] == 0); + assert(s == L"-12345"); + } + { + std::wstring s = std::to_wstring(std::numeric_limits<T>::max()); + assert(s.size() == std::numeric_limits<T>::digits10 + 1); + std::wistringstream is(s); + T t(0); + is >> t; + assert(t == std::numeric_limits<T>::max()); + } + { + std::wstring s = std::to_wstring(std::numeric_limits<T>::min()); + std::wistringstream is(s); + T t(0); + is >> t; + assert(t == std::numeric_limits<T>::min()); + } +} + +template <class T> +void +test_unsigned() +{ + { + std::wstring s = std::to_wstring(T(0)); + assert(s.size() == 1); + assert(s[s.size()] == 0); + assert(s == L"0"); + } + { + std::wstring s = std::to_wstring(T(12345)); + assert(s.size() == 5); + assert(s[s.size()] == 0); + assert(s == L"12345"); + } + { + std::wstring s = std::to_wstring(std::numeric_limits<T>::max()); + assert(s.size() == std::numeric_limits<T>::digits10 + 1); + std::wistringstream is(s); + T t(0); + is >> t; + assert(t == std::numeric_limits<T>::max()); + } +} + +template <class T> +void +test_float() +{ + { + std::wstring s = std::to_wstring(T(0)); + assert(s.size() == 8); + assert(s[s.size()] == 0); + assert(s == L"0.000000"); + } + { + std::wstring s = std::to_wstring(T(12345)); + assert(s.size() == 12); + assert(s[s.size()] == 0); + assert(s == L"12345.000000"); + } + { + std::wstring s = std::to_wstring(T(-12345)); + assert(s.size() == 13); + assert(s[s.size()] == 0); + assert(s == L"-12345.000000"); + } +} + +int main() +{ + test_signed<int>(); + test_signed<long>(); + test_signed<long long>(); + test_unsigned<unsigned>(); + test_unsigned<unsigned long>(); + test_unsigned<unsigned long long>(); + test_float<float>(); + test_float<double>(); + test_float<long double>(); +} diff --git a/libcxx/test/strings/strings.general/nothing_to_do.pass.cpp b/libcxx/test/strings/strings.general/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..b85601fc46f --- /dev/null +++ b/libcxx/test/strings/strings.general/nothing_to_do.pass.cpp @@ -0,0 +1,13 @@ +// -*- C++ -*- +//===-------------------------- algorithm ---------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} |