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