1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <string> 11 12 // double stod(const string& str, size_t *idx = 0); 13 // double stod(const wstring& str, size_t *idx = 0); 14 15 #include <string> 16 #include <cmath> 17 #include <cassert> 18 19 int main() 20 { 21 assert(std::stod("0") == 0); 22 assert(std::stod(L"0") == 0); 23 assert(std::stod("-0") == 0); 24 assert(std::stod(L"-0") == 0); 25 assert(std::stod("-10") == -10); 26 assert(std::stod(L"-10.5") == -10.5); 27 assert(std::stod(" 10") == 10); 28 assert(std::stod(L" 10") == 10); 29 size_t idx = 0; 30 assert(std::stod("10g", &idx) == 10); 31 assert(idx == 2); 32 idx = 0; 33 assert(std::stod(L"10g", &idx) == 10); 34 assert(idx == 2); 35 try 36 { 37 assert(std::stod("1.e60", &idx) == 1.e60); 38 assert(idx == 5); 39 } 40 catch (const std::out_of_range&) 41 { 42 assert(false); 43 } 44 try 45 { 46 assert(std::stod(L"1.e60", &idx) == 1.e60); 47 assert(idx == 5); 48 } 49 catch (const std::out_of_range&) 50 { 51 assert(false); 52 } 53 idx = 0; 54 try 55 { 56 assert(std::stod("1.e360", &idx) == INFINITY); 57 assert(false); 58 } 59 catch (const std::out_of_range&) 60 { 61 assert(idx == 0); 62 } 63 try 64 { 65 assert(std::stod(L"1.e360", &idx) == INFINITY); 66 assert(false); 67 } 68 catch (const std::out_of_range&) 69 { 70 assert(idx == 0); 71 } 72 try 73 { 74 assert(std::stod("INF", &idx) == INFINITY); 75 assert(idx == 3); 76 } 77 catch (const std::out_of_range&) 78 { 79 assert(false); 80 } 81 idx = 0; 82 try 83 { 84 assert(std::stod(L"INF", &idx) == INFINITY); 85 assert(idx == 3); 86 } 87 catch (const std::out_of_range&) 88 { 89 assert(false); 90 } 91 idx = 0; 92 try 93 { 94 assert(std::isnan(std::stod("NAN", &idx))); 95 assert(idx == 3); 96 } 97 catch (const std::out_of_range&) 98 { 99 assert(false); 100 } 101 idx = 0; 102 try 103 { 104 assert(std::isnan(std::stod(L"NAN", &idx))); 105 assert(idx == 3); 106 } 107 catch (const std::out_of_range&) 108 { 109 assert(false); 110 } 111 idx = 0; 112 try 113 { 114 std::stod("", &idx); 115 assert(false); 116 } 117 catch (const std::invalid_argument&) 118 { 119 assert(idx == 0); 120 } 121 try 122 { 123 std::stod(L"", &idx); 124 assert(false); 125 } 126 catch (const std::invalid_argument&) 127 { 128 assert(idx == 0); 129 } 130 try 131 { 132 std::stod(" - 8", &idx); 133 assert(false); 134 } 135 catch (const std::invalid_argument&) 136 { 137 assert(idx == 0); 138 } 139 try 140 { 141 std::stod(L" - 8", &idx); 142 assert(false); 143 } 144 catch (const std::invalid_argument&) 145 { 146 assert(idx == 0); 147 } 148 try 149 { 150 std::stod("a1", &idx); 151 assert(false); 152 } 153 catch (const std::invalid_argument&) 154 { 155 assert(idx == 0); 156 } 157 try 158 { 159 std::stod(L"a1", &idx); 160 assert(false); 161 } 162 catch (const std::invalid_argument&) 163 { 164 assert(idx == 0); 165 } 166 } 167