1 /*
2 Formatting library for C++
3
4 Copyright (c) 2012 - 2016, Victor Zverovich
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9
10 1. Redistributions of source code must retain the above copyright notice, this
11 list of conditions and the following disclaimer.
12 2. Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
15
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #ifndef FMT_FORMAT_H_
29 #define FMT_FORMAT_H_
30
31 #include <cassert>
32 #include <clocale>
33 #include <cmath>
34 #include <cstdio>
35 #include <cstring>
36 #include <limits>
37 #include <memory>
38 #include <stdexcept>
39 #include <string>
40 #include <vector>
41 #include <utility>
42
43 // The fmt library version in the form major * 10000 + minor * 100 + patch.
44 #define FMT_VERSION 30002
45
46 #ifdef _SECURE_SCL
47 # define FMT_SECURE_SCL _SECURE_SCL
48 #else
49 # define FMT_SECURE_SCL 0
50 #endif
51
52 #if FMT_SECURE_SCL
53 # include <iterator>
54 #endif
55
56 #ifdef _MSC_VER
57 # define FMT_MSC_VER _MSC_VER
58 #else
59 # define FMT_MSC_VER 0
60 #endif
61
62 #if FMT_MSC_VER && FMT_MSC_VER <= 1500
63 typedef unsigned __int32 uint32_t;
64 typedef unsigned __int64 uint64_t;
65 typedef __int64 intmax_t;
66 #else
67 #include <stdint.h>
68 #endif
69
70 #if !defined(FMT_HEADER_ONLY) && defined(_WIN32)
71 # ifdef FMT_EXPORT
72 # define FMT_API __declspec(dllexport)
73 # elif defined(FMT_SHARED)
74 # define FMT_API __declspec(dllimport)
75 # endif
76 #endif
77 #ifndef FMT_API
78 # define FMT_API
79 #endif
80
81 #ifdef __GNUC__
82 # define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
83 # define FMT_GCC_EXTENSION __extension__
84 # if FMT_GCC_VERSION >= 406
85 # pragma GCC diagnostic push
86 // Disable the warning about "long long" which is sometimes reported even
87 // when using __extension__.
88 # pragma GCC diagnostic ignored "-Wlong-long"
89 // Disable the warning about declaration shadowing because it affects too
90 // many valid cases.
91 # pragma GCC diagnostic ignored "-Wshadow"
92 // Disable the warning about implicit conversions that may change the sign of
93 // an integer; silencing it otherwise would require many explicit casts.
94 # pragma GCC diagnostic ignored "-Wsign-conversion"
95 # endif
96 # if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__
97 # define FMT_HAS_GXX_CXX11 1
98 # endif
99 #else
100 # define FMT_GCC_EXTENSION
101 #endif
102
103 #if defined(__INTEL_COMPILER)
104 # define FMT_ICC_VERSION __INTEL_COMPILER
105 #elif defined(__ICL)
106 # define FMT_ICC_VERSION __ICL
107 #endif
108
109 #if defined(__clang__) && !defined(FMT_ICC_VERSION)
110 # pragma clang diagnostic push
111 # pragma clang diagnostic ignored "-Wdocumentation-unknown-command"
112 # pragma clang diagnostic ignored "-Wpadded"
113 #endif
114
115 #ifdef __GNUC_LIBSTD__
116 # define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__)
117 #endif
118
119 #ifdef __has_feature
120 # define FMT_HAS_FEATURE(x) __has_feature(x)
121 #else
122 # define FMT_HAS_FEATURE(x) 0
123 #endif
124
125 #ifdef __has_builtin
126 # define FMT_HAS_BUILTIN(x) __has_builtin(x)
127 #else
128 # define FMT_HAS_BUILTIN(x) 0
129 #endif
130
131 #ifdef __has_cpp_attribute
132 # define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
133 #else
134 # define FMT_HAS_CPP_ATTRIBUTE(x) 0
135 #endif
136
137 #ifndef FMT_USE_VARIADIC_TEMPLATES
138 // Variadic templates are available in GCC since version 4.4
139 // (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++
140 // since version 2013.
141 # define FMT_USE_VARIADIC_TEMPLATES \
142 (FMT_HAS_FEATURE(cxx_variadic_templates) || \
143 (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800)
144 #endif
145
146 #ifndef FMT_USE_RVALUE_REFERENCES
147 // Don't use rvalue references when compiling with clang and an old libstdc++
148 // as the latter doesn't provide std::move.
149 # if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402
150 # define FMT_USE_RVALUE_REFERENCES 0
151 # else
152 # define FMT_USE_RVALUE_REFERENCES \
153 (FMT_HAS_FEATURE(cxx_rvalue_references) || \
154 (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1600)
155 # endif
156 #endif
157
158 #if FMT_USE_RVALUE_REFERENCES
159 # include <utility> // for std::move
160 #endif
161
162 // Check if exceptions are disabled.
163 #if defined(__GNUC__) && !defined(__EXCEPTIONS)
164 # define FMT_EXCEPTIONS 0
165 #endif
166 #if FMT_MSC_VER && !_HAS_EXCEPTIONS
167 # define FMT_EXCEPTIONS 0
168 #endif
169 #ifndef FMT_EXCEPTIONS
170 # define FMT_EXCEPTIONS 1
171 #endif
172
173 #ifndef FMT_THROW
174 # if FMT_EXCEPTIONS
175 # define FMT_THROW(x) throw x
176 # else
177 # define FMT_THROW(x) assert(false)
178 # endif
179 #endif
180
181 // Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature).
182 #ifndef FMT_USE_NOEXCEPT
183 # define FMT_USE_NOEXCEPT 0
184 #endif
185
186 #if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \
187 (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \
188 FMT_MSC_VER >= 1900
189 # define FMT_DETECTED_NOEXCEPT noexcept
190 #else
191 # define FMT_DETECTED_NOEXCEPT throw()
192 #endif
193
194 #ifndef FMT_NOEXCEPT
195 # if FMT_EXCEPTIONS
196 # define FMT_NOEXCEPT FMT_DETECTED_NOEXCEPT
197 # else
198 # define FMT_NOEXCEPT
199 # endif
200 #endif
201
202 // This is needed because GCC still uses throw() in its headers when exceptions
203 // are disabled.
204 #if FMT_GCC_VERSION
205 # define FMT_DTOR_NOEXCEPT FMT_DETECTED_NOEXCEPT
206 #else
207 # define FMT_DTOR_NOEXCEPT FMT_NOEXCEPT
208 #endif
209
210 #ifndef FMT_OVERRIDE
211 # if (defined(FMT_USE_OVERRIDE) && FMT_USE_OVERRIDE) || FMT_HAS_FEATURE(cxx_override) || \
212 (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \
213 FMT_MSC_VER >= 1900
214 # define FMT_OVERRIDE override
215 # else
216 # define FMT_OVERRIDE
217 # endif
218 #endif
219
220 #ifndef FMT_NULL
221 # if FMT_HAS_FEATURE(cxx_nullptr) || \
222 (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \
223 FMT_MSC_VER >= 1600
224 # define FMT_NULL nullptr
225 # else
226 # define FMT_NULL NULL
227 # endif
228 #endif
229
230 // A macro to disallow the copy constructor and operator= functions
231 // This should be used in the private: declarations for a class
232 #ifndef FMT_USE_DELETED_FUNCTIONS
233 # define FMT_USE_DELETED_FUNCTIONS 0
234 #endif
235
236 #if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \
237 (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800
238 # define FMT_DELETED_OR_UNDEFINED = delete
239 # define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \
240 TypeName(const TypeName&) = delete; \
241 TypeName& operator=(const TypeName&) = delete
242 #else
243 # define FMT_DELETED_OR_UNDEFINED
244 # define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \
245 TypeName(const TypeName&); \
246 TypeName& operator=(const TypeName&)
247 #endif
248
249 #ifndef FMT_USE_USER_DEFINED_LITERALS
250 // All compilers which support UDLs also support variadic templates. This
251 // makes the fmt::literals implementation easier. However, an explicit check
252 // for variadic templates is added here just in case.
253 // For Intel's compiler both it and the system gcc/msc must support UDLs.
254 # define FMT_USE_USER_DEFINED_LITERALS \
255 FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \
256 (FMT_HAS_FEATURE(cxx_user_literals) || \
257 (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900) && \
258 (!defined(FMT_ICC_VERSION) || FMT_ICC_VERSION >= 1500)
259 #endif
260
261 #ifndef FMT_USE_EXTERN_TEMPLATES
262 // Clang doesn't have a feature check for extern templates so we check
263 // for variadic templates which were introduced in the same version.
264 // For GCC according to cppreference.com they were introduced in 3.3.
265 # define FMT_USE_EXTERN_TEMPLATES \
266 ((__clang__ && FMT_USE_VARIADIC_TEMPLATES) || \
267 (FMT_GCC_VERSION >= 303 && FMT_HAS_GXX_CXX11))
268 #endif
269
270 #ifdef FMT_HEADER_ONLY
271 // If header only do not use extern templates.
272 # undef FMT_USE_EXTERN_TEMPLATES
273 # define FMT_USE_EXTERN_TEMPLATES 0
274 #endif
275
276 #ifndef FMT_ASSERT
277 # define FMT_ASSERT(condition, message) assert((condition) && message)
278 #endif
279
280 #if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz)
281 # define FMT_BUILTIN_CLZ(n) __builtin_clz(n)
282 #endif
283
284 #if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll)
285 # define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n)
286 #endif
287
288 // Some compilers masquerade as both MSVC and GCC-likes or
289 // otherwise support __builtin_clz and __builtin_clzll, so
290 // only define FMT_BUILTIN_CLZ using the MSVC intrinsics
291 // if the clz and clzll builtins are not available.
292 #if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL)
293 # include <intrin.h> // _BitScanReverse, _BitScanReverse64
294
295 namespace fmt {
296 namespace internal {
297 # pragma intrinsic(_BitScanReverse)
clz(uint32_t x)298 inline uint32_t clz(uint32_t x) {
299 unsigned long r = 0;
300 _BitScanReverse(&r, x);
301
302 assert(x != 0);
303 // Static analysis complains about using uninitialized data
304 // "r", but the only way that can happen is if "x" is 0,
305 // which the callers guarantee to not happen.
306 # pragma warning(suppress: 6102)
307 return 31 - r;
308 }
309 # define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n)
310
311 # ifdef _WIN64
312 # pragma intrinsic(_BitScanReverse64)
313 # endif
314
clzll(uint64_t x)315 inline uint32_t clzll(uint64_t x) {
316 unsigned long r = 0;
317 # ifdef _WIN64
318 _BitScanReverse64(&r, x);
319 # else
320 // Scan the high 32 bits.
321 if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32)))
322 return 63 - (r + 32);
323
324 // Scan the low 32 bits.
325 _BitScanReverse(&r, static_cast<uint32_t>(x));
326 # endif
327
328 assert(x != 0);
329 // Static analysis complains about using uninitialized data
330 // "r", but the only way that can happen is if "x" is 0,
331 // which the callers guarantee to not happen.
332 # pragma warning(suppress: 6102)
333 return 63 - r;
334 }
335 # define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n)
336 }
337 }
338 #endif
339
340 namespace fmt {
341 namespace internal {
342 struct DummyInt {
343 int data[2];
344 operator int() const { return 0; }
345 };
346 typedef std::numeric_limits<fmt::internal::DummyInt> FPUtil;
347
348 // Dummy implementations of system functions such as signbit and ecvt called
349 // if the latter are not available.
signbit(...)350 inline DummyInt signbit(...) { return DummyInt(); }
_ecvt_s(...)351 inline DummyInt _ecvt_s(...) { return DummyInt(); }
isinf(...)352 inline DummyInt isinf(...) { return DummyInt(); }
_finite(...)353 inline DummyInt _finite(...) { return DummyInt(); }
isnan(...)354 inline DummyInt isnan(...) { return DummyInt(); }
_isnan(...)355 inline DummyInt _isnan(...) { return DummyInt(); }
356
357 // A helper function to suppress bogus "conditional expression is constant"
358 // warnings.
359 template <typename T>
const_check(T value)360 inline T const_check(T value) { return value; }
361 }
362 } // namespace fmt
363
364 namespace std {
365 // Standard permits specialization of std::numeric_limits. This specialization
366 // is used to resolve ambiguity between isinf and std::isinf in glibc:
367 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891
368 // and the same for isnan and signbit.
369 template <>
370 class numeric_limits<fmt::internal::DummyInt> :
371 public std::numeric_limits<int> {
372 public:
373 // Portable version of isinf.
374 template <typename T>
isinfinity(T x)375 static bool isinfinity(T x) {
376 using namespace fmt::internal;
377 // The resolution "priority" is:
378 // isinf macro > std::isinf > ::isinf > fmt::internal::isinf
379 if (const_check(sizeof(isinf(x)) == sizeof(bool) ||
380 sizeof(isinf(x)) == sizeof(int))) {
381 return isinf(x) != 0;
382 }
383 return !_finite(static_cast<double>(x));
384 }
385
386 // Portable version of isnan.
387 template <typename T>
isnotanumber(T x)388 static bool isnotanumber(T x) {
389 using namespace fmt::internal;
390 if (const_check(sizeof(isnan(x)) == sizeof(bool) ||
391 sizeof(isnan(x)) == sizeof(int))) {
392 return isnan(x) != 0;
393 }
394 return _isnan(static_cast<double>(x)) != 0;
395 }
396
397 // Portable version of signbit.
isnegative(double x)398 static bool isnegative(double x) {
399 using namespace fmt::internal;
400 if (const_check(sizeof(signbit(x)) == sizeof(bool) ||
401 sizeof(signbit(x)) == sizeof(int))) {
402 return signbit(x) != 0;
403 }
404 if (x < 0) return true;
405 if (!isnotanumber(x)) return false;
406 int dec = 0, sign = 0;
407 char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail.
408 _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign);
409 return sign != 0;
410 }
411 };
412 } // namespace std
413
414 namespace fmt {
415
416 // Fix the warning about long long on older versions of GCC
417 // that don't support the diagnostic pragma.
418 FMT_GCC_EXTENSION typedef long long LongLong;
419 FMT_GCC_EXTENSION typedef unsigned long long ULongLong;
420
421 #if FMT_USE_RVALUE_REFERENCES
422 using std::move;
423 #endif
424
425 template <typename Char>
426 class BasicWriter;
427
428 typedef BasicWriter<char> Writer;
429 typedef BasicWriter<wchar_t> WWriter;
430
431 template <typename Char>
432 class ArgFormatter;
433
434 template <typename Impl, typename Char>
435 class BasicPrintfArgFormatter;
436
437 template <typename CharType,
438 typename ArgFormatter = fmt::ArgFormatter<CharType> >
439 class BasicFormatter;
440
441 /**
442 \rst
443 A string reference. It can be constructed from a C string or
444 ``std::basic_string``.
445
446 You can use one of the following typedefs for common character types:
447
448 +------------+-------------------------+
449 | Type | Definition |
450 +============+=========================+
451 | StringRef | BasicStringRef<char> |
452 +------------+-------------------------+
453 | WStringRef | BasicStringRef<wchar_t> |
454 +------------+-------------------------+
455
456 This class is most useful as a parameter type to allow passing
457 different types of strings to a function, for example::
458
459 template <typename... Args>
460 std::string format(StringRef format_str, const Args & ... args);
461
462 format("{}", 42);
463 format(std::string("{}"), 42);
464 \endrst
465 */
466 template <typename Char>
467 class BasicStringRef {
468 private:
469 const Char *data_;
470 std::size_t size_;
471
472 public:
473 /** Constructs a string reference object from a C string and a size. */
BasicStringRef(const Char * s,std::size_t size)474 BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {}
475
476 /**
477 \rst
478 Constructs a string reference object from a C string computing
479 the size with ``std::char_traits<Char>::length``.
480 \endrst
481 */
BasicStringRef(const Char * s)482 BasicStringRef(const Char *s)
483 : data_(s), size_(std::char_traits<Char>::length(s)) {}
484
485 /**
486 \rst
487 Constructs a string reference from a ``std::basic_string`` object.
488 \endrst
489 */
490 template <typename Allocator>
BasicStringRef(const std::basic_string<Char,std::char_traits<Char>,Allocator> & s)491 BasicStringRef(
492 const std::basic_string<Char, std::char_traits<Char>, Allocator> &s)
493 : data_(s.c_str()), size_(s.size()) {}
494
495 /**
496 \rst
497 Converts a string reference to an ``std::string`` object.
498 \endrst
499 */
to_string()500 std::basic_string<Char> to_string() const {
501 return std::basic_string<Char>(data_, size_);
502 }
503
504 /** Returns a pointer to the string data. */
data()505 const Char *data() const { return data_; }
506
507 /** Returns the string size. */
size()508 std::size_t size() const { return size_; }
509
510 // Lexicographically compare this string reference to other.
compare(BasicStringRef other)511 int compare(BasicStringRef other) const {
512 std::size_t size = size_ < other.size_ ? size_ : other.size_;
513 int result = std::char_traits<Char>::compare(data_, other.data_, size);
514 if (result == 0)
515 result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1);
516 return result;
517 }
518
519 friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) {
520 return lhs.compare(rhs) == 0;
521 }
522 friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) {
523 return lhs.compare(rhs) != 0;
524 }
525 friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) {
526 return lhs.compare(rhs) < 0;
527 }
528 friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) {
529 return lhs.compare(rhs) <= 0;
530 }
531 friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) {
532 return lhs.compare(rhs) > 0;
533 }
534 friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) {
535 return lhs.compare(rhs) >= 0;
536 }
537 };
538
539 typedef BasicStringRef<char> StringRef;
540 typedef BasicStringRef<wchar_t> WStringRef;
541
542 /**
543 \rst
544 A reference to a null terminated string. It can be constructed from a C
545 string or ``std::basic_string``.
546
547 You can use one of the following typedefs for common character types:
548
549 +-------------+--------------------------+
550 | Type | Definition |
551 +=============+==========================+
552 | CStringRef | BasicCStringRef<char> |
553 +-------------+--------------------------+
554 | WCStringRef | BasicCStringRef<wchar_t> |
555 +-------------+--------------------------+
556
557 This class is most useful as a parameter type to allow passing
558 different types of strings to a function, for example::
559
560 template <typename... Args>
561 std::string format(CStringRef format_str, const Args & ... args);
562
563 format("{}", 42);
564 format(std::string("{}"), 42);
565 \endrst
566 */
567 template <typename Char>
568 class BasicCStringRef {
569 private:
570 const Char *data_;
571
572 public:
573 /** Constructs a string reference object from a C string. */
BasicCStringRef(const Char * s)574 BasicCStringRef(const Char *s) : data_(s) {}
575
576 /**
577 \rst
578 Constructs a string reference from a ``std::basic_string`` object.
579 \endrst
580 */
581 template <typename Allocator>
BasicCStringRef(const std::basic_string<Char,std::char_traits<Char>,Allocator> & s)582 BasicCStringRef(
583 const std::basic_string<Char, std::char_traits<Char>, Allocator> &s)
584 : data_(s.c_str()) {}
585
586 /** Returns the pointer to a C string. */
c_str()587 const Char *c_str() const { return data_; }
588 };
589
590 typedef BasicCStringRef<char> CStringRef;
591 typedef BasicCStringRef<wchar_t> WCStringRef;
592
593 /** A formatting error such as invalid format string. */
594 class FormatError : public std::runtime_error {
595 public:
FormatError(CStringRef message)596 explicit FormatError(CStringRef message)
597 : std::runtime_error(message.c_str()) {}
FormatError(const FormatError & ferr)598 FormatError(const FormatError &ferr) : std::runtime_error(ferr) {}
599 ~FormatError() FMT_DTOR_NOEXCEPT;
600 };
601
602 namespace internal {
603
604 // MakeUnsigned<T>::Type gives an unsigned type corresponding to integer type T.
605 template <typename T>
606 struct MakeUnsigned { typedef T Type; };
607
608 #define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \
609 template <> \
610 struct MakeUnsigned<T> { typedef U Type; }
611
612 FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char);
613 FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char);
614 FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short);
615 FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned);
616 FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long);
617 FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong);
618
619 // Casts nonnegative integer to unsigned.
620 template <typename Int>
to_unsigned(Int value)621 inline typename MakeUnsigned<Int>::Type to_unsigned(Int value) {
622 FMT_ASSERT(value >= 0, "negative value");
623 return static_cast<typename MakeUnsigned<Int>::Type>(value);
624 }
625
626 // The number of characters to store in the MemoryBuffer object itself
627 // to avoid dynamic memory allocation.
628 enum { INLINE_BUFFER_SIZE = 500 };
629
630 #if FMT_SECURE_SCL
631 // Use checked iterator to avoid warnings on MSVC.
632 template <typename T>
make_ptr(T * ptr,std::size_t size)633 inline stdext::checked_array_iterator<T*> make_ptr(T *ptr, std::size_t size) {
634 return stdext::checked_array_iterator<T*>(ptr, size);
635 }
636 #else
637 template <typename T>
make_ptr(T * ptr,std::size_t)638 inline T *make_ptr(T *ptr, std::size_t) { return ptr; }
639 #endif
640 } // namespace internal
641
642 /**
643 \rst
644 A buffer supporting a subset of ``std::vector``'s operations.
645 \endrst
646 */
647 template <typename T>
648 class Buffer {
649 private:
650 FMT_DISALLOW_COPY_AND_ASSIGN(Buffer);
651
652 protected:
653 T *ptr_;
654 std::size_t size_;
655 std::size_t capacity_;
656
657 Buffer(T *ptr = FMT_NULL, std::size_t capacity = 0)
ptr_(ptr)658 : ptr_(ptr), size_(0), capacity_(capacity) {}
659
660 /**
661 \rst
662 Increases the buffer capacity to hold at least *size* elements updating
663 ``ptr_`` and ``capacity_``.
664 \endrst
665 */
666 virtual void grow(std::size_t size) = 0;
667
668 public:
~Buffer()669 virtual ~Buffer() {}
670
671 /** Returns the size of this buffer. */
size()672 std::size_t size() const { return size_; }
673
674 /** Returns the capacity of this buffer. */
capacity()675 std::size_t capacity() const { return capacity_; }
676
677 /**
678 Resizes the buffer. If T is a POD type new elements may not be initialized.
679 */
resize(std::size_t new_size)680 void resize(std::size_t new_size) {
681 if (new_size > capacity_)
682 grow(new_size);
683 size_ = new_size;
684 }
685
686 /**
687 \rst
688 Reserves space to store at least *capacity* elements.
689 \endrst
690 */
reserve(std::size_t capacity)691 void reserve(std::size_t capacity) {
692 if (capacity > capacity_)
693 grow(capacity);
694 }
695
clear()696 void clear() FMT_NOEXCEPT { size_ = 0; }
697
push_back(const T & value)698 void push_back(const T &value) {
699 if (size_ == capacity_)
700 grow(size_ + 1);
701 ptr_[size_++] = value;
702 }
703
704 /** Appends data to the end of the buffer. */
705 template <typename U>
706 void append(const U *begin, const U *end);
707
708 T &operator[](std::size_t index) { return ptr_[index]; }
709 const T &operator[](std::size_t index) const { return ptr_[index]; }
710 };
711
712 template <typename T>
713 template <typename U>
append(const U * begin,const U * end)714 void Buffer<T>::append(const U *begin, const U *end) {
715 std::size_t new_size = size_ + internal::to_unsigned(end - begin);
716 if (new_size > capacity_)
717 grow(new_size);
718 std::uninitialized_copy(begin, end,
719 internal::make_ptr(ptr_, capacity_) + size_);
720 size_ = new_size;
721 }
722
723 namespace internal {
724
725 // A memory buffer for trivially copyable/constructible types with the first
726 // SIZE elements stored in the object itself.
727 template <typename T, std::size_t SIZE, typename Allocator = std::allocator<T> >
728 class MemoryBuffer : private Allocator, public Buffer<T> {
729 private:
730 T data_[SIZE];
731
732 // Deallocate memory allocated by the buffer.
deallocate()733 void deallocate() {
734 if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_);
735 }
736
737 protected:
738 void grow(std::size_t size) FMT_OVERRIDE;
739
740 public:
741 explicit MemoryBuffer(const Allocator &alloc = Allocator())
Allocator(alloc)742 : Allocator(alloc), Buffer<T>(data_, SIZE) {}
~MemoryBuffer()743 ~MemoryBuffer() { deallocate(); }
744
745 #if FMT_USE_RVALUE_REFERENCES
746 private:
747 // Move data from other to this buffer.
move(MemoryBuffer & other)748 void move(MemoryBuffer &other) {
749 Allocator &this_alloc = *this, &other_alloc = other;
750 this_alloc = std::move(other_alloc);
751 this->size_ = other.size_;
752 this->capacity_ = other.capacity_;
753 if (other.ptr_ == other.data_) {
754 this->ptr_ = data_;
755 std::uninitialized_copy(other.data_, other.data_ + this->size_,
756 make_ptr(data_, this->capacity_));
757 } else {
758 this->ptr_ = other.ptr_;
759 // Set pointer to the inline array so that delete is not called
760 // when deallocating.
761 other.ptr_ = other.data_;
762 }
763 }
764
765 public:
MemoryBuffer(MemoryBuffer && other)766 MemoryBuffer(MemoryBuffer &&other) {
767 move(other);
768 }
769
770 MemoryBuffer &operator=(MemoryBuffer &&other) {
771 assert(this != &other);
772 deallocate();
773 move(other);
774 return *this;
775 }
776 #endif
777
778 // Returns a copy of the allocator associated with this buffer.
get_allocator()779 Allocator get_allocator() const { return *this; }
780 };
781
782 template <typename T, std::size_t SIZE, typename Allocator>
grow(std::size_t size)783 void MemoryBuffer<T, SIZE, Allocator>::grow(std::size_t size) {
784 std::size_t new_capacity = this->capacity_ + this->capacity_ / 2;
785 if (size > new_capacity)
786 new_capacity = size;
787 T *new_ptr = this->allocate(new_capacity, FMT_NULL);
788 // The following code doesn't throw, so the raw pointer above doesn't leak.
789 std::uninitialized_copy(this->ptr_, this->ptr_ + this->size_,
790 make_ptr(new_ptr, new_capacity));
791 std::size_t old_capacity = this->capacity_;
792 T *old_ptr = this->ptr_;
793 this->capacity_ = new_capacity;
794 this->ptr_ = new_ptr;
795 // deallocate may throw (at least in principle), but it doesn't matter since
796 // the buffer already uses the new storage and will deallocate it in case
797 // of exception.
798 if (old_ptr != data_)
799 Allocator::deallocate(old_ptr, old_capacity);
800 }
801
802 // A fixed-size buffer.
803 template <typename Char>
804 class FixedBuffer : public fmt::Buffer<Char> {
805 public:
FixedBuffer(Char * array,std::size_t size)806 FixedBuffer(Char *array, std::size_t size) : fmt::Buffer<Char>(array, size) {}
807
808 protected:
809 FMT_API void grow(std::size_t size) FMT_OVERRIDE;
810 };
811
812 template <typename Char>
813 class BasicCharTraits {
814 public:
815 #if FMT_SECURE_SCL
816 typedef stdext::checked_array_iterator<Char*> CharPtr;
817 #else
818 typedef Char *CharPtr;
819 #endif
cast(int value)820 static Char cast(int value) { return static_cast<Char>(value); }
821 };
822
823 template <typename Char>
824 class CharTraits;
825
826 template <>
827 class CharTraits<char> : public BasicCharTraits<char> {
828 private:
829 // Conversion from wchar_t to char is not allowed.
830 static char convert(wchar_t);
831
832 public:
convert(char value)833 static char convert(char value) { return value; }
834
835 // Formats a floating-point number.
836 template <typename T>
837 FMT_API static int format_float(char *buffer, std::size_t size,
838 const char *format, unsigned width, int precision, T value);
839 };
840
841 #if FMT_USE_EXTERN_TEMPLATES
842 extern template int CharTraits<char>::format_float<double>
843 (char *buffer, std::size_t size,
844 const char* format, unsigned width, int precision, double value);
845 extern template int CharTraits<char>::format_float<long double>
846 (char *buffer, std::size_t size,
847 const char* format, unsigned width, int precision, long double value);
848 #endif
849
850 template <>
851 class CharTraits<wchar_t> : public BasicCharTraits<wchar_t> {
852 public:
convert(char value)853 static wchar_t convert(char value) { return value; }
convert(wchar_t value)854 static wchar_t convert(wchar_t value) { return value; }
855
856 template <typename T>
857 FMT_API static int format_float(wchar_t *buffer, std::size_t size,
858 const wchar_t *format, unsigned width, int precision, T value);
859 };
860
861 #if FMT_USE_EXTERN_TEMPLATES
862 extern template int CharTraits<wchar_t>::format_float<double>
863 (wchar_t *buffer, std::size_t size,
864 const wchar_t* format, unsigned width, int precision, double value);
865 extern template int CharTraits<wchar_t>::format_float<long double>
866 (wchar_t *buffer, std::size_t size,
867 const wchar_t* format, unsigned width, int precision, long double value);
868 #endif
869
870 // Checks if a number is negative - used to avoid warnings.
871 template <bool IsSigned>
872 struct SignChecker {
873 template <typename T>
is_negativeSignChecker874 static bool is_negative(T value) { return value < 0; }
875 };
876
877 template <>
878 struct SignChecker<false> {
879 template <typename T>
880 static bool is_negative(T) { return false; }
881 };
882
883 // Returns true if value is negative, false otherwise.
884 // Same as (value < 0) but doesn't produce warnings if T is an unsigned type.
885 template <typename T>
886 inline bool is_negative(T value) {
887 return SignChecker<std::numeric_limits<T>::is_signed>::is_negative(value);
888 }
889
890 // Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise.
891 template <bool FitsIn32Bits>
892 struct TypeSelector { typedef uint32_t Type; };
893
894 template <>
895 struct TypeSelector<false> { typedef uint64_t Type; };
896
897 template <typename T>
898 struct IntTraits {
899 // Smallest of uint32_t and uint64_t that is large enough to represent
900 // all values of T.
901 typedef typename
902 TypeSelector<std::numeric_limits<T>::digits <= 32>::Type MainType;
903 };
904
905 FMT_API void report_unknown_type(char code, const char *type);
906
907 // Static data is placed in this class template to allow header-only
908 // configuration.
909 template <typename T = void>
910 struct FMT_API BasicData {
911 static const uint32_t POWERS_OF_10_32[];
912 static const uint64_t POWERS_OF_10_64[];
913 static const char DIGITS[];
914 };
915
916 #if FMT_USE_EXTERN_TEMPLATES
917 extern template struct BasicData<void>;
918 #endif
919
920 typedef BasicData<> Data;
921
922 #ifdef FMT_BUILTIN_CLZLL
923 // Returns the number of decimal digits in n. Leading zeros are not counted
924 // except for n == 0 in which case count_digits returns 1.
925 inline unsigned count_digits(uint64_t n) {
926 // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
927 // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits.
928 int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12;
929 return to_unsigned(t) - (n < Data::POWERS_OF_10_64[t]) + 1;
930 }
931 #else
932 // Fallback version of count_digits used when __builtin_clz is not available.
933 inline unsigned count_digits(uint64_t n) {
934 unsigned count = 1;
935 for (;;) {
936 // Integer division is slow so do it for a group of four digits instead
937 // of for every digit. The idea comes from the talk by Alexandrescu
938 // "Three Optimization Tips for C++". See speed-test for a comparison.
939 if (n < 10) return count;
940 if (n < 100) return count + 1;
941 if (n < 1000) return count + 2;
942 if (n < 10000) return count + 3;
943 n /= 10000u;
944 count += 4;
945 }
946 }
947 #endif
948
949 #ifdef FMT_BUILTIN_CLZ
950 // Optional version of count_digits for better performance on 32-bit platforms.
951 inline unsigned count_digits(uint32_t n) {
952 int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12;
953 return to_unsigned(t) - (n < Data::POWERS_OF_10_32[t]) + 1;
954 }
955 #endif
956
957 // A functor that doesn't add a thousands separator.
958 struct NoThousandsSep {
959 template <typename Char>
960 void operator()(Char *) {}
961 };
962
963 // A functor that adds a thousands separator.
964 class ThousandsSep {
965 private:
966 fmt::StringRef sep_;
967
968 // Index of a decimal digit with the least significant digit having index 0.
969 unsigned digit_index_;
970
971 public:
972 explicit ThousandsSep(fmt::StringRef sep) : sep_(sep), digit_index_(0) {}
973
974 template <typename Char>
975 void operator()(Char *&buffer) {
976 if (++digit_index_ % 3 != 0)
977 return;
978 buffer -= sep_.size();
979 std::uninitialized_copy(sep_.data(), sep_.data() + sep_.size(),
980 internal::make_ptr(buffer, sep_.size()));
981 }
982 };
983
984 // Formats a decimal unsigned integer value writing into buffer.
985 // thousands_sep is a functor that is called after writing each char to
986 // add a thousands separator if necessary.
987 template <typename UInt, typename Char, typename ThousandsSep>
988 inline void format_decimal(Char *buffer, UInt value, unsigned num_digits,
989 ThousandsSep thousands_sep) {
990 buffer += num_digits;
991 while (value >= 100) {
992 // Integer division is slow so do it for a group of two digits instead
993 // of for every digit. The idea comes from the talk by Alexandrescu
994 // "Three Optimization Tips for C++". See speed-test for a comparison.
995 unsigned index = static_cast<unsigned>((value % 100) * 2);
996 value /= 100;
997 *--buffer = Data::DIGITS[index + 1];
998 thousands_sep(buffer);
999 *--buffer = Data::DIGITS[index];
1000 thousands_sep(buffer);
1001 }
1002 if (value < 10) {
1003 *--buffer = static_cast<char>('0' + value);
1004 return;
1005 }
1006 unsigned index = static_cast<unsigned>(value * 2);
1007 *--buffer = Data::DIGITS[index + 1];
1008 thousands_sep(buffer);
1009 *--buffer = Data::DIGITS[index];
1010 }
1011
1012 template <typename UInt, typename Char>
1013 inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) {
1014 format_decimal(buffer, value, num_digits, NoThousandsSep());
1015 return;
1016 }
1017
1018 #ifndef _WIN32
1019 # define FMT_USE_WINDOWS_H 0
1020 #elif !defined(FMT_USE_WINDOWS_H)
1021 # define FMT_USE_WINDOWS_H 1
1022 #endif
1023
1024 // Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h.
1025 // All the functionality that relies on it will be disabled too.
1026 #if FMT_USE_WINDOWS_H
1027 // A converter from UTF-8 to UTF-16.
1028 // It is only provided for Windows since other systems support UTF-8 natively.
1029 class UTF8ToUTF16 {
1030 private:
1031 MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer_;
1032
1033 public:
1034 FMT_API explicit UTF8ToUTF16(StringRef s);
1035 operator WStringRef() const { return WStringRef(&buffer_[0], size()); }
1036 size_t size() const { return buffer_.size() - 1; }
1037 const wchar_t *c_str() const { return &buffer_[0]; }
1038 std::wstring str() const { return std::wstring(&buffer_[0], size()); }
1039 };
1040
1041 // A converter from UTF-16 to UTF-8.
1042 // It is only provided for Windows since other systems support UTF-8 natively.
1043 class UTF16ToUTF8 {
1044 private:
1045 MemoryBuffer<char, INLINE_BUFFER_SIZE> buffer_;
1046
1047 public:
1048 UTF16ToUTF8() {}
1049 FMT_API explicit UTF16ToUTF8(WStringRef s);
1050 operator StringRef() const { return StringRef(&buffer_[0], size()); }
1051 size_t size() const { return buffer_.size() - 1; }
1052 const char *c_str() const { return &buffer_[0]; }
1053 std::string str() const { return std::string(&buffer_[0], size()); }
1054
1055 // Performs conversion returning a system error code instead of
1056 // throwing exception on conversion error. This method may still throw
1057 // in case of memory allocation error.
1058 FMT_API int convert(WStringRef s);
1059 };
1060
1061 FMT_API void format_windows_error(fmt::Writer &out, int error_code,
1062 fmt::StringRef message) FMT_NOEXCEPT;
1063 #endif
1064
1065 // A formatting argument value.
1066 struct Value {
1067 template <typename Char>
1068 struct StringValue {
1069 const Char *value;
1070 std::size_t size;
1071 };
1072
1073 typedef void (*FormatFunc)(
1074 void *formatter, const void *arg, void *format_str_ptr);
1075
1076 struct CustomValue {
1077 const void *value;
1078 FormatFunc format;
1079 };
1080
1081 union {
1082 int int_value;
1083 unsigned uint_value;
1084 LongLong long_long_value;
1085 ULongLong ulong_long_value;
1086 double double_value;
1087 long double long_double_value;
1088 const void *pointer;
1089 StringValue<char> string;
1090 StringValue<signed char> sstring;
1091 StringValue<unsigned char> ustring;
1092 StringValue<wchar_t> wstring;
1093 CustomValue custom;
1094 };
1095
1096 enum Type {
1097 NONE, NAMED_ARG,
1098 // Integer types should go first,
1099 INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR,
1100 // followed by floating-point types.
1101 DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE,
1102 CSTRING, STRING, WSTRING, POINTER, CUSTOM
1103 };
1104 };
1105
1106 // A formatting argument. It is a trivially copyable/constructible type to
1107 // allow storage in internal::MemoryBuffer.
1108 struct Arg : Value {
1109 Type type;
1110 };
1111
1112 template <typename Char>
1113 struct NamedArg;
1114 template <typename Char, typename T>
1115 struct NamedArgWithType;
1116
1117 template <typename T = void>
1118 struct Null {};
1119
1120 // A helper class template to enable or disable overloads taking wide
1121 // characters and strings in MakeValue.
1122 template <typename T, typename Char>
1123 struct WCharHelper {
1124 typedef Null<T> Supported;
1125 typedef T Unsupported;
1126 };
1127
1128 template <typename T>
1129 struct WCharHelper<T, wchar_t> {
1130 typedef T Supported;
1131 typedef Null<T> Unsupported;
1132 };
1133
1134 typedef char Yes[1];
1135 typedef char No[2];
1136
1137 template <typename T>
1138 T &get();
1139
1140 // These are non-members to workaround an overload resolution bug in bcc32.
1141 Yes &convert(fmt::ULongLong);
1142 No &convert(...);
1143
1144 template<typename T, bool ENABLE_CONVERSION>
1145 struct ConvertToIntImpl {
1146 enum { value = ENABLE_CONVERSION };
1147 };
1148
1149 template<typename T, bool ENABLE_CONVERSION>
1150 struct ConvertToIntImpl2 {
1151 enum { value = false };
1152 };
1153
1154 template<typename T>
1155 struct ConvertToIntImpl2<T, true> {
1156 enum {
1157 // Don't convert numeric types.
1158 value = ConvertToIntImpl<T, !std::numeric_limits<T>::is_specialized>::value
1159 };
1160 };
1161
1162 template<typename T>
1163 struct ConvertToInt {
1164 enum {
1165 enable_conversion = sizeof(fmt::internal::convert(get<T>())) == sizeof(Yes)
1166 };
1167 enum { value = ConvertToIntImpl2<T, enable_conversion>::value };
1168 };
1169
1170 #define FMT_DISABLE_CONVERSION_TO_INT(Type) \
1171 template <> \
1172 struct ConvertToInt<Type> { enum { value = 0 }; }
1173
1174 // Silence warnings about convering float to int.
1175 FMT_DISABLE_CONVERSION_TO_INT(float);
1176 FMT_DISABLE_CONVERSION_TO_INT(double);
1177 FMT_DISABLE_CONVERSION_TO_INT(long double);
1178
1179 template<bool B, class T = void>
1180 struct EnableIf {};
1181
1182 template<class T>
1183 struct EnableIf<true, T> { typedef T type; };
1184
1185 template<bool B, class T, class F>
1186 struct Conditional { typedef T type; };
1187
1188 template<class T, class F>
1189 struct Conditional<false, T, F> { typedef F type; };
1190
1191 // For bcc32 which doesn't understand ! in template arguments.
1192 template <bool>
1193 struct Not { enum { value = 0 }; };
1194
1195 template <>
1196 struct Not<false> { enum { value = 1 }; };
1197
1198 template <typename T>
1199 struct False { enum { value = 0 }; };
1200
1201 template <typename T, T> struct LConvCheck {
1202 LConvCheck(int) {}
1203 };
1204
1205 // Returns the thousands separator for the current locale.
1206 // We check if ``lconv`` contains ``thousands_sep`` because on Android
1207 // ``lconv`` is stubbed as an empty struct.
1208 template <typename LConv>
1209 inline StringRef thousands_sep(
1210 LConv *lc, LConvCheck<char *LConv::*, &LConv::thousands_sep> = 0) {
1211 return lc->thousands_sep;
1212 }
1213
1214 inline fmt::StringRef thousands_sep(...) { return ""; }
1215
1216 #define FMT_CONCAT(a, b) a##b
1217
1218 #if FMT_GCC_VERSION >= 303
1219 # define FMT_UNUSED __attribute__((unused))
1220 #else
1221 # define FMT_UNUSED
1222 #endif
1223
1224 #ifndef FMT_USE_STATIC_ASSERT
1225 # define FMT_USE_STATIC_ASSERT 0
1226 #endif
1227
1228 #if FMT_USE_STATIC_ASSERT || FMT_HAS_FEATURE(cxx_static_assert) || \
1229 (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600
1230 # define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message)
1231 #else
1232 # define FMT_CONCAT_(a, b) FMT_CONCAT(a, b)
1233 # define FMT_STATIC_ASSERT(cond, message) \
1234 typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED
1235 #endif
1236
1237 template <typename Formatter, typename Char, typename T>
1238 void format_arg(Formatter &, const Char *, const T &) {
1239 FMT_STATIC_ASSERT(False<T>::value,
1240 "Cannot format argument. To enable the use of ostream "
1241 "operator<< include fmt/ostream.h. Otherwise provide "
1242 "an overload of format_arg.");
1243 }
1244
1245 // Makes an Arg object from any type.
1246 template <typename Formatter>
1247 class MakeValue : public Arg {
1248 public:
1249 typedef typename Formatter::Char Char;
1250
1251 private:
1252 // The following two methods are private to disallow formatting of
1253 // arbitrary pointers. If you want to output a pointer cast it to
1254 // "void *" or "const void *". In particular, this forbids formatting
1255 // of "[const] volatile char *" which is printed as bool by iostreams.
1256 // Do not implement!
1257 template <typename T>
1258 MakeValue(const T *value);
1259 template <typename T>
1260 MakeValue(T *value);
1261
1262 // The following methods are private to disallow formatting of wide
1263 // characters and strings into narrow strings as in
1264 // fmt::format("{}", L"test");
1265 // To fix this, use a wide format string: fmt::format(L"{}", L"test").
1266 #if !FMT_MSC_VER || defined(_NATIVE_WCHAR_T_DEFINED)
1267 MakeValue(typename WCharHelper<wchar_t, Char>::Unsupported);
1268 #endif
1269 MakeValue(typename WCharHelper<wchar_t *, Char>::Unsupported);
1270 MakeValue(typename WCharHelper<const wchar_t *, Char>::Unsupported);
1271 MakeValue(typename WCharHelper<const std::wstring &, Char>::Unsupported);
1272 MakeValue(typename WCharHelper<WStringRef, Char>::Unsupported);
1273
1274 void set_string(StringRef str) {
1275 string.value = str.data();
1276 string.size = str.size();
1277 }
1278
1279 void set_string(WStringRef str) {
1280 wstring.value = str.data();
1281 wstring.size = str.size();
1282 }
1283
1284 // Formats an argument of a custom type, such as a user-defined class.
1285 template <typename T>
1286 static void format_custom_arg(
1287 void *formatter, const void *arg, void *format_str_ptr) {
1288 format_arg(*static_cast<Formatter*>(formatter),
1289 *static_cast<const Char**>(format_str_ptr),
1290 *static_cast<const T*>(arg));
1291 }
1292
1293 public:
1294 MakeValue() {}
1295
1296 #define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \
1297 MakeValue(Type value) { field = rhs; } \
1298 static uint64_t type(Type) { return Arg::TYPE; }
1299
1300 #define FMT_MAKE_VALUE(Type, field, TYPE) \
1301 FMT_MAKE_VALUE_(Type, field, TYPE, value)
1302
1303 FMT_MAKE_VALUE(bool, int_value, BOOL)
1304 FMT_MAKE_VALUE(short, int_value, INT)
1305 FMT_MAKE_VALUE(unsigned short, uint_value, UINT)
1306 FMT_MAKE_VALUE(int, int_value, INT)
1307 FMT_MAKE_VALUE(unsigned, uint_value, UINT)
1308
1309 MakeValue(long value) {
1310 // To minimize the number of types we need to deal with, long is
1311 // translated either to int or to long long depending on its size.
1312 if (const_check(sizeof(long) == sizeof(int)))
1313 int_value = static_cast<int>(value);
1314 else
1315 long_long_value = value;
1316 }
1317 static uint64_t type(long) {
1318 return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG;
1319 }
1320
1321 MakeValue(unsigned long value) {
1322 if (const_check(sizeof(unsigned long) == sizeof(unsigned)))
1323 uint_value = static_cast<unsigned>(value);
1324 else
1325 ulong_long_value = value;
1326 }
1327 static uint64_t type(unsigned long) {
1328 return sizeof(unsigned long) == sizeof(unsigned) ?
1329 Arg::UINT : Arg::ULONG_LONG;
1330 }
1331
1332 FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG)
1333 FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG)
1334 FMT_MAKE_VALUE(float, double_value, DOUBLE)
1335 FMT_MAKE_VALUE(double, double_value, DOUBLE)
1336 FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE)
1337 FMT_MAKE_VALUE(signed char, int_value, INT)
1338 FMT_MAKE_VALUE(unsigned char, uint_value, UINT)
1339 FMT_MAKE_VALUE(char, int_value, CHAR)
1340
1341 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
1342 MakeValue(typename WCharHelper<wchar_t, Char>::Supported value) {
1343 int_value = value;
1344 }
1345 static uint64_t type(wchar_t) { return Arg::CHAR; }
1346 #endif
1347
1348 #define FMT_MAKE_STR_VALUE(Type, TYPE) \
1349 MakeValue(Type value) { set_string(value); } \
1350 static uint64_t type(Type) { return Arg::TYPE; }
1351
1352 FMT_MAKE_VALUE(char *, string.value, CSTRING)
1353 FMT_MAKE_VALUE(const char *, string.value, CSTRING)
1354 FMT_MAKE_VALUE(signed char *, sstring.value, CSTRING)
1355 FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING)
1356 FMT_MAKE_VALUE(unsigned char *, ustring.value, CSTRING)
1357 FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING)
1358 FMT_MAKE_STR_VALUE(const std::string &, STRING)
1359 FMT_MAKE_STR_VALUE(StringRef, STRING)
1360 FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str())
1361
1362 #define FMT_MAKE_WSTR_VALUE(Type, TYPE) \
1363 MakeValue(typename WCharHelper<Type, Char>::Supported value) { \
1364 set_string(value); \
1365 } \
1366 static uint64_t type(Type) { return Arg::TYPE; }
1367
1368 FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING)
1369 FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING)
1370 FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING)
1371 FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING)
1372
1373 FMT_MAKE_VALUE(void *, pointer, POINTER)
1374 FMT_MAKE_VALUE(const void *, pointer, POINTER)
1375
1376 template <typename T>
1377 MakeValue(const T &value,
1378 typename EnableIf<Not<
1379 ConvertToInt<T>::value>::value, int>::type = 0) {
1380 custom.value = &value;
1381 custom.format = &format_custom_arg<T>;
1382 }
1383
1384 template <typename T>
1385 MakeValue(const T &value,
1386 typename EnableIf<ConvertToInt<T>::value, int>::type = 0) {
1387 int_value = value;
1388 }
1389
1390 template <typename T>
1391 static uint64_t type(const T &) {
1392 return ConvertToInt<T>::value ? Arg::INT : Arg::CUSTOM;
1393 }
1394
1395 // Additional template param `Char_` is needed here because make_type always
1396 // uses char.
1397 template <typename Char_>
1398 MakeValue(const NamedArg<Char_> &value) { pointer = &value; }
1399 template <typename Char_, typename T>
1400 MakeValue(const NamedArgWithType<Char_, T> &value) { pointer = &value; }
1401
1402 template <typename Char_>
1403 static uint64_t type(const NamedArg<Char_> &) { return Arg::NAMED_ARG; }
1404 template <typename Char_, typename T>
1405 static uint64_t type(const NamedArgWithType<Char_, T> &) { return Arg::NAMED_ARG; }
1406 };
1407
1408 template <typename Formatter>
1409 class MakeArg : public Arg {
1410 public:
1411 MakeArg() {
1412 type = Arg::NONE;
1413 }
1414
1415 template <typename T>
1416 MakeArg(const T &value)
1417 : Arg(MakeValue<Formatter>(value)) {
1418 type = static_cast<Arg::Type>(MakeValue<Formatter>::type(value));
1419 }
1420 };
1421
1422 template <typename Char>
1423 struct NamedArg : Arg {
1424 BasicStringRef<Char> name;
1425
1426 template <typename T>
1427 NamedArg(BasicStringRef<Char> argname, const T &value)
1428 : Arg(MakeArg< BasicFormatter<Char> >(value)), name(argname) {}
1429 };
1430
1431 template <typename Char, typename T>
1432 struct NamedArgWithType : NamedArg<Char> {
1433 NamedArgWithType(BasicStringRef<Char> argname, const T &value)
1434 : NamedArg<Char>(argname, value) {}
1435 };
1436
1437 class RuntimeError : public std::runtime_error {
1438 protected:
1439 RuntimeError() : std::runtime_error("") {}
1440 RuntimeError(const RuntimeError &rerr) : std::runtime_error(rerr) {}
1441 ~RuntimeError() FMT_DTOR_NOEXCEPT;
1442 };
1443
1444 template <typename Char>
1445 class ArgMap;
1446 } // namespace internal
1447
1448 /** An argument list. */
1449 class ArgList {
1450 private:
1451 // To reduce compiled code size per formatting function call, types of first
1452 // MAX_PACKED_ARGS arguments are passed in the types_ field.
1453 uint64_t types_;
1454 union {
1455 // If the number of arguments is less than MAX_PACKED_ARGS, the argument
1456 // values are stored in values_, otherwise they are stored in args_.
1457 // This is done to reduce compiled code size as storing larger objects
1458 // may require more code (at least on x86-64) even if the same amount of
1459 // data is actually copied to stack. It saves ~10% on the bloat test.
1460 const internal::Value *values_;
1461 const internal::Arg *args_;
1462 };
1463
1464 internal::Arg::Type type(unsigned index) const {
1465 return type(types_, index);
1466 }
1467
1468 template <typename Char>
1469 friend class internal::ArgMap;
1470
1471 public:
1472 // Maximum number of arguments with packed types.
1473 enum { MAX_PACKED_ARGS = 16 };
1474
1475 ArgList() : types_(0) {}
1476
1477 ArgList(ULongLong types, const internal::Value *values)
1478 : types_(types), values_(values) {}
1479 ArgList(ULongLong types, const internal::Arg *args)
1480 : types_(types), args_(args) {}
1481
1482 uint64_t types() const { return types_; }
1483
1484 /** Returns the argument at specified index. */
1485 internal::Arg operator[](unsigned index) const {
1486 using internal::Arg;
1487 Arg arg;
1488 bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE;
1489 if (index < MAX_PACKED_ARGS) {
1490 Arg::Type arg_type = type(index);
1491 internal::Value &val = arg;
1492 if (arg_type != Arg::NONE)
1493 val = use_values ? values_[index] : args_[index];
1494 arg.type = arg_type;
1495 return arg;
1496 }
1497 if (use_values) {
1498 // The index is greater than the number of arguments that can be stored
1499 // in values, so return a "none" argument.
1500 arg.type = Arg::NONE;
1501 return arg;
1502 }
1503 for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) {
1504 if (args_[i].type == Arg::NONE)
1505 return args_[i];
1506 }
1507 return args_[index];
1508 }
1509
1510 static internal::Arg::Type type(uint64_t types, unsigned index) {
1511 unsigned shift = index * 4;
1512 uint64_t mask = 0xf;
1513 return static_cast<internal::Arg::Type>(
1514 (types & (mask << shift)) >> shift);
1515 }
1516 };
1517
1518 #define FMT_DISPATCH(call) static_cast<Impl*>(this)->call
1519
1520 /**
1521 \rst
1522 An argument visitor based on the `curiously recurring template pattern
1523 <http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern>`_.
1524
1525 To use `~fmt::ArgVisitor` define a subclass that implements some or all of the
1526 visit methods with the same signatures as the methods in `~fmt::ArgVisitor`,
1527 for example, `~fmt::ArgVisitor::visit_int()`.
1528 Pass the subclass as the *Impl* template parameter. Then calling
1529 `~fmt::ArgVisitor::visit` for some argument will dispatch to a visit method
1530 specific to the argument type. For example, if the argument type is
1531 ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass
1532 will be called. If the subclass doesn't contain a method with this signature,
1533 then a corresponding method of `~fmt::ArgVisitor` will be called.
1534
1535 **Example**::
1536
1537 class MyArgVisitor : public fmt::ArgVisitor<MyArgVisitor, void> {
1538 public:
1539 void visit_int(int value) { fmt::print("{}", value); }
1540 void visit_double(double value) { fmt::print("{}", value ); }
1541 };
1542 \endrst
1543 */
1544 template <typename Impl, typename Result>
1545 class ArgVisitor {
1546 private:
1547 typedef internal::Arg Arg;
1548
1549 public:
1550 void report_unhandled_arg() {}
1551
1552 Result visit_unhandled_arg() {
1553 FMT_DISPATCH(report_unhandled_arg());
1554 return Result();
1555 }
1556
1557 /** Visits an ``int`` argument. **/
1558 Result visit_int(int value) {
1559 return FMT_DISPATCH(visit_any_int(value));
1560 }
1561
1562 /** Visits a ``long long`` argument. **/
1563 Result visit_long_long(LongLong value) {
1564 return FMT_DISPATCH(visit_any_int(value));
1565 }
1566
1567 /** Visits an ``unsigned`` argument. **/
1568 Result visit_uint(unsigned value) {
1569 return FMT_DISPATCH(visit_any_int(value));
1570 }
1571
1572 /** Visits an ``unsigned long long`` argument. **/
1573 Result visit_ulong_long(ULongLong value) {
1574 return FMT_DISPATCH(visit_any_int(value));
1575 }
1576
1577 /** Visits a ``bool`` argument. **/
1578 Result visit_bool(bool value) {
1579 return FMT_DISPATCH(visit_any_int(value));
1580 }
1581
1582 /** Visits a ``char`` or ``wchar_t`` argument. **/
1583 Result visit_char(int value) {
1584 return FMT_DISPATCH(visit_any_int(value));
1585 }
1586
1587 /** Visits an argument of any integral type. **/
1588 template <typename T>
1589 Result visit_any_int(T) {
1590 return FMT_DISPATCH(visit_unhandled_arg());
1591 }
1592
1593 /** Visits a ``double`` argument. **/
1594 Result visit_double(double value) {
1595 return FMT_DISPATCH(visit_any_double(value));
1596 }
1597
1598 /** Visits a ``long double`` argument. **/
1599 Result visit_long_double(long double value) {
1600 return FMT_DISPATCH(visit_any_double(value));
1601 }
1602
1603 /** Visits a ``double`` or ``long double`` argument. **/
1604 template <typename T>
1605 Result visit_any_double(T) {
1606 return FMT_DISPATCH(visit_unhandled_arg());
1607 }
1608
1609 /** Visits a null-terminated C string (``const char *``) argument. **/
1610 Result visit_cstring(const char *) {
1611 return FMT_DISPATCH(visit_unhandled_arg());
1612 }
1613
1614 /** Visits a string argument. **/
1615 Result visit_string(Arg::StringValue<char>) {
1616 return FMT_DISPATCH(visit_unhandled_arg());
1617 }
1618
1619 /** Visits a wide string argument. **/
1620 Result visit_wstring(Arg::StringValue<wchar_t>) {
1621 return FMT_DISPATCH(visit_unhandled_arg());
1622 }
1623
1624 /** Visits a pointer argument. **/
1625 Result visit_pointer(const void *) {
1626 return FMT_DISPATCH(visit_unhandled_arg());
1627 }
1628
1629 /** Visits an argument of a custom (user-defined) type. **/
1630 Result visit_custom(Arg::CustomValue) {
1631 return FMT_DISPATCH(visit_unhandled_arg());
1632 }
1633
1634 /**
1635 \rst
1636 Visits an argument dispatching to the appropriate visit method based on
1637 the argument type. For example, if the argument type is ``double`` then
1638 the `~fmt::ArgVisitor::visit_double()` method of the *Impl* class will be
1639 called.
1640 \endrst
1641 */
1642 Result visit(const Arg &arg) {
1643 switch (arg.type) {
1644 case Arg::NONE:
1645 case Arg::NAMED_ARG:
1646 FMT_ASSERT(false, "invalid argument type");
1647 break;
1648 case Arg::INT:
1649 return FMT_DISPATCH(visit_int(arg.int_value));
1650 case Arg::UINT:
1651 return FMT_DISPATCH(visit_uint(arg.uint_value));
1652 case Arg::LONG_LONG:
1653 return FMT_DISPATCH(visit_long_long(arg.long_long_value));
1654 case Arg::ULONG_LONG:
1655 return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value));
1656 case Arg::BOOL:
1657 return FMT_DISPATCH(visit_bool(arg.int_value != 0));
1658 case Arg::CHAR:
1659 return FMT_DISPATCH(visit_char(arg.int_value));
1660 case Arg::DOUBLE:
1661 return FMT_DISPATCH(visit_double(arg.double_value));
1662 case Arg::LONG_DOUBLE:
1663 return FMT_DISPATCH(visit_long_double(arg.long_double_value));
1664 case Arg::CSTRING:
1665 return FMT_DISPATCH(visit_cstring(arg.string.value));
1666 case Arg::STRING:
1667 return FMT_DISPATCH(visit_string(arg.string));
1668 case Arg::WSTRING:
1669 return FMT_DISPATCH(visit_wstring(arg.wstring));
1670 case Arg::POINTER:
1671 return FMT_DISPATCH(visit_pointer(arg.pointer));
1672 case Arg::CUSTOM:
1673 return FMT_DISPATCH(visit_custom(arg.custom));
1674 }
1675 return Result();
1676 }
1677 };
1678
1679 enum Alignment {
1680 ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC
1681 };
1682
1683 // Flags.
1684 enum {
1685 SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8,
1686 CHAR_FLAG = 0x10 // Argument has char type - used in error reporting.
1687 };
1688
1689 // An empty format specifier.
1690 struct EmptySpec {};
1691
1692 // A type specifier.
1693 template <char TYPE>
1694 struct TypeSpec : EmptySpec {
1695 Alignment align() const { return ALIGN_DEFAULT; }
1696 unsigned width() const { return 0; }
1697 int precision() const { return -1; }
1698 bool flag(unsigned) const { return false; }
1699 char type() const { return TYPE; }
1700 char fill() const { return ' '; }
1701 };
1702
1703 // A width specifier.
1704 struct WidthSpec {
1705 unsigned width_;
1706 // Fill is always wchar_t and cast to char if necessary to avoid having
1707 // two specialization of WidthSpec and its subclasses.
1708 wchar_t fill_;
1709
1710 WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {}
1711
1712 unsigned width() const { return width_; }
1713 wchar_t fill() const { return fill_; }
1714 };
1715
1716 // An alignment specifier.
1717 struct AlignSpec : WidthSpec {
1718 Alignment align_;
1719
1720 AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT)
1721 : WidthSpec(width, fill), align_(align) {}
1722
1723 Alignment align() const { return align_; }
1724
1725 int precision() const { return -1; }
1726 };
1727
1728 // An alignment and type specifier.
1729 template <char TYPE>
1730 struct AlignTypeSpec : AlignSpec {
1731 AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {}
1732
1733 bool flag(unsigned) const { return false; }
1734 char type() const { return TYPE; }
1735 };
1736
1737 // A full format specifier.
1738 struct FormatSpec : AlignSpec {
1739 unsigned flags_;
1740 int precision_;
1741 char type_;
1742
1743 FormatSpec(
1744 unsigned width = 0, char type = 0, wchar_t fill = ' ')
1745 : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {}
1746
1747 bool flag(unsigned f) const { return (flags_ & f) != 0; }
1748 int precision() const { return precision_; }
1749 char type() const { return type_; }
1750 };
1751
1752 // An integer format specifier.
1753 template <typename T, typename SpecT = TypeSpec<0>, typename Char = char>
1754 class IntFormatSpec : public SpecT {
1755 private:
1756 T value_;
1757
1758 public:
1759 IntFormatSpec(T val, const SpecT &spec = SpecT())
1760 : SpecT(spec), value_(val) {}
1761
1762 T value() const { return value_; }
1763 };
1764
1765 // A string format specifier.
1766 template <typename Char>
1767 class StrFormatSpec : public AlignSpec {
1768 private:
1769 const Char *str_;
1770
1771 public:
1772 template <typename FillChar>
1773 StrFormatSpec(const Char *str, unsigned width, FillChar fill)
1774 : AlignSpec(width, fill), str_(str) {
1775 internal::CharTraits<Char>::convert(FillChar());
1776 }
1777
1778 const Char *str() const { return str_; }
1779 };
1780
1781 /**
1782 Returns an integer format specifier to format the value in base 2.
1783 */
1784 IntFormatSpec<int, TypeSpec<'b'> > bin(int value);
1785
1786 /**
1787 Returns an integer format specifier to format the value in base 8.
1788 */
1789 IntFormatSpec<int, TypeSpec<'o'> > oct(int value);
1790
1791 /**
1792 Returns an integer format specifier to format the value in base 16 using
1793 lower-case letters for the digits above 9.
1794 */
1795 IntFormatSpec<int, TypeSpec<'x'> > hex(int value);
1796
1797 /**
1798 Returns an integer formatter format specifier to format in base 16 using
1799 upper-case letters for the digits above 9.
1800 */
1801 IntFormatSpec<int, TypeSpec<'X'> > hexu(int value);
1802
1803 /**
1804 \rst
1805 Returns an integer format specifier to pad the formatted argument with the
1806 fill character to the specified width using the default (right) numeric
1807 alignment.
1808
1809 **Example**::
1810
1811 MemoryWriter out;
1812 out << pad(hex(0xcafe), 8, '0');
1813 // out.str() == "0000cafe"
1814
1815 \endrst
1816 */
1817 template <char TYPE_CODE, typename Char>
1818 IntFormatSpec<int, AlignTypeSpec<TYPE_CODE>, Char> pad(
1819 int value, unsigned width, Char fill = ' ');
1820
1821 #define FMT_DEFINE_INT_FORMATTERS(TYPE) \
1822 inline IntFormatSpec<TYPE, TypeSpec<'b'> > bin(TYPE value) { \
1823 return IntFormatSpec<TYPE, TypeSpec<'b'> >(value, TypeSpec<'b'>()); \
1824 } \
1825 \
1826 inline IntFormatSpec<TYPE, TypeSpec<'o'> > oct(TYPE value) { \
1827 return IntFormatSpec<TYPE, TypeSpec<'o'> >(value, TypeSpec<'o'>()); \
1828 } \
1829 \
1830 inline IntFormatSpec<TYPE, TypeSpec<'x'> > hex(TYPE value) { \
1831 return IntFormatSpec<TYPE, TypeSpec<'x'> >(value, TypeSpec<'x'>()); \
1832 } \
1833 \
1834 inline IntFormatSpec<TYPE, TypeSpec<'X'> > hexu(TYPE value) { \
1835 return IntFormatSpec<TYPE, TypeSpec<'X'> >(value, TypeSpec<'X'>()); \
1836 } \
1837 \
1838 template <char TYPE_CODE> \
1839 inline IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE> > pad( \
1840 IntFormatSpec<TYPE, TypeSpec<TYPE_CODE> > f, unsigned width) { \
1841 return IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE> >( \
1842 f.value(), AlignTypeSpec<TYPE_CODE>(width, ' ')); \
1843 } \
1844 \
1845 /* For compatibility with older compilers we provide two overloads for pad, */ \
1846 /* one that takes a fill character and one that doesn't. In the future this */ \
1847 /* can be replaced with one overload making the template argument Char */ \
1848 /* default to char (C++11). */ \
1849 template <char TYPE_CODE, typename Char> \
1850 inline IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE>, Char> pad( \
1851 IntFormatSpec<TYPE, TypeSpec<TYPE_CODE>, Char> f, \
1852 unsigned width, Char fill) { \
1853 return IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE>, Char>( \
1854 f.value(), AlignTypeSpec<TYPE_CODE>(width, fill)); \
1855 } \
1856 \
1857 inline IntFormatSpec<TYPE, AlignTypeSpec<0> > pad( \
1858 TYPE value, unsigned width) { \
1859 return IntFormatSpec<TYPE, AlignTypeSpec<0> >( \
1860 value, AlignTypeSpec<0>(width, ' ')); \
1861 } \
1862 \
1863 template <typename Char> \
1864 inline IntFormatSpec<TYPE, AlignTypeSpec<0>, Char> pad( \
1865 TYPE value, unsigned width, Char fill) { \
1866 return IntFormatSpec<TYPE, AlignTypeSpec<0>, Char>( \
1867 value, AlignTypeSpec<0>(width, fill)); \
1868 }
1869
1870 FMT_DEFINE_INT_FORMATTERS(int)
1871 FMT_DEFINE_INT_FORMATTERS(long)
1872 FMT_DEFINE_INT_FORMATTERS(unsigned)
1873 FMT_DEFINE_INT_FORMATTERS(unsigned long)
1874 FMT_DEFINE_INT_FORMATTERS(LongLong)
1875 FMT_DEFINE_INT_FORMATTERS(ULongLong)
1876
1877 /**
1878 \rst
1879 Returns a string formatter that pads the formatted argument with the fill
1880 character to the specified width using the default (left) string alignment.
1881
1882 **Example**::
1883
1884 std::string s = str(MemoryWriter() << pad("abc", 8));
1885 // s == "abc "
1886
1887 \endrst
1888 */
1889 template <typename Char>
1890 inline StrFormatSpec<Char> pad(
1891 const Char *str, unsigned width, Char fill = ' ') {
1892 return StrFormatSpec<Char>(str, width, fill);
1893 }
1894
1895 inline StrFormatSpec<wchar_t> pad(
1896 const wchar_t *str, unsigned width, char fill = ' ') {
1897 return StrFormatSpec<wchar_t>(str, width, fill);
1898 }
1899
1900 namespace internal {
1901
1902 template <typename Char>
1903 class ArgMap {
1904 private:
1905 typedef std::vector<
1906 std::pair<fmt::BasicStringRef<Char>, internal::Arg> > MapType;
1907 typedef typename MapType::value_type Pair;
1908
1909 MapType map_;
1910
1911 public:
1912 FMT_API void init(const ArgList &args);
1913
1914 const internal::Arg *find(const fmt::BasicStringRef<Char> &name) const {
1915 // The list is unsorted, so just return the first matching name.
1916 for (typename MapType::const_iterator it = map_.begin(), end = map_.end();
1917 it != end; ++it) {
1918 if (it->first == name)
1919 return &it->second;
1920 }
1921 return FMT_NULL;
1922 }
1923 };
1924
1925 template <typename Impl, typename Char>
1926 class ArgFormatterBase : public ArgVisitor<Impl, void> {
1927 private:
1928 BasicWriter<Char> &writer_;
1929 FormatSpec &spec_;
1930
1931 FMT_DISALLOW_COPY_AND_ASSIGN(ArgFormatterBase);
1932
1933 void write_pointer(const void *p) {
1934 spec_.flags_ = HASH_FLAG;
1935 spec_.type_ = 'x';
1936 writer_.write_int(reinterpret_cast<uintptr_t>(p), spec_);
1937 }
1938
1939 protected:
1940 BasicWriter<Char> &writer() { return writer_; }
1941 FormatSpec &spec() { return spec_; }
1942
1943 void write(bool value) {
1944 const char *str_value = value ? "true" : "false";
1945 Arg::StringValue<char> str = { str_value, std::strlen(str_value) };
1946 writer_.write_str(str, spec_);
1947 }
1948
1949 void write(const char *value) {
1950 Arg::StringValue<char> str = {value, value ? std::strlen(value) : 0};
1951 writer_.write_str(str, spec_);
1952 }
1953
1954 public:
1955 ArgFormatterBase(BasicWriter<Char> &w, FormatSpec &s)
1956 : writer_(w), spec_(s) {}
1957
1958 template <typename T>
1959 void visit_any_int(T value) { writer_.write_int(value, spec_); }
1960
1961 template <typename T>
1962 void visit_any_double(T value) { writer_.write_double(value, spec_); }
1963
1964 void visit_bool(bool value) {
1965 if (spec_.type_) {
1966 visit_any_int(value);
1967 return;
1968 }
1969 write(value);
1970 }
1971
1972 void visit_char(int value) {
1973 if (spec_.type_ && spec_.type_ != 'c') {
1974 spec_.flags_ |= CHAR_FLAG;
1975 writer_.write_int(value, spec_);
1976 return;
1977 }
1978 if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0)
1979 FMT_THROW(FormatError("invalid format specifier for char"));
1980 typedef typename BasicWriter<Char>::CharPtr CharPtr;
1981 Char fill = internal::CharTraits<Char>::cast(spec_.fill());
1982 CharPtr out = CharPtr();
1983 const unsigned CHAR_SIZE = 1;
1984 if (spec_.width_ > CHAR_SIZE) {
1985 out = writer_.grow_buffer(spec_.width_);
1986 if (spec_.align_ == ALIGN_RIGHT) {
1987 std::uninitialized_fill_n(out, spec_.width_ - CHAR_SIZE, fill);
1988 out += spec_.width_ - CHAR_SIZE;
1989 } else if (spec_.align_ == ALIGN_CENTER) {
1990 out = writer_.fill_padding(out, spec_.width_,
1991 internal::const_check(CHAR_SIZE), fill);
1992 } else {
1993 std::uninitialized_fill_n(out + CHAR_SIZE,
1994 spec_.width_ - CHAR_SIZE, fill);
1995 }
1996 } else {
1997 out = writer_.grow_buffer(CHAR_SIZE);
1998 }
1999 *out = internal::CharTraits<Char>::cast(value);
2000 }
2001
2002 void visit_cstring(const char *value) {
2003 if (spec_.type_ == 'p')
2004 return write_pointer(value);
2005 write(value);
2006 }
2007
2008 void visit_string(Arg::StringValue<char> value) {
2009 writer_.write_str(value, spec_);
2010 }
2011
2012 using ArgVisitor<Impl, void>::visit_wstring;
2013
2014 void visit_wstring(Arg::StringValue<Char> value) {
2015 writer_.write_str(value, spec_);
2016 }
2017
2018 void visit_pointer(const void *value) {
2019 if (spec_.type_ && spec_.type_ != 'p')
2020 report_unknown_type(spec_.type_, "pointer");
2021 write_pointer(value);
2022 }
2023 };
2024
2025 class FormatterBase {
2026 private:
2027 ArgList args_;
2028 int next_arg_index_;
2029
2030 // Returns the argument with specified index.
2031 FMT_API Arg do_get_arg(unsigned arg_index, const char *&error);
2032
2033 protected:
2034 const ArgList &args() const { return args_; }
2035
2036 explicit FormatterBase(const ArgList &args) {
2037 args_ = args;
2038 next_arg_index_ = 0;
2039 }
2040
2041 // Returns the next argument.
2042 Arg next_arg(const char *&error) {
2043 if (next_arg_index_ >= 0)
2044 return do_get_arg(internal::to_unsigned(next_arg_index_++), error);
2045 error = "cannot switch from manual to automatic argument indexing";
2046 return Arg();
2047 }
2048
2049 // Checks if manual indexing is used and returns the argument with
2050 // specified index.
2051 Arg get_arg(unsigned arg_index, const char *&error) {
2052 return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg();
2053 }
2054
2055 bool check_no_auto_index(const char *&error) {
2056 if (next_arg_index_ > 0) {
2057 error = "cannot switch from automatic to manual argument indexing";
2058 return false;
2059 }
2060 next_arg_index_ = -1;
2061 return true;
2062 }
2063
2064 template <typename Char>
2065 void write(BasicWriter<Char> &w, const Char *start, const Char *end) {
2066 if (start != end)
2067 w << BasicStringRef<Char>(start, internal::to_unsigned(end - start));
2068 }
2069 };
2070 } // namespace internal
2071
2072 /**
2073 \rst
2074 An argument formatter based on the `curiously recurring template pattern
2075 <http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern>`_.
2076
2077 To use `~fmt::BasicArgFormatter` define a subclass that implements some or
2078 all of the visit methods with the same signatures as the methods in
2079 `~fmt::ArgVisitor`, for example, `~fmt::ArgVisitor::visit_int()`.
2080 Pass the subclass as the *Impl* template parameter. When a formatting
2081 function processes an argument, it will dispatch to a visit method
2082 specific to the argument type. For example, if the argument type is
2083 ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass
2084 will be called. If the subclass doesn't contain a method with this signature,
2085 then a corresponding method of `~fmt::BasicArgFormatter` or its superclass
2086 will be called.
2087 \endrst
2088 */
2089 template <typename Impl, typename Char>
2090 class BasicArgFormatter : public internal::ArgFormatterBase<Impl, Char> {
2091 private:
2092 BasicFormatter<Char, Impl> &formatter_;
2093 const Char *format_;
2094
2095 public:
2096 /**
2097 \rst
2098 Constructs an argument formatter object.
2099 *formatter* is a reference to the main formatter object, *spec* contains
2100 format specifier information for standard argument types, and *fmt* points
2101 to the part of the format string being parsed for custom argument types.
2102 \endrst
2103 */
2104 BasicArgFormatter(BasicFormatter<Char, Impl> &formatter,
2105 FormatSpec &spec, const Char *fmt)
2106 : internal::ArgFormatterBase<Impl, Char>(formatter.writer(), spec),
2107 formatter_(formatter), format_(fmt) {}
2108
2109 /** Formats an argument of a custom (user-defined) type. */
2110 void visit_custom(internal::Arg::CustomValue c) {
2111 c.format(&formatter_, c.value, &format_);
2112 }
2113 };
2114
2115 /** The default argument formatter. */
2116 template <typename Char>
2117 class ArgFormatter : public BasicArgFormatter<ArgFormatter<Char>, Char> {
2118 public:
2119 /** Constructs an argument formatter object. */
2120 ArgFormatter(BasicFormatter<Char> &formatter,
2121 FormatSpec &spec, const Char *fmt)
2122 : BasicArgFormatter<ArgFormatter<Char>, Char>(formatter, spec, fmt) {}
2123 };
2124
2125 /** This template formats data and writes the output to a writer. */
2126 template <typename CharType, typename ArgFormatter>
2127 class BasicFormatter : private internal::FormatterBase {
2128 public:
2129 /** The character type for the output. */
2130 typedef CharType Char;
2131
2132 private:
2133 BasicWriter<Char> &writer_;
2134 internal::ArgMap<Char> map_;
2135
2136 FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter);
2137
2138 using internal::FormatterBase::get_arg;
2139
2140 // Checks if manual indexing is used and returns the argument with
2141 // specified name.
2142 internal::Arg get_arg(BasicStringRef<Char> arg_name, const char *&error);
2143
2144 // Parses argument index and returns corresponding argument.
2145 internal::Arg parse_arg_index(const Char *&s);
2146
2147 // Parses argument name and returns corresponding argument.
2148 internal::Arg parse_arg_name(const Char *&s);
2149
2150 public:
2151 /**
2152 \rst
2153 Constructs a ``BasicFormatter`` object. References to the arguments and
2154 the writer are stored in the formatter object so make sure they have
2155 appropriate lifetimes.
2156 \endrst
2157 */
2158 BasicFormatter(const ArgList &args, BasicWriter<Char> &w)
2159 : internal::FormatterBase(args), writer_(w) {}
2160
2161 /** Returns a reference to the writer associated with this formatter. */
2162 BasicWriter<Char> &writer() { return writer_; }
2163
2164 /** Formats stored arguments and writes the output to the writer. */
2165 void format(BasicCStringRef<Char> format_str);
2166
2167 // Formats a single argument and advances format_str, a format string pointer.
2168 const Char *format(const Char *&format_str, const internal::Arg &arg);
2169 };
2170
2171 // Generates a comma-separated list with results of applying f to
2172 // numbers 0..n-1.
2173 # define FMT_GEN(n, f) FMT_GEN##n(f)
2174 # define FMT_GEN1(f) f(0)
2175 # define FMT_GEN2(f) FMT_GEN1(f), f(1)
2176 # define FMT_GEN3(f) FMT_GEN2(f), f(2)
2177 # define FMT_GEN4(f) FMT_GEN3(f), f(3)
2178 # define FMT_GEN5(f) FMT_GEN4(f), f(4)
2179 # define FMT_GEN6(f) FMT_GEN5(f), f(5)
2180 # define FMT_GEN7(f) FMT_GEN6(f), f(6)
2181 # define FMT_GEN8(f) FMT_GEN7(f), f(7)
2182 # define FMT_GEN9(f) FMT_GEN8(f), f(8)
2183 # define FMT_GEN10(f) FMT_GEN9(f), f(9)
2184 # define FMT_GEN11(f) FMT_GEN10(f), f(10)
2185 # define FMT_GEN12(f) FMT_GEN11(f), f(11)
2186 # define FMT_GEN13(f) FMT_GEN12(f), f(12)
2187 # define FMT_GEN14(f) FMT_GEN13(f), f(13)
2188 # define FMT_GEN15(f) FMT_GEN14(f), f(14)
2189
2190 namespace internal {
2191 inline uint64_t make_type() { return 0; }
2192
2193 template <typename T>
2194 inline uint64_t make_type(const T &arg) {
2195 return MakeValue< BasicFormatter<char> >::type(arg);
2196 }
2197
2198 template <unsigned N, bool/*IsPacked*/= (N < ArgList::MAX_PACKED_ARGS)>
2199 struct ArgArray;
2200
2201 template <unsigned N>
2202 struct ArgArray<N, true/*IsPacked*/> {
2203 typedef Value Type[N > 0 ? N : 1];
2204
2205 template <typename Formatter, typename T>
2206 static Value make(const T &value) {
2207 #ifdef __clang__
2208 Value result = MakeValue<Formatter>(value);
2209 // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang:
2210 // https://github.com/fmtlib/fmt/issues/276
2211 (void)result.custom.format;
2212 return result;
2213 #else
2214 return MakeValue<Formatter>(value);
2215 #endif
2216 }
2217 };
2218
2219 template <unsigned N>
2220 struct ArgArray<N, false/*IsPacked*/> {
2221 typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE
2222
2223 template <typename Formatter, typename T>
2224 static Arg make(const T &value) { return MakeArg<Formatter>(value); }
2225 };
2226
2227 #if FMT_USE_VARIADIC_TEMPLATES
2228 template <typename Arg, typename... Args>
2229 inline uint64_t make_type(const Arg &first, const Args & ... tail) {
2230 return make_type(first) | (make_type(tail...) << 4);
2231 }
2232
2233 #else
2234
2235 struct ArgType {
2236 uint64_t type;
2237
2238 ArgType() : type(0) {}
2239
2240 template <typename T>
2241 ArgType(const T &arg) : type(make_type(arg)) {}
2242 };
2243
2244 # define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType()
2245
2246 inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) {
2247 return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) |
2248 (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) |
2249 (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) |
2250 (t12.type << 48) | (t13.type << 52) | (t14.type << 56);
2251 }
2252 #endif
2253 } // namespace internal
2254
2255 # define FMT_MAKE_TEMPLATE_ARG(n) typename T##n
2256 # define FMT_MAKE_ARG_TYPE(n) T##n
2257 # define FMT_MAKE_ARG(n) const T##n &v##n
2258 # define FMT_ASSIGN_char(n) \
2259 arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter<char> >(v##n)
2260 # define FMT_ASSIGN_wchar_t(n) \
2261 arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter<wchar_t> >(v##n)
2262
2263 #if FMT_USE_VARIADIC_TEMPLATES
2264 // Defines a variadic function returning void.
2265 # define FMT_VARIADIC_VOID(func, arg_type) \
2266 template <typename... Args> \
2267 void func(arg_type arg0, const Args & ... args) { \
2268 typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
2269 typename ArgArray::Type array{ \
2270 ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \
2271 func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \
2272 }
2273
2274 // Defines a variadic constructor.
2275 # define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \
2276 template <typename... Args> \
2277 ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \
2278 typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
2279 typename ArgArray::Type array{ \
2280 ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \
2281 func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \
2282 }
2283
2284 #else
2285
2286 # define FMT_MAKE_REF(n) \
2287 fmt::internal::MakeValue< fmt::BasicFormatter<Char> >(v##n)
2288 # define FMT_MAKE_REF2(n) v##n
2289
2290 // Defines a wrapper for a function taking one argument of type arg_type
2291 // and n additional arguments of arbitrary types.
2292 # define FMT_WRAP1(func, arg_type, n) \
2293 template <FMT_GEN(n, FMT_MAKE_TEMPLATE_ARG)> \
2294 inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \
2295 const fmt::internal::ArgArray<n>::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \
2296 func(arg1, fmt::ArgList( \
2297 fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \
2298 }
2299
2300 // Emulates a variadic function returning void on a pre-C++11 compiler.
2301 # define FMT_VARIADIC_VOID(func, arg_type) \
2302 inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \
2303 FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \
2304 FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \
2305 FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \
2306 FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \
2307 FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10)
2308
2309 # define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \
2310 template <FMT_GEN(n, FMT_MAKE_TEMPLATE_ARG)> \
2311 ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \
2312 const fmt::internal::ArgArray<n>::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \
2313 func(arg0, arg1, fmt::ArgList( \
2314 fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \
2315 }
2316
2317 // Emulates a variadic constructor on a pre-C++11 compiler.
2318 # define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \
2319 FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \
2320 FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \
2321 FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \
2322 FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \
2323 FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \
2324 FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \
2325 FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \
2326 FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \
2327 FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \
2328 FMT_CTOR(ctor, func, arg0_type, arg1_type, 10)
2329 #endif
2330
2331 // Generates a comma-separated list with results of applying f to pairs
2332 // (argument, index).
2333 #define FMT_FOR_EACH1(f, x0) f(x0, 0)
2334 #define FMT_FOR_EACH2(f, x0, x1) \
2335 FMT_FOR_EACH1(f, x0), f(x1, 1)
2336 #define FMT_FOR_EACH3(f, x0, x1, x2) \
2337 FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2)
2338 #define FMT_FOR_EACH4(f, x0, x1, x2, x3) \
2339 FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3)
2340 #define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \
2341 FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4)
2342 #define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \
2343 FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5)
2344 #define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \
2345 FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6)
2346 #define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \
2347 FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7)
2348 #define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \
2349 FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8)
2350 #define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \
2351 FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9)
2352
2353 /**
2354 An error returned by an operating system or a language runtime,
2355 for example a file opening error.
2356 */
2357 class SystemError : public internal::RuntimeError {
2358 private:
2359 void init(int err_code, CStringRef format_str, ArgList args);
2360
2361 protected:
2362 int error_code_;
2363
2364 typedef char Char; // For FMT_VARIADIC_CTOR.
2365
2366 SystemError() {}
2367
2368 public:
2369 /**
2370 \rst
2371 Constructs a :class:`fmt::SystemError` object with a description
2372 formatted with `fmt::format_system_error`. *message* and additional
2373 arguments passed into the constructor are formatted similarly to
2374 `fmt::format`.
2375
2376 **Example**::
2377
2378 // This throws a SystemError with the description
2379 // cannot open file 'madeup': No such file or directory
2380 // or similar (system message may vary).
2381 const char *filename = "madeup";
2382 std::FILE *file = std::fopen(filename, "r");
2383 if (!file)
2384 throw fmt::SystemError(errno, "cannot open file '{}'", filename);
2385 \endrst
2386 */
2387 SystemError(int error_code, CStringRef message) {
2388 init(error_code, message, ArgList());
2389 }
2390 FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef)
2391
2392 ~SystemError() FMT_DTOR_NOEXCEPT;
2393
2394 int error_code() const { return error_code_; }
2395 };
2396
2397 /**
2398 \rst
2399 Formats an error returned by an operating system or a language runtime,
2400 for example a file opening error, and writes it to *out* in the following
2401 form:
2402
2403 .. parsed-literal::
2404 *<message>*: *<system-message>*
2405
2406 where *<message>* is the passed message and *<system-message>* is
2407 the system message corresponding to the error code.
2408 *error_code* is a system error code as given by ``errno``.
2409 If *error_code* is not a valid error code such as -1, the system message
2410 may look like "Unknown error -1" and is platform-dependent.
2411 \endrst
2412 */
2413 FMT_API void format_system_error(fmt::Writer &out, int error_code,
2414 fmt::StringRef message) FMT_NOEXCEPT;
2415
2416 /**
2417 \rst
2418 This template provides operations for formatting and writing data into
2419 a character stream. The output is stored in a buffer provided by a subclass
2420 such as :class:`fmt::BasicMemoryWriter`.
2421
2422 You can use one of the following typedefs for common character types:
2423
2424 +---------+----------------------+
2425 | Type | Definition |
2426 +=========+======================+
2427 | Writer | BasicWriter<char> |
2428 +---------+----------------------+
2429 | WWriter | BasicWriter<wchar_t> |
2430 +---------+----------------------+
2431
2432 \endrst
2433 */
2434 template <typename Char>
2435 class BasicWriter {
2436 private:
2437 // Output buffer.
2438 Buffer<Char> &buffer_;
2439
2440 FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter);
2441
2442 typedef typename internal::CharTraits<Char>::CharPtr CharPtr;
2443
2444 #if FMT_SECURE_SCL
2445 // Returns pointer value.
2446 static Char *get(CharPtr p) { return p.base(); }
2447 #else
2448 static Char *get(Char *p) { return p; }
2449 #endif
2450
2451 // Fills the padding around the content and returns the pointer to the
2452 // content area.
2453 static CharPtr fill_padding(CharPtr buffer,
2454 unsigned total_size, std::size_t content_size, wchar_t fill);
2455
2456 // Grows the buffer by n characters and returns a pointer to the newly
2457 // allocated area.
2458 CharPtr grow_buffer(std::size_t n) {
2459 std::size_t size = buffer_.size();
2460 buffer_.resize(size + n);
2461 return internal::make_ptr(&buffer_[size], n);
2462 }
2463
2464 // Writes an unsigned decimal integer.
2465 template <typename UInt>
2466 Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) {
2467 unsigned num_digits = internal::count_digits(value);
2468 Char *ptr = get(grow_buffer(prefix_size + num_digits));
2469 internal::format_decimal(ptr + prefix_size, value, num_digits);
2470 return ptr;
2471 }
2472
2473 // Writes a decimal integer.
2474 template <typename Int>
2475 void write_decimal(Int value) {
2476 typedef typename internal::IntTraits<Int>::MainType MainType;
2477 MainType abs_value = static_cast<MainType>(value);
2478 if (internal::is_negative(value)) {
2479 abs_value = 0 - abs_value;
2480 *write_unsigned_decimal(abs_value, 1) = '-';
2481 } else {
2482 write_unsigned_decimal(abs_value, 0);
2483 }
2484 }
2485
2486 // Prepare a buffer for integer formatting.
2487 CharPtr prepare_int_buffer(unsigned num_digits,
2488 const EmptySpec &, const char *prefix, unsigned prefix_size) {
2489 unsigned size = prefix_size + num_digits;
2490 CharPtr p = grow_buffer(size);
2491 std::uninitialized_copy(prefix, prefix + prefix_size, p);
2492 return p + size - 1;
2493 }
2494
2495 template <typename Spec>
2496 CharPtr prepare_int_buffer(unsigned num_digits,
2497 const Spec &spec, const char *prefix, unsigned prefix_size);
2498
2499 // Formats an integer.
2500 template <typename T, typename Spec>
2501 void write_int(T value, Spec spec);
2502
2503 // Formats a floating-point number (double or long double).
2504 template <typename T>
2505 void write_double(T value, const FormatSpec &spec);
2506
2507 // Writes a formatted string.
2508 template <typename StrChar>
2509 CharPtr write_str(const StrChar *s, std::size_t size, const AlignSpec &spec);
2510
2511 template <typename StrChar>
2512 void write_str(const internal::Arg::StringValue<StrChar> &str,
2513 const FormatSpec &spec);
2514
2515 // This following methods are private to disallow writing wide characters
2516 // and strings to a char stream. If you want to print a wide string as a
2517 // pointer as std::ostream does, cast it to const void*.
2518 // Do not implement!
2519 void operator<<(typename internal::WCharHelper<wchar_t, Char>::Unsupported);
2520 void operator<<(
2521 typename internal::WCharHelper<const wchar_t *, Char>::Unsupported);
2522
2523 // Appends floating-point length specifier to the format string.
2524 // The second argument is only used for overload resolution.
2525 void append_float_length(Char *&format_ptr, long double) {
2526 *format_ptr++ = 'L';
2527 }
2528
2529 template<typename T>
2530 void append_float_length(Char *&, T) {}
2531
2532 template <typename Impl, typename Char_>
2533 friend class internal::ArgFormatterBase;
2534
2535 template <typename Impl, typename Char_>
2536 friend class BasicPrintfArgFormatter;
2537
2538 protected:
2539 /**
2540 Constructs a ``BasicWriter`` object.
2541 */
2542 explicit BasicWriter(Buffer<Char> &b) : buffer_(b) {}
2543
2544 public:
2545 /**
2546 \rst
2547 Destroys a ``BasicWriter`` object.
2548 \endrst
2549 */
2550 virtual ~BasicWriter() {}
2551
2552 /**
2553 Returns the total number of characters written.
2554 */
2555 std::size_t size() const { return buffer_.size(); }
2556
2557 /**
2558 Returns a pointer to the output buffer content. No terminating null
2559 character is appended.
2560 */
2561 const Char *data() const FMT_NOEXCEPT { return &buffer_[0]; }
2562
2563 /**
2564 Returns a pointer to the output buffer content with terminating null
2565 character appended.
2566 */
2567 const Char *c_str() const {
2568 std::size_t size = buffer_.size();
2569 buffer_.reserve(size + 1);
2570 buffer_[size] = '\0';
2571 return &buffer_[0];
2572 }
2573
2574 /**
2575 \rst
2576 Returns the content of the output buffer as an `std::string`.
2577 \endrst
2578 */
2579 std::basic_string<Char> str() const {
2580 return std::basic_string<Char>(&buffer_[0], buffer_.size());
2581 }
2582
2583 /**
2584 \rst
2585 Writes formatted data.
2586
2587 *args* is an argument list representing arbitrary arguments.
2588
2589 **Example**::
2590
2591 MemoryWriter out;
2592 out.write("Current point:\n");
2593 out.write("({:+f}, {:+f})", -3.14, 3.14);
2594
2595 This will write the following output to the ``out`` object:
2596
2597 .. code-block:: none
2598
2599 Current point:
2600 (-3.140000, +3.140000)
2601
2602 The output can be accessed using :func:`data()`, :func:`c_str` or
2603 :func:`str` methods.
2604
2605 See also :ref:`syntax`.
2606 \endrst
2607 */
2608 void write(BasicCStringRef<Char> format, ArgList args) {
2609 BasicFormatter<Char>(args, *this).format(format);
2610 }
2611 FMT_VARIADIC_VOID(write, BasicCStringRef<Char>)
2612
2613 BasicWriter &operator<<(int value) {
2614 write_decimal(value);
2615 return *this;
2616 }
2617 BasicWriter &operator<<(unsigned value) {
2618 return *this << IntFormatSpec<unsigned>(value);
2619 }
2620 BasicWriter &operator<<(long value) {
2621 write_decimal(value);
2622 return *this;
2623 }
2624 BasicWriter &operator<<(unsigned long value) {
2625 return *this << IntFormatSpec<unsigned long>(value);
2626 }
2627 BasicWriter &operator<<(LongLong value) {
2628 write_decimal(value);
2629 return *this;
2630 }
2631
2632 /**
2633 \rst
2634 Formats *value* and writes it to the stream.
2635 \endrst
2636 */
2637 BasicWriter &operator<<(ULongLong value) {
2638 return *this << IntFormatSpec<ULongLong>(value);
2639 }
2640
2641 BasicWriter &operator<<(double value) {
2642 write_double(value, FormatSpec());
2643 return *this;
2644 }
2645
2646 /**
2647 \rst
2648 Formats *value* using the general format for floating-point numbers
2649 (``'g'``) and writes it to the stream.
2650 \endrst
2651 */
2652 BasicWriter &operator<<(long double value) {
2653 write_double(value, FormatSpec());
2654 return *this;
2655 }
2656
2657 /**
2658 Writes a character to the stream.
2659 */
2660 BasicWriter &operator<<(char value) {
2661 buffer_.push_back(value);
2662 return *this;
2663 }
2664
2665 BasicWriter &operator<<(
2666 typename internal::WCharHelper<wchar_t, Char>::Supported value) {
2667 buffer_.push_back(value);
2668 return *this;
2669 }
2670
2671 /**
2672 \rst
2673 Writes *value* to the stream.
2674 \endrst
2675 */
2676 BasicWriter &operator<<(fmt::BasicStringRef<Char> value) {
2677 const Char *str = value.data();
2678 buffer_.append(str, str + value.size());
2679 return *this;
2680 }
2681
2682 BasicWriter &operator<<(
2683 typename internal::WCharHelper<StringRef, Char>::Supported value) {
2684 const char *str = value.data();
2685 buffer_.append(str, str + value.size());
2686 return *this;
2687 }
2688
2689 template <typename T, typename Spec, typename FillChar>
2690 BasicWriter &operator<<(IntFormatSpec<T, Spec, FillChar> spec) {
2691 internal::CharTraits<Char>::convert(FillChar());
2692 write_int(spec.value(), spec);
2693 return *this;
2694 }
2695
2696 template <typename StrChar>
2697 BasicWriter &operator<<(const StrFormatSpec<StrChar> &spec) {
2698 const StrChar *s = spec.str();
2699 write_str(s, std::char_traits<Char>::length(s), spec);
2700 return *this;
2701 }
2702
2703 void clear() FMT_NOEXCEPT { buffer_.clear(); }
2704
2705 Buffer<Char> &buffer() FMT_NOEXCEPT { return buffer_; }
2706 };
2707
2708 template <typename Char>
2709 template <typename StrChar>
2710 typename BasicWriter<Char>::CharPtr BasicWriter<Char>::write_str(
2711 const StrChar *s, std::size_t size, const AlignSpec &spec) {
2712 CharPtr out = CharPtr();
2713 if (spec.width() > size) {
2714 out = grow_buffer(spec.width());
2715 Char fill = internal::CharTraits<Char>::cast(spec.fill());
2716 if (spec.align() == ALIGN_RIGHT) {
2717 std::uninitialized_fill_n(out, spec.width() - size, fill);
2718 out += spec.width() - size;
2719 } else if (spec.align() == ALIGN_CENTER) {
2720 out = fill_padding(out, spec.width(), size, fill);
2721 } else {
2722 std::uninitialized_fill_n(out + size, spec.width() - size, fill);
2723 }
2724 } else {
2725 out = grow_buffer(size);
2726 }
2727 std::uninitialized_copy(s, s + size, out);
2728 return out;
2729 }
2730
2731 template <typename Char>
2732 template <typename StrChar>
2733 void BasicWriter<Char>::write_str(
2734 const internal::Arg::StringValue<StrChar> &s, const FormatSpec &spec) {
2735 // Check if StrChar is convertible to Char.
2736 internal::CharTraits<Char>::convert(StrChar());
2737 if (spec.type_ && spec.type_ != 's')
2738 internal::report_unknown_type(spec.type_, "string");
2739 const StrChar *str_value = s.value;
2740 std::size_t str_size = s.size;
2741 if (str_size == 0) {
2742 if (!str_value) {
2743 FMT_THROW(FormatError("string pointer is null"));
2744 }
2745 }
2746 std::size_t precision = static_cast<std::size_t>(spec.precision_);
2747 if (spec.precision_ >= 0 && precision < str_size)
2748 str_size = precision;
2749 write_str(str_value, str_size, spec);
2750 }
2751
2752 template <typename Char>
2753 typename BasicWriter<Char>::CharPtr
2754 BasicWriter<Char>::fill_padding(
2755 CharPtr buffer, unsigned total_size,
2756 std::size_t content_size, wchar_t fill) {
2757 std::size_t padding = total_size - content_size;
2758 std::size_t left_padding = padding / 2;
2759 Char fill_char = internal::CharTraits<Char>::cast(fill);
2760 std::uninitialized_fill_n(buffer, left_padding, fill_char);
2761 buffer += left_padding;
2762 CharPtr content = buffer;
2763 std::uninitialized_fill_n(buffer + content_size,
2764 padding - left_padding, fill_char);
2765 return content;
2766 }
2767
2768 template <typename Char>
2769 template <typename Spec>
2770 typename BasicWriter<Char>::CharPtr
2771 BasicWriter<Char>::prepare_int_buffer(
2772 unsigned num_digits, const Spec &spec,
2773 const char *prefix, unsigned prefix_size) {
2774 unsigned width = spec.width();
2775 Alignment align = spec.align();
2776 Char fill = internal::CharTraits<Char>::cast(spec.fill());
2777 if (spec.precision() > static_cast<int>(num_digits)) {
2778 // Octal prefix '0' is counted as a digit, so ignore it if precision
2779 // is specified.
2780 if (prefix_size > 0 && prefix[prefix_size - 1] == '0')
2781 --prefix_size;
2782 unsigned number_size =
2783 prefix_size + internal::to_unsigned(spec.precision());
2784 AlignSpec subspec(number_size, '0', ALIGN_NUMERIC);
2785 if (number_size >= width)
2786 return prepare_int_buffer(num_digits, subspec, prefix, prefix_size);
2787 buffer_.reserve(width);
2788 unsigned fill_size = width - number_size;
2789 if (align != ALIGN_LEFT) {
2790 CharPtr p = grow_buffer(fill_size);
2791 std::uninitialized_fill(p, p + fill_size, fill);
2792 }
2793 CharPtr result = prepare_int_buffer(
2794 num_digits, subspec, prefix, prefix_size);
2795 if (align == ALIGN_LEFT) {
2796 CharPtr p = grow_buffer(fill_size);
2797 std::uninitialized_fill(p, p + fill_size, fill);
2798 }
2799 return result;
2800 }
2801 unsigned size = prefix_size + num_digits;
2802 if (width <= size) {
2803 CharPtr p = grow_buffer(size);
2804 std::uninitialized_copy(prefix, prefix + prefix_size, p);
2805 return p + size - 1;
2806 }
2807 CharPtr p = grow_buffer(width);
2808 CharPtr end = p + width;
2809 if (align == ALIGN_LEFT) {
2810 std::uninitialized_copy(prefix, prefix + prefix_size, p);
2811 p += size;
2812 std::uninitialized_fill(p, end, fill);
2813 } else if (align == ALIGN_CENTER) {
2814 p = fill_padding(p, width, size, fill);
2815 std::uninitialized_copy(prefix, prefix + prefix_size, p);
2816 p += size;
2817 } else {
2818 if (align == ALIGN_NUMERIC) {
2819 if (prefix_size != 0) {
2820 p = std::uninitialized_copy(prefix, prefix + prefix_size, p);
2821 size -= prefix_size;
2822 }
2823 } else {
2824 std::uninitialized_copy(prefix, prefix + prefix_size, end - size);
2825 }
2826 std::uninitialized_fill(p, end - size, fill);
2827 p = end;
2828 }
2829 return p - 1;
2830 }
2831
2832 template <typename Char>
2833 template <typename T, typename Spec>
2834 void BasicWriter<Char>::write_int(T value, Spec spec) {
2835 unsigned prefix_size = 0;
2836 typedef typename internal::IntTraits<T>::MainType UnsignedType;
2837 UnsignedType abs_value = static_cast<UnsignedType>(value);
2838 char prefix[4] = "";
2839 if (internal::is_negative(value)) {
2840 prefix[0] = '-';
2841 ++prefix_size;
2842 abs_value = 0 - abs_value;
2843 } else if (spec.flag(SIGN_FLAG)) {
2844 prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' ';
2845 ++prefix_size;
2846 }
2847 switch (spec.type()) {
2848 case 0: case 'd': {
2849 unsigned num_digits = internal::count_digits(abs_value);
2850 CharPtr p = prepare_int_buffer(num_digits, spec, prefix, prefix_size) + 1;
2851 internal::format_decimal(get(p), abs_value, 0);
2852 break;
2853 }
2854 case 'x': case 'X': {
2855 UnsignedType n = abs_value;
2856 if (spec.flag(HASH_FLAG)) {
2857 prefix[prefix_size++] = '0';
2858 prefix[prefix_size++] = spec.type();
2859 }
2860 unsigned num_digits = 0;
2861 do {
2862 ++num_digits;
2863 } while ((n >>= 4) != 0);
2864 Char *p = get(prepare_int_buffer(
2865 num_digits, spec, prefix, prefix_size));
2866 n = abs_value;
2867 const char *digits = spec.type() == 'x' ?
2868 "0123456789abcdef" : "0123456789ABCDEF";
2869 do {
2870 *p-- = digits[n & 0xf];
2871 } while ((n >>= 4) != 0);
2872 break;
2873 }
2874 case 'b': case 'B': {
2875 UnsignedType n = abs_value;
2876 if (spec.flag(HASH_FLAG)) {
2877 prefix[prefix_size++] = '0';
2878 prefix[prefix_size++] = spec.type();
2879 }
2880 unsigned num_digits = 0;
2881 do {
2882 ++num_digits;
2883 } while ((n >>= 1) != 0);
2884 Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size));
2885 n = abs_value;
2886 do {
2887 *p-- = static_cast<Char>('0' + (n & 1));
2888 } while ((n >>= 1) != 0);
2889 break;
2890 }
2891 case 'o': {
2892 UnsignedType n = abs_value;
2893 if (spec.flag(HASH_FLAG))
2894 prefix[prefix_size++] = '0';
2895 unsigned num_digits = 0;
2896 do {
2897 ++num_digits;
2898 } while ((n >>= 3) != 0);
2899 Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size));
2900 n = abs_value;
2901 do {
2902 *p-- = static_cast<Char>('0' + (n & 7));
2903 } while ((n >>= 3) != 0);
2904 break;
2905 }
2906 case 'n': {
2907 unsigned num_digits = internal::count_digits(abs_value);
2908 fmt::StringRef sep = "";
2909 #ifndef ANDROID
2910 sep = internal::thousands_sep(std::localeconv());
2911 #endif
2912 unsigned size = static_cast<unsigned>(
2913 num_digits + sep.size() * ((num_digits - 1) / 3));
2914 CharPtr p = prepare_int_buffer(size, spec, prefix, prefix_size) + 1;
2915 internal::format_decimal(get(p), abs_value, 0, internal::ThousandsSep(sep));
2916 break;
2917 }
2918 default:
2919 internal::report_unknown_type(
2920 spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer");
2921 break;
2922 }
2923 }
2924
2925 template <typename Char>
2926 template <typename T>
2927 void BasicWriter<Char>::write_double(T value, const FormatSpec &spec) {
2928 // Check type.
2929 char type = spec.type();
2930 bool upper = false;
2931 switch (type) {
2932 case 0:
2933 type = 'g';
2934 break;
2935 case 'e': case 'f': case 'g': case 'a':
2936 break;
2937 case 'F':
2938 #if FMT_MSC_VER
2939 // MSVC's printf doesn't support 'F'.
2940 type = 'f';
2941 #endif
2942 // Fall through.
2943 case 'E': case 'G': case 'A':
2944 upper = true;
2945 break;
2946 default:
2947 internal::report_unknown_type(type, "double");
2948 break;
2949 }
2950
2951 char sign = 0;
2952 // Use isnegative instead of value < 0 because the latter is always
2953 // false for NaN.
2954 if (internal::FPUtil::isnegative(static_cast<double>(value))) {
2955 sign = '-';
2956 value = -value;
2957 } else if (spec.flag(SIGN_FLAG)) {
2958 sign = spec.flag(PLUS_FLAG) ? '+' : ' ';
2959 }
2960
2961 if (internal::FPUtil::isnotanumber(value)) {
2962 // Format NaN ourselves because sprintf's output is not consistent
2963 // across platforms.
2964 std::size_t nan_size = 4;
2965 const char *nan = upper ? " NAN" : " nan";
2966 if (!sign) {
2967 --nan_size;
2968 ++nan;
2969 }
2970 CharPtr out = write_str(nan, nan_size, spec);
2971 if (sign)
2972 *out = sign;
2973 return;
2974 }
2975
2976 if (internal::FPUtil::isinfinity(value)) {
2977 // Format infinity ourselves because sprintf's output is not consistent
2978 // across platforms.
2979 std::size_t inf_size = 4;
2980 const char *inf = upper ? " INF" : " inf";
2981 if (!sign) {
2982 --inf_size;
2983 ++inf;
2984 }
2985 CharPtr out = write_str(inf, inf_size, spec);
2986 if (sign)
2987 *out = sign;
2988 return;
2989 }
2990
2991 std::size_t offset = buffer_.size();
2992 unsigned width = spec.width();
2993 if (sign) {
2994 buffer_.reserve(buffer_.size() + (width > 1u ? width : 1u));
2995 if (width > 0)
2996 --width;
2997 ++offset;
2998 }
2999
3000 // Build format string.
3001 enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg
3002 Char format[MAX_FORMAT_SIZE];
3003 Char *format_ptr = format;
3004 *format_ptr++ = '%';
3005 unsigned width_for_sprintf = width;
3006 if (spec.flag(HASH_FLAG))
3007 *format_ptr++ = '#';
3008 if (spec.align() == ALIGN_CENTER) {
3009 width_for_sprintf = 0;
3010 } else {
3011 if (spec.align() == ALIGN_LEFT)
3012 *format_ptr++ = '-';
3013 if (width != 0)
3014 *format_ptr++ = '*';
3015 }
3016 if (spec.precision() >= 0) {
3017 *format_ptr++ = '.';
3018 *format_ptr++ = '*';
3019 }
3020
3021 append_float_length(format_ptr, value);
3022 *format_ptr++ = type;
3023 *format_ptr = '\0';
3024
3025 // Format using snprintf.
3026 Char fill = internal::CharTraits<Char>::cast(spec.fill());
3027 unsigned n = 0;
3028 Char *start = FMT_NULL;
3029 for (;;) {
3030 std::size_t buffer_size = buffer_.capacity() - offset;
3031 #if FMT_MSC_VER
3032 // MSVC's vsnprintf_s doesn't work with zero size, so reserve
3033 // space for at least one extra character to make the size non-zero.
3034 // Note that the buffer's capacity will increase by more than 1.
3035 if (buffer_size == 0) {
3036 buffer_.reserve(offset + 1);
3037 buffer_size = buffer_.capacity() - offset;
3038 }
3039 #endif
3040 start = &buffer_[offset];
3041 int result = internal::CharTraits<Char>::format_float(
3042 start, buffer_size, format, width_for_sprintf, spec.precision(), value);
3043 if (result >= 0) {
3044 n = internal::to_unsigned(result);
3045 if (offset + n < buffer_.capacity())
3046 break; // The buffer is large enough - continue with formatting.
3047 buffer_.reserve(offset + n + 1);
3048 } else {
3049 // If result is negative we ask to increase the capacity by at least 1,
3050 // but as std::vector, the buffer grows exponentially.
3051 buffer_.reserve(buffer_.capacity() + 1);
3052 }
3053 }
3054 if (sign) {
3055 if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) ||
3056 *start != ' ') {
3057 *(start - 1) = sign;
3058 sign = 0;
3059 } else {
3060 *(start - 1) = fill;
3061 }
3062 ++n;
3063 }
3064 if (spec.align() == ALIGN_CENTER && spec.width() > n) {
3065 width = spec.width();
3066 CharPtr p = grow_buffer(width);
3067 std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char));
3068 fill_padding(p, spec.width(), n, fill);
3069 return;
3070 }
3071 if (spec.fill() != ' ' || sign) {
3072 while (*start == ' ')
3073 *start++ = fill;
3074 if (sign)
3075 *(start - 1) = sign;
3076 }
3077 grow_buffer(n);
3078 }
3079
3080 /**
3081 \rst
3082 This class template provides operations for formatting and writing data
3083 into a character stream. The output is stored in a memory buffer that grows
3084 dynamically.
3085
3086 You can use one of the following typedefs for common character types
3087 and the standard allocator:
3088
3089 +---------------+-----------------------------------------------------+
3090 | Type | Definition |
3091 +===============+=====================================================+
3092 | MemoryWriter | BasicMemoryWriter<char, std::allocator<char>> |
3093 +---------------+-----------------------------------------------------+
3094 | WMemoryWriter | BasicMemoryWriter<wchar_t, std::allocator<wchar_t>> |
3095 +---------------+-----------------------------------------------------+
3096
3097 **Example**::
3098
3099 MemoryWriter out;
3100 out << "The answer is " << 42 << "\n";
3101 out.write("({:+f}, {:+f})", -3.14, 3.14);
3102
3103 This will write the following output to the ``out`` object:
3104
3105 .. code-block:: none
3106
3107 The answer is 42
3108 (-3.140000, +3.140000)
3109
3110 The output can be converted to an ``std::string`` with ``out.str()`` or
3111 accessed as a C string with ``out.c_str()``.
3112 \endrst
3113 */
3114 template <typename Char, typename Allocator = std::allocator<Char> >
3115 class BasicMemoryWriter : public BasicWriter<Char> {
3116 private:
3117 internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE, Allocator> buffer_;
3118
3119 public:
3120 explicit BasicMemoryWriter(const Allocator& alloc = Allocator())
3121 : BasicWriter<Char>(buffer_), buffer_(alloc) {}
3122
3123 #if FMT_USE_RVALUE_REFERENCES
3124 /**
3125 \rst
3126 Constructs a :class:`fmt::BasicMemoryWriter` object moving the content
3127 of the other object to it.
3128 \endrst
3129 */
3130 BasicMemoryWriter(BasicMemoryWriter &&other)
3131 : BasicWriter<Char>(buffer_), buffer_(std::move(other.buffer_)) {
3132 }
3133
3134 /**
3135 \rst
3136 Moves the content of the other ``BasicMemoryWriter`` object to this one.
3137 \endrst
3138 */
3139 BasicMemoryWriter &operator=(BasicMemoryWriter &&other) {
3140 buffer_ = std::move(other.buffer_);
3141 return *this;
3142 }
3143 #endif
3144 };
3145
3146 typedef BasicMemoryWriter<char> MemoryWriter;
3147 typedef BasicMemoryWriter<wchar_t> WMemoryWriter;
3148
3149 /**
3150 \rst
3151 This class template provides operations for formatting and writing data
3152 into a fixed-size array. For writing into a dynamically growing buffer
3153 use :class:`fmt::BasicMemoryWriter`.
3154
3155 Any write method will throw ``std::runtime_error`` if the output doesn't fit
3156 into the array.
3157
3158 You can use one of the following typedefs for common character types:
3159
3160 +--------------+---------------------------+
3161 | Type | Definition |
3162 +==============+===========================+
3163 | ArrayWriter | BasicArrayWriter<char> |
3164 +--------------+---------------------------+
3165 | WArrayWriter | BasicArrayWriter<wchar_t> |
3166 +--------------+---------------------------+
3167 \endrst
3168 */
3169 template <typename Char>
3170 class BasicArrayWriter : public BasicWriter<Char> {
3171 private:
3172 internal::FixedBuffer<Char> buffer_;
3173
3174 public:
3175 /**
3176 \rst
3177 Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the
3178 given size.
3179 \endrst
3180 */
3181 BasicArrayWriter(Char *array, std::size_t size)
3182 : BasicWriter<Char>(buffer_), buffer_(array, size) {}
3183
3184 /**
3185 \rst
3186 Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the
3187 size known at compile time.
3188 \endrst
3189 */
3190 template <std::size_t SIZE>
3191 explicit BasicArrayWriter(Char (&array)[SIZE])
3192 : BasicWriter<Char>(buffer_), buffer_(array, SIZE) {}
3193 };
3194
3195 typedef BasicArrayWriter<char> ArrayWriter;
3196 typedef BasicArrayWriter<wchar_t> WArrayWriter;
3197
3198 // Reports a system error without throwing an exception.
3199 // Can be used to report errors from destructors.
3200 FMT_API void report_system_error(int error_code,
3201 StringRef message) FMT_NOEXCEPT;
3202
3203 #if FMT_USE_WINDOWS_H
3204
3205 /** A Windows error. */
3206 class WindowsError : public SystemError {
3207 private:
3208 FMT_API void init(int error_code, CStringRef format_str, ArgList args);
3209
3210 public:
3211 /**
3212 \rst
3213 Constructs a :class:`fmt::WindowsError` object with the description
3214 of the form
3215
3216 .. parsed-literal::
3217 *<message>*: *<system-message>*
3218
3219 where *<message>* is the formatted message and *<system-message>* is the
3220 system message corresponding to the error code.
3221 *error_code* is a Windows error code as given by ``GetLastError``.
3222 If *error_code* is not a valid error code such as -1, the system message
3223 will look like "error -1".
3224
3225 **Example**::
3226
3227 // This throws a WindowsError with the description
3228 // cannot open file 'madeup': The system cannot find the file specified.
3229 // or similar (system message may vary).
3230 const char *filename = "madeup";
3231 LPOFSTRUCT of = LPOFSTRUCT();
3232 HFILE file = OpenFile(filename, &of, OF_READ);
3233 if (file == HFILE_ERROR) {
3234 throw fmt::WindowsError(GetLastError(),
3235 "cannot open file '{}'", filename);
3236 }
3237 \endrst
3238 */
3239 WindowsError(int error_code, CStringRef message) {
3240 init(error_code, message, ArgList());
3241 }
3242 FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef)
3243 };
3244
3245 // Reports a Windows error without throwing an exception.
3246 // Can be used to report errors from destructors.
3247 FMT_API void report_windows_error(int error_code,
3248 StringRef message) FMT_NOEXCEPT;
3249
3250 #endif
3251
3252 enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE };
3253
3254 /**
3255 Formats a string and prints it to stdout using ANSI escape sequences
3256 to specify color (experimental).
3257 Example:
3258 print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23);
3259 */
3260 FMT_API void print_colored(Color c, CStringRef format, ArgList args);
3261
3262 /**
3263 \rst
3264 Formats arguments and returns the result as a string.
3265
3266 **Example**::
3267
3268 std::string message = format("The answer is {}", 42);
3269 \endrst
3270 */
3271 inline std::string format(CStringRef format_str, ArgList args) {
3272 MemoryWriter w;
3273 w.write(format_str, args);
3274 return w.str();
3275 }
3276
3277 inline std::wstring format(WCStringRef format_str, ArgList args) {
3278 WMemoryWriter w;
3279 w.write(format_str, args);
3280 return w.str();
3281 }
3282
3283 /**
3284 \rst
3285 Prints formatted data to the file *f*.
3286
3287 **Example**::
3288
3289 print(stderr, "Don't {}!", "panic");
3290 \endrst
3291 */
3292 FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args);
3293
3294 /**
3295 \rst
3296 Prints formatted data to ``stdout``.
3297
3298 **Example**::
3299
3300 print("Elapsed time: {0:.2f} seconds", 1.23);
3301 \endrst
3302 */
3303 FMT_API void print(CStringRef format_str, ArgList args);
3304
3305 /**
3306 Fast integer formatter.
3307 */
3308 class FormatInt {
3309 private:
3310 // Buffer should be large enough to hold all digits (digits10 + 1),
3311 // a sign and a null character.
3312 enum {BUFFER_SIZE = std::numeric_limits<ULongLong>::digits10 + 3};
3313 mutable char buffer_[BUFFER_SIZE];
3314 char *str_;
3315
3316 // Formats value in reverse and returns the number of digits.
3317 char *format_decimal(ULongLong value) {
3318 char *buffer_end = buffer_ + BUFFER_SIZE - 1;
3319 while (value >= 100) {
3320 // Integer division is slow so do it for a group of two digits instead
3321 // of for every digit. The idea comes from the talk by Alexandrescu
3322 // "Three Optimization Tips for C++". See speed-test for a comparison.
3323 unsigned index = static_cast<unsigned>((value % 100) * 2);
3324 value /= 100;
3325 *--buffer_end = internal::Data::DIGITS[index + 1];
3326 *--buffer_end = internal::Data::DIGITS[index];
3327 }
3328 if (value < 10) {
3329 *--buffer_end = static_cast<char>('0' + value);
3330 return buffer_end;
3331 }
3332 unsigned index = static_cast<unsigned>(value * 2);
3333 *--buffer_end = internal::Data::DIGITS[index + 1];
3334 *--buffer_end = internal::Data::DIGITS[index];
3335 return buffer_end;
3336 }
3337
3338 void FormatSigned(LongLong value) {
3339 ULongLong abs_value = static_cast<ULongLong>(value);
3340 bool negative = value < 0;
3341 if (negative)
3342 abs_value = 0 - abs_value;
3343 str_ = format_decimal(abs_value);
3344 if (negative)
3345 *--str_ = '-';
3346 }
3347
3348 public:
3349 explicit FormatInt(int value) { FormatSigned(value); }
3350 explicit FormatInt(long value) { FormatSigned(value); }
3351 explicit FormatInt(LongLong value) { FormatSigned(value); }
3352 explicit FormatInt(unsigned value) : str_(format_decimal(value)) {}
3353 explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {}
3354 explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {}
3355
3356 /** Returns the number of characters written to the output buffer. */
3357 std::size_t size() const {
3358 return internal::to_unsigned(buffer_ - str_ + BUFFER_SIZE - 1);
3359 }
3360
3361 /**
3362 Returns a pointer to the output buffer content. No terminating null
3363 character is appended.
3364 */
3365 const char *data() const { return str_; }
3366
3367 /**
3368 Returns a pointer to the output buffer content with terminating null
3369 character appended.
3370 */
3371 const char *c_str() const {
3372 buffer_[BUFFER_SIZE - 1] = '\0';
3373 return str_;
3374 }
3375
3376 /**
3377 \rst
3378 Returns the content of the output buffer as an ``std::string``.
3379 \endrst
3380 */
3381 std::string str() const { return std::string(str_, size()); }
3382 };
3383
3384 // Formats a decimal integer value writing into buffer and returns
3385 // a pointer to the end of the formatted string. This function doesn't
3386 // write a terminating null character.
3387 template <typename T>
3388 inline void format_decimal(char *&buffer, T value) {
3389 typedef typename internal::IntTraits<T>::MainType MainType;
3390 MainType abs_value = static_cast<MainType>(value);
3391 if (internal::is_negative(value)) {
3392 *buffer++ = '-';
3393 abs_value = 0 - abs_value;
3394 }
3395 if (abs_value < 100) {
3396 if (abs_value < 10) {
3397 *buffer++ = static_cast<char>('0' + abs_value);
3398 return;
3399 }
3400 unsigned index = static_cast<unsigned>(abs_value * 2);
3401 *buffer++ = internal::Data::DIGITS[index];
3402 *buffer++ = internal::Data::DIGITS[index + 1];
3403 return;
3404 }
3405 unsigned num_digits = internal::count_digits(abs_value);
3406 internal::format_decimal(buffer, abs_value, num_digits);
3407 buffer += num_digits;
3408 }
3409
3410 /**
3411 \rst
3412 Returns a named argument for formatting functions.
3413
3414 **Example**::
3415
3416 print("Elapsed time: {s:.2f} seconds", arg("s", 1.23));
3417
3418 \endrst
3419 */
3420 template <typename T>
3421 inline internal::NamedArgWithType<char, T> arg(StringRef name, const T &arg) {
3422 return internal::NamedArgWithType<char, T>(name, arg);
3423 }
3424
3425 template <typename T>
3426 inline internal::NamedArgWithType<wchar_t, T> arg(WStringRef name, const T &arg) {
3427 return internal::NamedArgWithType<wchar_t, T>(name, arg);
3428 }
3429
3430 // The following two functions are deleted intentionally to disable
3431 // nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``.
3432 template <typename Char>
3433 void arg(StringRef, const internal::NamedArg<Char>&) FMT_DELETED_OR_UNDEFINED;
3434 template <typename Char>
3435 void arg(WStringRef, const internal::NamedArg<Char>&) FMT_DELETED_OR_UNDEFINED;
3436 }
3437
3438 #if FMT_GCC_VERSION
3439 // Use the system_header pragma to suppress warnings about variadic macros
3440 // because suppressing -Wvariadic-macros with the diagnostic pragma doesn't
3441 // work. It is used at the end because we want to suppress as little warnings
3442 // as possible.
3443 # pragma GCC system_header
3444 #endif
3445
3446 // This is used to work around VC++ bugs in handling variadic macros.
3447 #define FMT_EXPAND(args) args
3448
3449 // Returns the number of arguments.
3450 // Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s.
3451 #define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N())
3452 #define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__))
3453 #define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
3454 #define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
3455
3456 #define FMT_FOR_EACH_(N, f, ...) \
3457 FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__))
3458 #define FMT_FOR_EACH(f, ...) \
3459 FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__))
3460
3461 #define FMT_ADD_ARG_NAME(type, index) type arg##index
3462 #define FMT_GET_ARG_NAME(type, index) arg##index
3463
3464 #if FMT_USE_VARIADIC_TEMPLATES
3465 # define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \
3466 template <typename... Args> \
3467 ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \
3468 const Args & ... args) { \
3469 typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \
3470 typename ArgArray::Type array{ \
3471 ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \
3472 call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \
3473 fmt::ArgList(fmt::internal::make_type(args...), array)); \
3474 }
3475 #else
3476 // Defines a wrapper for a function taking __VA_ARGS__ arguments
3477 // and n additional arguments of arbitrary types.
3478 # define FMT_WRAP(Char, ReturnType, func, call, n, ...) \
3479 template <FMT_GEN(n, FMT_MAKE_TEMPLATE_ARG)> \
3480 inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \
3481 FMT_GEN(n, FMT_MAKE_ARG)) { \
3482 fmt::internal::ArgArray<n>::Type arr; \
3483 FMT_GEN(n, FMT_ASSIGN_##Char); \
3484 call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \
3485 fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \
3486 }
3487
3488 # define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \
3489 inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \
3490 call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \
3491 } \
3492 FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \
3493 FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \
3494 FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \
3495 FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \
3496 FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \
3497 FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \
3498 FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \
3499 FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \
3500 FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \
3501 FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \
3502 FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \
3503 FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \
3504 FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \
3505 FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \
3506 FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__)
3507 #endif // FMT_USE_VARIADIC_TEMPLATES
3508
3509 /**
3510 \rst
3511 Defines a variadic function with the specified return type, function name
3512 and argument types passed as variable arguments to this macro.
3513
3514 **Example**::
3515
3516 void print_error(const char *file, int line, const char *format,
3517 fmt::ArgList args) {
3518 fmt::print("{}: {}: ", file, line);
3519 fmt::print(format, args);
3520 }
3521 FMT_VARIADIC(void, print_error, const char *, int, const char *)
3522
3523 ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that
3524 don't implement variadic templates. You don't have to use this macro if
3525 you don't need legacy compiler support and can use variadic templates
3526 directly::
3527
3528 template <typename... Args>
3529 void print_error(const char *file, int line, const char *format,
3530 const Args & ... args) {
3531 fmt::print("{}: {}: ", file, line);
3532 fmt::print(format, args...);
3533 }
3534 \endrst
3535 */
3536 #define FMT_VARIADIC(ReturnType, func, ...) \
3537 FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__)
3538
3539 #define FMT_VARIADIC_W(ReturnType, func, ...) \
3540 FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__)
3541
3542 #define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id)
3543
3544 #define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id)
3545
3546 /**
3547 \rst
3548 Convenient macro to capture the arguments' names and values into several
3549 ``fmt::arg(name, value)``.
3550
3551 **Example**::
3552
3553 int x = 1, y = 2;
3554 print("point: ({x}, {y})", FMT_CAPTURE(x, y));
3555 // same as:
3556 // print("point: ({x}, {y})", arg("x", x), arg("y", y));
3557
3558 \endrst
3559 */
3560 #define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__)
3561
3562 #define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__)
3563
3564 namespace fmt {
3565 FMT_VARIADIC(std::string, format, CStringRef)
3566 FMT_VARIADIC_W(std::wstring, format, WCStringRef)
3567 FMT_VARIADIC(void, print, CStringRef)
3568 FMT_VARIADIC(void, print, std::FILE *, CStringRef)
3569 FMT_VARIADIC(void, print_colored, Color, CStringRef)
3570
3571 namespace internal {
3572 template <typename Char>
3573 inline bool is_name_start(Char c) {
3574 return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c;
3575 }
3576
3577 // Parses an unsigned integer advancing s to the end of the parsed input.
3578 // This function assumes that the first character of s is a digit.
3579 template <typename Char>
3580 unsigned parse_nonnegative_int(const Char *&s) {
3581 assert('0' <= *s && *s <= '9');
3582 unsigned value = 0;
3583 do {
3584 unsigned new_value = value * 10 + (*s++ - '0');
3585 // Check if value wrapped around.
3586 if (new_value < value) {
3587 value = (std::numeric_limits<unsigned>::max)();
3588 break;
3589 }
3590 value = new_value;
3591 } while ('0' <= *s && *s <= '9');
3592 // Convert to unsigned to prevent a warning.
3593 unsigned max_int = (std::numeric_limits<int>::max)();
3594 if (value > max_int)
3595 FMT_THROW(FormatError("number is too big"));
3596 return value;
3597 }
3598
3599 inline void require_numeric_argument(const Arg &arg, char spec) {
3600 if (arg.type > Arg::LAST_NUMERIC_TYPE) {
3601 std::string message =
3602 fmt::format("format specifier '{}' requires numeric argument", spec);
3603 FMT_THROW(fmt::FormatError(message));
3604 }
3605 }
3606
3607 template <typename Char>
3608 void check_sign(const Char *&s, const Arg &arg) {
3609 char sign = static_cast<char>(*s);
3610 require_numeric_argument(arg, sign);
3611 if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) {
3612 FMT_THROW(FormatError(fmt::format(
3613 "format specifier '{}' requires signed argument", sign)));
3614 }
3615 ++s;
3616 }
3617 } // namespace internal
3618
3619 template <typename Char, typename AF>
3620 inline internal::Arg BasicFormatter<Char, AF>::get_arg(
3621 BasicStringRef<Char> arg_name, const char *&error) {
3622 if (check_no_auto_index(error)) {
3623 map_.init(args());
3624 const internal::Arg *arg = map_.find(arg_name);
3625 if (arg)
3626 return *arg;
3627 error = "argument not found";
3628 }
3629 return internal::Arg();
3630 }
3631
3632 template <typename Char, typename AF>
3633 inline internal::Arg BasicFormatter<Char, AF>::parse_arg_index(const Char *&s) {
3634 const char *error = FMT_NULL;
3635 internal::Arg arg = *s < '0' || *s > '9' ?
3636 next_arg(error) : get_arg(internal::parse_nonnegative_int(s), error);
3637 if (error) {
3638 FMT_THROW(FormatError(
3639 *s != '}' && *s != ':' ? "invalid format string" : error));
3640 }
3641 return arg;
3642 }
3643
3644 template <typename Char, typename AF>
3645 inline internal::Arg BasicFormatter<Char, AF>::parse_arg_name(const Char *&s) {
3646 assert(internal::is_name_start(*s));
3647 const Char *start = s;
3648 Char c;
3649 do {
3650 c = *++s;
3651 } while (internal::is_name_start(c) || ('0' <= c && c <= '9'));
3652 const char *error = FMT_NULL;
3653 internal::Arg arg = get_arg(BasicStringRef<Char>(start, s - start), error);
3654 if (error)
3655 FMT_THROW(FormatError(error));
3656 return arg;
3657 }
3658
3659 template <typename Char, typename ArgFormatter>
3660 const Char *BasicFormatter<Char, ArgFormatter>::format(
3661 const Char *&format_str, const internal::Arg &arg) {
3662 using internal::Arg;
3663 const Char *s = format_str;
3664 FormatSpec spec;
3665 if (*s == ':') {
3666 if (arg.type == Arg::CUSTOM) {
3667 arg.custom.format(this, arg.custom.value, &s);
3668 return s;
3669 }
3670 ++s;
3671 // Parse fill and alignment.
3672 if (Char c = *s) {
3673 const Char *p = s + 1;
3674 spec.align_ = ALIGN_DEFAULT;
3675 do {
3676 switch (*p) {
3677 case '<':
3678 spec.align_ = ALIGN_LEFT;
3679 break;
3680 case '>':
3681 spec.align_ = ALIGN_RIGHT;
3682 break;
3683 case '=':
3684 spec.align_ = ALIGN_NUMERIC;
3685 break;
3686 case '^':
3687 spec.align_ = ALIGN_CENTER;
3688 break;
3689 }
3690 if (spec.align_ != ALIGN_DEFAULT) {
3691 if (p != s) {
3692 if (c == '}') break;
3693 if (c == '{')
3694 FMT_THROW(FormatError("invalid fill character '{'"));
3695 s += 2;
3696 spec.fill_ = c;
3697 } else ++s;
3698 if (spec.align_ == ALIGN_NUMERIC)
3699 require_numeric_argument(arg, '=');
3700 break;
3701 }
3702 } while (--p >= s);
3703 }
3704
3705 // Parse sign.
3706 switch (*s) {
3707 case '+':
3708 check_sign(s, arg);
3709 spec.flags_ |= SIGN_FLAG | PLUS_FLAG;
3710 break;
3711 case '-':
3712 check_sign(s, arg);
3713 spec.flags_ |= MINUS_FLAG;
3714 break;
3715 case ' ':
3716 check_sign(s, arg);
3717 spec.flags_ |= SIGN_FLAG;
3718 break;
3719 }
3720
3721 if (*s == '#') {
3722 require_numeric_argument(arg, '#');
3723 spec.flags_ |= HASH_FLAG;
3724 ++s;
3725 }
3726
3727 // Parse zero flag.
3728 if (*s == '0') {
3729 require_numeric_argument(arg, '0');
3730 spec.align_ = ALIGN_NUMERIC;
3731 spec.fill_ = '0';
3732 ++s;
3733 }
3734
3735 // Parse width.
3736 if ('0' <= *s && *s <= '9') {
3737 spec.width_ = internal::parse_nonnegative_int(s);
3738 } else if (*s == '{') {
3739 ++s;
3740 Arg width_arg = internal::is_name_start(*s) ?
3741 parse_arg_name(s) : parse_arg_index(s);
3742 if (*s++ != '}')
3743 FMT_THROW(FormatError("invalid format string"));
3744 ULongLong value = 0;
3745 switch (width_arg.type) {
3746 case Arg::INT:
3747 if (width_arg.int_value < 0)
3748 FMT_THROW(FormatError("negative width"));
3749 value = width_arg.int_value;
3750 break;
3751 case Arg::UINT:
3752 value = width_arg.uint_value;
3753 break;
3754 case Arg::LONG_LONG:
3755 if (width_arg.long_long_value < 0)
3756 FMT_THROW(FormatError("negative width"));
3757 value = width_arg.long_long_value;
3758 break;
3759 case Arg::ULONG_LONG:
3760 value = width_arg.ulong_long_value;
3761 break;
3762 default:
3763 FMT_THROW(FormatError("width is not integer"));
3764 }
3765 if (value > (std::numeric_limits<int>::max)())
3766 FMT_THROW(FormatError("number is too big"));
3767 spec.width_ = static_cast<int>(value);
3768 }
3769
3770 // Parse precision.
3771 if (*s == '.') {
3772 ++s;
3773 spec.precision_ = 0;
3774 if ('0' <= *s && *s <= '9') {
3775 spec.precision_ = internal::parse_nonnegative_int(s);
3776 } else if (*s == '{') {
3777 ++s;
3778 Arg precision_arg = internal::is_name_start(*s) ?
3779 parse_arg_name(s) : parse_arg_index(s);
3780 if (*s++ != '}')
3781 FMT_THROW(FormatError("invalid format string"));
3782 ULongLong value = 0;
3783 switch (precision_arg.type) {
3784 case Arg::INT:
3785 if (precision_arg.int_value < 0)
3786 FMT_THROW(FormatError("negative precision"));
3787 value = precision_arg.int_value;
3788 break;
3789 case Arg::UINT:
3790 value = precision_arg.uint_value;
3791 break;
3792 case Arg::LONG_LONG:
3793 if (precision_arg.long_long_value < 0)
3794 FMT_THROW(FormatError("negative precision"));
3795 value = precision_arg.long_long_value;
3796 break;
3797 case Arg::ULONG_LONG:
3798 value = precision_arg.ulong_long_value;
3799 break;
3800 default:
3801 FMT_THROW(FormatError("precision is not integer"));
3802 }
3803 if (value > (std::numeric_limits<int>::max)())
3804 FMT_THROW(FormatError("number is too big"));
3805 spec.precision_ = static_cast<int>(value);
3806 } else {
3807 FMT_THROW(FormatError("missing precision specifier"));
3808 }
3809 if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) {
3810 FMT_THROW(FormatError(
3811 fmt::format("precision not allowed in {} format specifier",
3812 arg.type == Arg::POINTER ? "pointer" : "integer")));
3813 }
3814 }
3815
3816 // Parse type.
3817 if (*s != '}' && *s)
3818 spec.type_ = static_cast<char>(*s++);
3819 }
3820
3821 if (*s++ != '}')
3822 FMT_THROW(FormatError("missing '}' in format string"));
3823
3824 // Format argument.
3825 ArgFormatter(*this, spec, s - 1).visit(arg);
3826 return s;
3827 }
3828
3829 template <typename Char, typename AF>
3830 void BasicFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
3831 const Char *s = format_str.c_str();
3832 const Char *start = s;
3833 while (*s) {
3834 Char c = *s++;
3835 if (c != '{' && c != '}') continue;
3836 if (*s == c) {
3837 write(writer_, start, s);
3838 start = ++s;
3839 continue;
3840 }
3841 if (c == '}')
3842 FMT_THROW(FormatError("unmatched '}' in format string"));
3843 write(writer_, start, s - 1);
3844 internal::Arg arg = internal::is_name_start(*s) ?
3845 parse_arg_name(s) : parse_arg_index(s);
3846 start = s = format(s, arg);
3847 }
3848 write(writer_, start, s);
3849 }
3850 } // namespace fmt
3851
3852 #if FMT_USE_USER_DEFINED_LITERALS
3853 namespace fmt {
3854 namespace internal {
3855
3856 template <typename Char>
3857 struct UdlFormat {
3858 const Char *str;
3859
3860 template <typename... Args>
3861 auto operator()(Args && ... args) const
3862 -> decltype(format(str, std::forward<Args>(args)...)) {
3863 return format(str, std::forward<Args>(args)...);
3864 }
3865 };
3866
3867 template <typename Char>
3868 struct UdlArg {
3869 const Char *str;
3870
3871 template <typename T>
3872 NamedArgWithType<Char, T> operator=(T &&value) const {
3873 return {str, std::forward<T>(value)};
3874 }
3875 };
3876
3877 } // namespace internal
3878
3879 inline namespace literals {
3880
3881 /**
3882 \rst
3883 C++11 literal equivalent of :func:`fmt::format`.
3884
3885 **Example**::
3886
3887 using namespace fmt::literals;
3888 std::string message = "The answer is {}"_format(42);
3889 \endrst
3890 */
3891 inline internal::UdlFormat<char>
3892 operator"" _format(const char *s, std::size_t) { return {s}; }
3893 inline internal::UdlFormat<wchar_t>
3894 operator"" _format(const wchar_t *s, std::size_t) { return {s}; }
3895
3896 /**
3897 \rst
3898 C++11 literal equivalent of :func:`fmt::arg`.
3899
3900 **Example**::
3901
3902 using namespace fmt::literals;
3903 print("Elapsed time: {s:.2f} seconds", "s"_a=1.23);
3904 \endrst
3905 */
3906 inline internal::UdlArg<char>
3907 operator"" _a(const char *s, std::size_t) { return {s}; }
3908 inline internal::UdlArg<wchar_t>
3909 operator"" _a(const wchar_t *s, std::size_t) { return {s}; }
3910
3911 } // inline namespace literals
3912 } // namespace fmt
3913 #endif // FMT_USE_USER_DEFINED_LITERALS
3914
3915 // Restore warnings.
3916 #if FMT_GCC_VERSION >= 406
3917 # pragma GCC diagnostic pop
3918 #endif
3919
3920 #if defined(__clang__) && !defined(FMT_ICC_VERSION)
3921 # pragma clang diagnostic pop
3922 #endif
3923
3924 #ifdef FMT_HEADER_ONLY
3925 # define FMT_FUNC inline
3926 # include "format.cc"
3927 #else
3928 # define FMT_FUNC
3929 #endif
3930
3931 #endif // FMT_FORMAT_H_
3932