annotate armadillo-3.900.4/include/armadillo_bits/format_wrap.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 // Copyright (C) 2008-2010 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2008-2010 Conrad Sanderson
Chris@49 3 //
Chris@49 4 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 5 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 7
Chris@49 8
Chris@49 9 //! \addtogroup format_wrap
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13 //! \namespace arma_boost namespace for functions and classes which partially emulate Boost functionality
Chris@49 14 namespace arma_boost
Chris@49 15 {
Chris@49 16
Chris@49 17 #if defined(ARMA_USE_BOOST_FORMAT)
Chris@49 18
Chris@49 19 using boost::format;
Chris@49 20 using boost::basic_format;
Chris@49 21 using boost::str;
Chris@49 22
Chris@49 23 #else
Chris@49 24
Chris@49 25 #if defined(ARMA_HAVE_STD_SNPRINTF)
Chris@49 26
Chris@49 27 #define arma_snprintf std::snprintf
Chris@49 28
Chris@49 29 #else
Chris@49 30
Chris@49 31 // better-than-nothing emulation of C99 snprintf(),
Chris@49 32 // with correct return value and null-terminated output string.
Chris@49 33 // note that _snprintf() provided by MS is not a good substitute for snprintf()
Chris@49 34
Chris@49 35 inline
Chris@49 36 int
Chris@49 37 arma_snprintf(char* out, size_t size, const char* fmt, ...)
Chris@49 38 {
Chris@49 39 size_t i;
Chris@49 40
Chris@49 41 for(i=0; i<size; ++i)
Chris@49 42 {
Chris@49 43 out[i] = fmt[i];
Chris@49 44 if(fmt[i] == char(0))
Chris@49 45 break;
Chris@49 46 }
Chris@49 47
Chris@49 48 if(size > 0)
Chris@49 49 out[size-1] = char(0);
Chris@49 50
Chris@49 51 return int(i);
Chris@49 52 }
Chris@49 53
Chris@49 54 #endif
Chris@49 55
Chris@49 56 class format
Chris@49 57 {
Chris@49 58 public:
Chris@49 59
Chris@49 60 format(const char* in_fmt)
Chris@49 61 : A(in_fmt)
Chris@49 62 {
Chris@49 63 }
Chris@49 64
Chris@49 65 format(const std::string& in_fmt)
Chris@49 66 : A(in_fmt)
Chris@49 67 {
Chris@49 68 }
Chris@49 69
Chris@49 70
Chris@49 71 const std::string A;
Chris@49 72
Chris@49 73 private:
Chris@49 74 format();
Chris@49 75 };
Chris@49 76
Chris@49 77
Chris@49 78
Chris@49 79 template<typename T1, typename T2>
Chris@49 80 class basic_format
Chris@49 81 {
Chris@49 82 public:
Chris@49 83
Chris@49 84 basic_format(const T1& in_A, const T2& in_B)
Chris@49 85 : A(in_A)
Chris@49 86 , B(in_B)
Chris@49 87 {
Chris@49 88 }
Chris@49 89
Chris@49 90 const T1& A;
Chris@49 91 const T2& B;
Chris@49 92
Chris@49 93 private:
Chris@49 94 basic_format();
Chris@49 95 };
Chris@49 96
Chris@49 97
Chris@49 98
Chris@49 99 template<typename T2>
Chris@49 100 inline
Chris@49 101 basic_format< format, T2 >
Chris@49 102 operator% (const format& X, const T2& arg)
Chris@49 103 {
Chris@49 104 return basic_format< format, T2 >(X, arg);
Chris@49 105 }
Chris@49 106
Chris@49 107
Chris@49 108
Chris@49 109 template<typename T1, typename T2, typename T3>
Chris@49 110 inline
Chris@49 111 basic_format< basic_format<T1,T2>, T3 >
Chris@49 112 operator% (const basic_format<T1,T2>& X, const T3& arg)
Chris@49 113 {
Chris@49 114 return basic_format< basic_format<T1,T2>, T3 >(X, arg);
Chris@49 115 }
Chris@49 116
Chris@49 117
Chris@49 118
Chris@49 119 template<typename T2>
Chris@49 120 inline
Chris@49 121 std::string
Chris@49 122 str(const basic_format< format, T2>& X)
Chris@49 123 {
Chris@49 124 char local_buffer[1024];
Chris@49 125 char* buffer = local_buffer;
Chris@49 126
Chris@49 127 int buffer_size = 1024;
Chris@49 128 int required_size = buffer_size;
Chris@49 129
Chris@49 130 bool using_local_buffer = true;
Chris@49 131
Chris@49 132 std::string out;
Chris@49 133
Chris@49 134 do
Chris@49 135 {
Chris@49 136 if(using_local_buffer == false)
Chris@49 137 {
Chris@49 138 buffer = new char[buffer_size];
Chris@49 139 }
Chris@49 140
Chris@49 141 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.c_str(), X.B);
Chris@49 142
Chris@49 143 if(required_size < buffer_size)
Chris@49 144 {
Chris@49 145 if(required_size > 0)
Chris@49 146 {
Chris@49 147 out = buffer;
Chris@49 148 }
Chris@49 149 }
Chris@49 150 else
Chris@49 151 {
Chris@49 152 buffer_size *= 2;
Chris@49 153 }
Chris@49 154
Chris@49 155 if(using_local_buffer == true)
Chris@49 156 {
Chris@49 157 using_local_buffer = false;
Chris@49 158 }
Chris@49 159 else
Chris@49 160 {
Chris@49 161 delete[] buffer;
Chris@49 162 }
Chris@49 163
Chris@49 164 } while( (required_size >= buffer_size) );
Chris@49 165
Chris@49 166 return out;
Chris@49 167 }
Chris@49 168
Chris@49 169
Chris@49 170
Chris@49 171 template<typename T2, typename T3>
Chris@49 172 inline
Chris@49 173 std::string
Chris@49 174 str(const basic_format< basic_format< format, T2>, T3>& X)
Chris@49 175 {
Chris@49 176 char local_buffer[1024];
Chris@49 177 char* buffer = local_buffer;
Chris@49 178
Chris@49 179 int buffer_size = 1024;
Chris@49 180 int required_size = buffer_size;
Chris@49 181
Chris@49 182 bool using_local_buffer = true;
Chris@49 183
Chris@49 184 std::string out;
Chris@49 185
Chris@49 186 do
Chris@49 187 {
Chris@49 188 if(using_local_buffer == false)
Chris@49 189 {
Chris@49 190 buffer = new char[buffer_size];
Chris@49 191 }
Chris@49 192
Chris@49 193 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.c_str(), X.A.B, X.B);
Chris@49 194
Chris@49 195 if(required_size < buffer_size)
Chris@49 196 {
Chris@49 197 if(required_size > 0)
Chris@49 198 {
Chris@49 199 out = buffer;
Chris@49 200 }
Chris@49 201 }
Chris@49 202 else
Chris@49 203 {
Chris@49 204 buffer_size *= 2;
Chris@49 205 }
Chris@49 206
Chris@49 207 if(using_local_buffer == true)
Chris@49 208 {
Chris@49 209 using_local_buffer = false;
Chris@49 210 }
Chris@49 211 else
Chris@49 212 {
Chris@49 213 delete[] buffer;
Chris@49 214 }
Chris@49 215
Chris@49 216 } while( (required_size >= buffer_size) );
Chris@49 217
Chris@49 218 return out;
Chris@49 219 }
Chris@49 220
Chris@49 221
Chris@49 222
Chris@49 223 template<typename T2, typename T3, typename T4>
Chris@49 224 inline
Chris@49 225 std::string
Chris@49 226 str(const basic_format< basic_format< basic_format< format, T2>, T3>, T4>& X)
Chris@49 227 {
Chris@49 228 char local_buffer[1024];
Chris@49 229 char* buffer = local_buffer;
Chris@49 230
Chris@49 231 int buffer_size = 1024;
Chris@49 232 int required_size = buffer_size;
Chris@49 233
Chris@49 234 bool using_local_buffer = true;
Chris@49 235
Chris@49 236 std::string out;
Chris@49 237
Chris@49 238 do
Chris@49 239 {
Chris@49 240 if(using_local_buffer == false)
Chris@49 241 {
Chris@49 242 buffer = new char[buffer_size];
Chris@49 243 }
Chris@49 244
Chris@49 245 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.c_str(), X.A.A.B, X.A.B, X.B);
Chris@49 246
Chris@49 247 if(required_size < buffer_size)
Chris@49 248 {
Chris@49 249 if(required_size > 0)
Chris@49 250 {
Chris@49 251 out = buffer;
Chris@49 252 }
Chris@49 253 }
Chris@49 254 else
Chris@49 255 {
Chris@49 256 buffer_size *= 2;
Chris@49 257 }
Chris@49 258
Chris@49 259 if(using_local_buffer == true)
Chris@49 260 {
Chris@49 261 using_local_buffer = false;
Chris@49 262 }
Chris@49 263 else
Chris@49 264 {
Chris@49 265 delete[] buffer;
Chris@49 266 }
Chris@49 267
Chris@49 268 } while( (required_size >= buffer_size) );
Chris@49 269
Chris@49 270 return out;
Chris@49 271 }
Chris@49 272
Chris@49 273
Chris@49 274
Chris@49 275 template<typename T2, typename T3, typename T4, typename T5>
Chris@49 276 inline
Chris@49 277 std::string
Chris@49 278 str(const basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>& X)
Chris@49 279 {
Chris@49 280 char local_buffer[1024];
Chris@49 281 char* buffer = local_buffer;
Chris@49 282
Chris@49 283 int buffer_size = 1024;
Chris@49 284 int required_size = buffer_size;
Chris@49 285
Chris@49 286 bool using_local_buffer = true;
Chris@49 287
Chris@49 288 std::string out;
Chris@49 289
Chris@49 290 do
Chris@49 291 {
Chris@49 292 if(using_local_buffer == false)
Chris@49 293 {
Chris@49 294 buffer = new char[buffer_size];
Chris@49 295 }
Chris@49 296
Chris@49 297 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.c_str(), X.A.A.A.B, X.A.A.B, X.A.B, X.B);
Chris@49 298
Chris@49 299 if(required_size < buffer_size)
Chris@49 300 {
Chris@49 301 if(required_size > 0)
Chris@49 302 {
Chris@49 303 out = buffer;
Chris@49 304 }
Chris@49 305 }
Chris@49 306 else
Chris@49 307 {
Chris@49 308 buffer_size *= 2;
Chris@49 309 }
Chris@49 310
Chris@49 311 if(using_local_buffer == true)
Chris@49 312 {
Chris@49 313 using_local_buffer = false;
Chris@49 314 }
Chris@49 315 else
Chris@49 316 {
Chris@49 317 delete[] buffer;
Chris@49 318 }
Chris@49 319
Chris@49 320 } while( (required_size >= buffer_size) );
Chris@49 321
Chris@49 322 return out;
Chris@49 323 }
Chris@49 324
Chris@49 325
Chris@49 326
Chris@49 327 template<typename T2, typename T3, typename T4, typename T5, typename T6>
Chris@49 328 inline
Chris@49 329 std::string
Chris@49 330 str(const basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>& X)
Chris@49 331 {
Chris@49 332 char local_buffer[1024];
Chris@49 333 char* buffer = local_buffer;
Chris@49 334
Chris@49 335 int buffer_size = 1024;
Chris@49 336 int required_size = buffer_size;
Chris@49 337
Chris@49 338 bool using_local_buffer = true;
Chris@49 339
Chris@49 340 std::string out;
Chris@49 341
Chris@49 342 do
Chris@49 343 {
Chris@49 344 if(using_local_buffer == false)
Chris@49 345 {
Chris@49 346 buffer = new char[buffer_size];
Chris@49 347 }
Chris@49 348
Chris@49 349 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.c_str(), X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B);
Chris@49 350
Chris@49 351 if(required_size < buffer_size)
Chris@49 352 {
Chris@49 353 if(required_size > 0)
Chris@49 354 {
Chris@49 355 out = buffer;
Chris@49 356 }
Chris@49 357 }
Chris@49 358 else
Chris@49 359 {
Chris@49 360 buffer_size *= 2;
Chris@49 361 }
Chris@49 362
Chris@49 363 if(using_local_buffer == true)
Chris@49 364 {
Chris@49 365 using_local_buffer = false;
Chris@49 366 }
Chris@49 367 else
Chris@49 368 {
Chris@49 369 delete[] buffer;
Chris@49 370 }
Chris@49 371
Chris@49 372 } while( (required_size >= buffer_size) );
Chris@49 373
Chris@49 374 return out;
Chris@49 375 }
Chris@49 376
Chris@49 377
Chris@49 378
Chris@49 379 template<typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
Chris@49 380 inline
Chris@49 381 std::string
Chris@49 382 str(const basic_format< basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>, T7>& X)
Chris@49 383 {
Chris@49 384 char local_buffer[1024];
Chris@49 385 char* buffer = local_buffer;
Chris@49 386
Chris@49 387 int buffer_size = 1024;
Chris@49 388 int required_size = buffer_size;
Chris@49 389
Chris@49 390 bool using_local_buffer = true;
Chris@49 391
Chris@49 392 std::string out;
Chris@49 393
Chris@49 394 do
Chris@49 395 {
Chris@49 396 if(using_local_buffer == false)
Chris@49 397 {
Chris@49 398 buffer = new char[buffer_size];
Chris@49 399 }
Chris@49 400
Chris@49 401 required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.A.c_str(), X.A.A.A.A.A.B, X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B);
Chris@49 402
Chris@49 403 if(required_size < buffer_size)
Chris@49 404 {
Chris@49 405 if(required_size > 0)
Chris@49 406 {
Chris@49 407 out = buffer;
Chris@49 408 }
Chris@49 409 }
Chris@49 410 else
Chris@49 411 {
Chris@49 412 buffer_size *= 2;
Chris@49 413 }
Chris@49 414
Chris@49 415 if(using_local_buffer == true)
Chris@49 416 {
Chris@49 417 using_local_buffer = false;
Chris@49 418 }
Chris@49 419 else
Chris@49 420 {
Chris@49 421 delete[] buffer;
Chris@49 422 }
Chris@49 423
Chris@49 424 } while( (required_size >= buffer_size) );
Chris@49 425
Chris@49 426 return out;
Chris@49 427 }
Chris@49 428
Chris@49 429
Chris@49 430
Chris@49 431 template<typename T1>
Chris@49 432 struct format_metaprog
Chris@49 433 {
Chris@49 434 static const uword depth = 0;
Chris@49 435
Chris@49 436 inline
Chris@49 437 static
Chris@49 438 const std::string&
Chris@49 439 get_fmt(const T1& X)
Chris@49 440 {
Chris@49 441 return X.A;
Chris@49 442 }
Chris@49 443 };
Chris@49 444
Chris@49 445
Chris@49 446
Chris@49 447 //template<>
Chris@49 448 template<typename T1, typename T2>
Chris@49 449 struct format_metaprog< basic_format<T1,T2> >
Chris@49 450 {
Chris@49 451 static const uword depth = 1 + format_metaprog<T1>::depth;
Chris@49 452
Chris@49 453 inline
Chris@49 454 static
Chris@49 455 const std::string&
Chris@49 456 get_fmt(const T1& X)
Chris@49 457 {
Chris@49 458 return format_metaprog<T1>::get_fmt(X.A);
Chris@49 459 }
Chris@49 460
Chris@49 461 };
Chris@49 462
Chris@49 463
Chris@49 464
Chris@49 465 template<typename T1, typename T2>
Chris@49 466 inline
Chris@49 467 std::string
Chris@49 468 str(const basic_format<T1,T2>& X)
Chris@49 469 {
Chris@49 470 return format_metaprog< basic_format<T1,T2> >::get_fmt(X.A);
Chris@49 471 }
Chris@49 472
Chris@49 473
Chris@49 474
Chris@49 475 template<typename T1, typename T2>
Chris@49 476 inline
Chris@49 477 std::ostream&
Chris@49 478 operator<< (std::ostream& o, const basic_format<T1,T2>& X)
Chris@49 479 {
Chris@49 480 o << str(X);
Chris@49 481 return o;
Chris@49 482 }
Chris@49 483
Chris@49 484
Chris@49 485 #endif
Chris@49 486
Chris@49 487
Chris@49 488 template<typename T> struct string_only { };
Chris@49 489 template<> struct string_only<std::string> { typedef std::string result; };
Chris@49 490
Chris@49 491 template<typename T> struct char_only { };
Chris@49 492 template<> struct char_only<char > { typedef char result; };
Chris@49 493
Chris@49 494 template<typename T>
Chris@49 495 struct basic_format_only { };
Chris@49 496
Chris@49 497 #if defined(ARMA_USE_BOOST_FORMAT)
Chris@49 498 template<typename T>
Chris@49 499 struct basic_format_only< basic_format<T> > { typedef basic_format<T> result; };
Chris@49 500 #else
Chris@49 501 template<typename T1, typename T2>
Chris@49 502 struct basic_format_only< basic_format<T1, T2> > { typedef basic_format<T1,T2> result; };
Chris@49 503 #endif
Chris@49 504
Chris@49 505
Chris@49 506
Chris@49 507 template<typename T1>
Chris@49 508 inline
Chris@49 509 static
Chris@49 510 const T1&
Chris@49 511 str_wrapper(const T1& x, const typename string_only<T1>::result* junk = 0)
Chris@49 512 {
Chris@49 513 arma_ignore(junk);
Chris@49 514
Chris@49 515 return x;
Chris@49 516 }
Chris@49 517
Chris@49 518
Chris@49 519
Chris@49 520 template<typename T1>
Chris@49 521 inline
Chris@49 522 static
Chris@49 523 const T1*
Chris@49 524 str_wrapper(const T1* x, const typename char_only<T1>::result* junk = 0)
Chris@49 525 {
Chris@49 526 arma_ignore(junk);
Chris@49 527
Chris@49 528 return x;
Chris@49 529 }
Chris@49 530
Chris@49 531
Chris@49 532
Chris@49 533 template<typename T1>
Chris@49 534 inline
Chris@49 535 static
Chris@49 536 std::string
Chris@49 537 str_wrapper(const T1& x, const typename basic_format_only<T1>::result* junk = 0)
Chris@49 538 {
Chris@49 539 arma_ignore(junk);
Chris@49 540
Chris@49 541 return str(x);
Chris@49 542 }
Chris@49 543
Chris@49 544 }
Chris@49 545
Chris@49 546 //! @}