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 // <locale> 11 12 // class num_put<charT, OutputIterator> 13 14 // iter_type put(iter_type s, ios_base& iob, char_type fill, unsigned long v) const; 15 16 #include <locale> 17 #include <ios> 18 #include <cassert> 19 #include <streambuf> 20 #include "test_iterators.h" 21 22 typedef std::num_put<char, output_iterator<char*> > F; 23 24 class my_facet 25 : public F 26 { 27 public: 28 explicit my_facet(std::size_t refs = 0) 29 : F(refs) {} 30 }; 31 32 class my_numpunct 33 : public std::numpunct<char> 34 { 35 public: 36 my_numpunct() : std::numpunct<char>() {} 37 38 protected: 39 virtual char_type do_thousands_sep() const {return '_';} 40 virtual std::string do_grouping() const {return std::string("\1\2\3");} 41 }; 42 43 int main() 44 { 45 const my_facet f(1); 46 { 47 std::ios ios(0); 48 unsigned long v = 0; 49 char str[50]; 50 std::ios_base::iostate err = ios.goodbit; 51 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 52 std::string ex(str, iter.base()); 53 assert(ex == "0"); 54 } 55 { 56 std::ios ios(0); 57 unsigned long v = 1; 58 char str[50]; 59 std::ios_base::iostate err = ios.goodbit; 60 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 61 std::string ex(str, iter.base()); 62 assert(ex == "1"); 63 } 64 { 65 std::ios ios(0); 66 unsigned long v = -1; 67 char str[50]; 68 std::ios_base::iostate err = ios.goodbit; 69 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 70 std::string ex(str, iter.base()); 71 assert(ex == (sizeof(unsigned long) == 4 ? "4294967295" : "18446744073709551615")); 72 } 73 { 74 std::ios ios(0); 75 unsigned long v = -1000; 76 char str[50]; 77 std::ios_base::iostate err = ios.goodbit; 78 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 79 std::string ex(str, iter.base()); 80 assert(ex == (sizeof(unsigned long) == 4 ? "4294966296" : "18446744073709550616")); 81 } 82 { 83 std::ios ios(0); 84 unsigned long v = 1000; 85 char str[50]; 86 std::ios_base::iostate err = ios.goodbit; 87 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 88 std::string ex(str, iter.base()); 89 assert(ex == "1000"); 90 } 91 { 92 std::ios ios(0); 93 showpos(ios); 94 unsigned long v = 1000; 95 char str[50]; 96 std::ios_base::iostate err = ios.goodbit; 97 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 98 std::string ex(str, iter.base()); 99 assert(ex == "1000"); 100 } 101 { 102 std::ios ios(0); 103 oct(ios); 104 unsigned long v = 1000; 105 char str[50]; 106 std::ios_base::iostate err = ios.goodbit; 107 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 108 std::string ex(str, iter.base()); 109 assert(ex == "1750"); 110 } 111 { 112 std::ios ios(0); 113 oct(ios); 114 showbase(ios); 115 unsigned long v = 1000; 116 char str[50]; 117 std::ios_base::iostate err = ios.goodbit; 118 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 119 std::string ex(str, iter.base()); 120 assert(ex == "01750"); 121 } 122 { 123 std::ios ios(0); 124 hex(ios); 125 unsigned long v = 1000; 126 char str[50]; 127 std::ios_base::iostate err = ios.goodbit; 128 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 129 std::string ex(str, iter.base()); 130 assert(ex == "3e8"); 131 } 132 { 133 std::ios ios(0); 134 hex(ios); 135 showbase(ios); 136 unsigned long v = 1000; 137 char str[50]; 138 std::ios_base::iostate err = ios.goodbit; 139 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 140 std::string ex(str, iter.base()); 141 assert(ex == "0x3e8"); 142 } 143 { 144 std::ios ios(0); 145 hex(ios); 146 showbase(ios); 147 uppercase(ios); 148 unsigned long v = 1000; 149 char str[50]; 150 std::ios_base::iostate err = ios.goodbit; 151 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 152 std::string ex(str, iter.base()); 153 assert(ex == "0X3E8"); 154 } 155 { 156 std::ios ios(0); 157 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 158 hex(ios); 159 showbase(ios); 160 uppercase(ios); 161 unsigned long v = 1000; 162 char str[50]; 163 std::ios_base::iostate err = ios.goodbit; 164 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 165 std::string ex(str, iter.base()); 166 assert(ex == "0X3E_8"); 167 } 168 { 169 std::ios ios(0); 170 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 171 hex(ios); 172 showbase(ios); 173 unsigned long v = 2147483647; 174 char str[50]; 175 std::ios_base::iostate err = ios.goodbit; 176 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 177 std::string ex(str, iter.base()); 178 assert(ex == "0x7f_fff_ff_f"); 179 } 180 { 181 std::ios ios(0); 182 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 183 oct(ios); 184 unsigned long v = 0123467; 185 char str[50]; 186 std::ios_base::iostate err = ios.goodbit; 187 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 188 std::string ex(str, iter.base()); 189 assert(ex == "123_46_7"); 190 } 191 { 192 std::ios ios(0); 193 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 194 oct(ios); 195 showbase(ios); 196 unsigned long v = 0123467; 197 char str[50]; 198 std::ios_base::iostate err = ios.goodbit; 199 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 200 std::string ex(str, iter.base()); 201 assert(ex == "0_123_46_7"); 202 } 203 { 204 std::ios ios(0); 205 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 206 oct(ios); 207 showbase(ios); 208 right(ios); 209 ios.width(15); 210 unsigned long v = 0123467; 211 char str[50]; 212 std::ios_base::iostate err = ios.goodbit; 213 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 214 std::string ex(str, iter.base()); 215 assert(ex == "*****0_123_46_7"); 216 } 217 { 218 std::ios ios(0); 219 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 220 oct(ios); 221 showbase(ios); 222 left(ios); 223 ios.width(15); 224 unsigned long v = 0123467; 225 char str[50]; 226 std::ios_base::iostate err = ios.goodbit; 227 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 228 std::string ex(str, iter.base()); 229 assert(ex == "0_123_46_7*****"); 230 } 231 { 232 std::ios ios(0); 233 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 234 oct(ios); 235 showbase(ios); 236 internal(ios); 237 ios.width(15); 238 unsigned long v = 0123467; 239 char str[50]; 240 std::ios_base::iostate err = ios.goodbit; 241 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 242 std::string ex(str, iter.base()); 243 assert(ex == "*****0_123_46_7"); 244 assert(ios.width() == 0); 245 } 246 { 247 std::ios ios(0); 248 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 249 hex(ios); 250 showbase(ios); 251 right(ios); 252 ios.width(15); 253 unsigned long v = 2147483647; 254 char str[50]; 255 std::ios_base::iostate err = ios.goodbit; 256 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 257 std::string ex(str, iter.base()); 258 assert(ex == "**0x7f_fff_ff_f"); 259 } 260 { 261 std::ios ios(0); 262 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 263 hex(ios); 264 showbase(ios); 265 left(ios); 266 ios.width(15); 267 unsigned long v = 2147483647; 268 char str[50]; 269 std::ios_base::iostate err = ios.goodbit; 270 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 271 std::string ex(str, iter.base()); 272 assert(ex == "0x7f_fff_ff_f**"); 273 } 274 { 275 std::ios ios(0); 276 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 277 hex(ios); 278 showbase(ios); 279 internal(ios); 280 ios.width(15); 281 unsigned long v = 2147483647; 282 char str[50]; 283 std::ios_base::iostate err = ios.goodbit; 284 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 285 std::string ex(str, iter.base()); 286 assert(ex == "0x**7f_fff_ff_f"); 287 assert(ios.width() == 0); 288 } 289 { 290 std::ios ios(0); 291 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 292 showpos(ios); 293 unsigned long v = 1000; 294 right(ios); 295 ios.width(10); 296 char str[50]; 297 std::ios_base::iostate err = ios.goodbit; 298 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 299 std::string ex(str, iter.base()); 300 assert(ex == "****1_00_0"); 301 assert(ios.width() == 0); 302 } 303 { 304 std::ios ios(0); 305 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 306 showpos(ios); 307 unsigned long v = 1000; 308 left(ios); 309 ios.width(10); 310 char str[50]; 311 std::ios_base::iostate err = ios.goodbit; 312 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 313 std::string ex(str, iter.base()); 314 assert(ex == "1_00_0****"); 315 assert(ios.width() == 0); 316 } 317 { 318 std::ios ios(0); 319 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 320 showpos(ios); 321 unsigned long v = 1000; 322 internal(ios); 323 ios.width(10); 324 char str[50]; 325 std::ios_base::iostate err = ios.goodbit; 326 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 327 std::string ex(str, iter.base()); 328 assert(ex == "****1_00_0"); 329 assert(ios.width() == 0); 330 } 331 { 332 std::ios ios(0); 333 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 334 unsigned long v = -1000; 335 right(ios); 336 showpos(ios); 337 ios.width(10); 338 char str[50]; 339 std::ios_base::iostate err = ios.goodbit; 340 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 341 std::string ex(str, iter.base()); 342 assert(ex == (sizeof(unsigned long) == 4 ? "4_294_966_29_6" 343 : "18_446_744_073_709_550_61_6")); 344 assert(ios.width() == 0); 345 } 346 { 347 std::ios ios(0); 348 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 349 unsigned long v = -1000; 350 left(ios); 351 ios.width(10); 352 char str[50]; 353 std::ios_base::iostate err = ios.goodbit; 354 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 355 std::string ex(str, iter.base()); 356 assert(ex == (sizeof(unsigned long) == 4 ? "4_294_966_29_6" 357 : "18_446_744_073_709_550_61_6")); 358 assert(ios.width() == 0); 359 } 360 { 361 std::ios ios(0); 362 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 363 unsigned long v = -1000; 364 internal(ios); 365 ios.width(10); 366 char str[50]; 367 std::ios_base::iostate err = ios.goodbit; 368 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 369 std::string ex(str, iter.base()); 370 assert(ex == (sizeof(unsigned long) == 4 ? "4_294_966_29_6" 371 : "18_446_744_073_709_550_61_6")); 372 assert(ios.width() == 0); 373 } 374 } 375