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, 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 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 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 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 == "-1"); 72 } 73 { 74 std::ios ios(0); 75 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 == "-1000"); 81 } 82 { 83 std::ios ios(0); 84 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 == "***-1_00_0"); 343 assert(ios.width() == 0); 344 } 345 { 346 std::ios ios(0); 347 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 348 long v = -1000; 349 left(ios); 350 ios.width(10); 351 char str[50]; 352 std::ios_base::iostate err = ios.goodbit; 353 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 354 std::string ex(str, iter.base()); 355 assert(ex == "-1_00_0***"); 356 assert(ios.width() == 0); 357 } 358 { 359 std::ios ios(0); 360 ios.imbue(std::locale(std::locale::classic(), new my_numpunct)); 361 long v = -1000; 362 internal(ios); 363 ios.width(10); 364 char str[50]; 365 std::ios_base::iostate err = ios.goodbit; 366 output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v); 367 std::string ex(str, iter.base()); 368 assert(ex == "-***1_00_0"); 369 assert(ios.width() == 0); 370 } 371 } 372