astyle
This commit is contained in:
		
							parent
							
								
									6ab2f0e099
								
							
						
					
					
						commit
						93be7713e0
					
				@ -50,13 +50,13 @@ Distributed under the MIT License (http://opensource.org/licenses/MIT)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace spdlog
 | 
					namespace spdlog
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	namespace details
 | 
					namespace details
 | 
				
			||||||
	{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		template<typename T>
 | 
					template<typename T>
 | 
				
			||||||
		class mpmc_bounded_queue
 | 
					class mpmc_bounded_queue
 | 
				
			||||||
		{
 | 
					{
 | 
				
			||||||
		public:
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    using item_type = T;
 | 
					    using item_type = T;
 | 
				
			||||||
    mpmc_bounded_queue(size_t buffer_size)
 | 
					    mpmc_bounded_queue(size_t buffer_size)
 | 
				
			||||||
@ -84,18 +84,22 @@ namespace spdlog
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        cell_t* cell;
 | 
					        cell_t* cell;
 | 
				
			||||||
        size_t pos = enqueue_pos_.load(std::memory_order_relaxed);
 | 
					        size_t pos = enqueue_pos_.load(std::memory_order_relaxed);
 | 
				
			||||||
				for (;;) {
 | 
					        for (;;)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            cell = &buffer_[pos & buffer_mask_];
 | 
					            cell = &buffer_[pos & buffer_mask_];
 | 
				
			||||||
            size_t seq = cell->sequence_.load(std::memory_order_acquire);
 | 
					            size_t seq = cell->sequence_.load(std::memory_order_acquire);
 | 
				
			||||||
            intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos);
 | 
					            intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos);
 | 
				
			||||||
					if (dif == 0) {
 | 
					            if (dif == 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                if (enqueue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed))
 | 
					                if (enqueue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed))
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
					else if (dif < 0) {
 | 
					            else if (dif < 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
					else {
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                pos = enqueue_pos_.load(std::memory_order_relaxed);
 | 
					                pos = enqueue_pos_.load(std::memory_order_relaxed);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -108,12 +112,14 @@ namespace spdlog
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        cell_t* cell;
 | 
					        cell_t* cell;
 | 
				
			||||||
        size_t pos = dequeue_pos_.load(std::memory_order_relaxed);
 | 
					        size_t pos = dequeue_pos_.load(std::memory_order_relaxed);
 | 
				
			||||||
				for (;;) {
 | 
					        for (;;)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            cell = &buffer_[pos & buffer_mask_];
 | 
					            cell = &buffer_[pos & buffer_mask_];
 | 
				
			||||||
            size_t seq =
 | 
					            size_t seq =
 | 
				
			||||||
                cell->sequence_.load(std::memory_order_acquire);
 | 
					                cell->sequence_.load(std::memory_order_acquire);
 | 
				
			||||||
            intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos + 1);
 | 
					            intptr_t dif = static_cast<intptr_t>(seq) - static_cast<intptr_t>(pos + 1);
 | 
				
			||||||
					if (dif == 0) {
 | 
					            if (dif == 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                if (dequeue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed))
 | 
					                if (dequeue_pos_.compare_exchange_weak(pos, pos + 1, std::memory_order_relaxed))
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -131,15 +137,17 @@ namespace spdlog
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        size_t front, front1, back;
 | 
					        size_t front, front1, back;
 | 
				
			||||||
        // try to take a consistent snapshot of front/tail.
 | 
					        // try to take a consistent snapshot of front/tail.
 | 
				
			||||||
				do {					
 | 
					        do
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            front = enqueue_pos_.load(std::memory_order_acquire);
 | 
					            front = enqueue_pos_.load(std::memory_order_acquire);
 | 
				
			||||||
            back = dequeue_pos_.load(std::memory_order_acquire);
 | 
					            back = dequeue_pos_.load(std::memory_order_acquire);
 | 
				
			||||||
            front1 = enqueue_pos_.load(std::memory_order_relaxed);
 | 
					            front1 = enqueue_pos_.load(std::memory_order_relaxed);
 | 
				
			||||||
				} while (front != front1);
 | 
					        }
 | 
				
			||||||
 | 
					        while (front != front1);
 | 
				
			||||||
        return back == front;
 | 
					        return back == front;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private:
 | 
					private:
 | 
				
			||||||
    struct cell_t
 | 
					    struct cell_t
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        std::atomic<size_t>   sequence_;
 | 
					        std::atomic<size_t>   sequence_;
 | 
				
			||||||
@ -162,7 +170,7 @@ namespace spdlog
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    mpmc_bounded_queue(mpmc_bounded_queue const&) = delete;
 | 
					    mpmc_bounded_queue(mpmc_bounded_queue const&) = delete;
 | 
				
			||||||
    void operator= (mpmc_bounded_queue const&) = delete;
 | 
					    void operator= (mpmc_bounded_queue const&) = delete;
 | 
				
			||||||
		};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} // ns details
 | 
					} // ns details
 | 
				
			||||||
} // ns spdlog
 | 
					} // ns spdlog
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -13,22 +13,25 @@
 | 
				
			|||||||
#include "format.h"
 | 
					#include "format.h"
 | 
				
			||||||
#include <ostream>
 | 
					#include <ostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace fmt {
 | 
					namespace fmt
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace internal {
 | 
					namespace internal
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class Char>
 | 
					template <class Char>
 | 
				
			||||||
class FormatBuf : public std::basic_streambuf<Char> {
 | 
					class FormatBuf : public std::basic_streambuf<Char>
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    typedef typename std::basic_streambuf<Char>::int_type int_type;
 | 
					    typedef typename std::basic_streambuf<Char>::int_type int_type;
 | 
				
			||||||
    typedef typename std::basic_streambuf<Char>::traits_type traits_type;
 | 
					    typedef typename std::basic_streambuf<Char>::traits_type traits_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Buffer<Char> &buffer_;
 | 
					    Buffer<Char> &buffer_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    FormatBuf(Buffer<Char> &buffer) : buffer_(buffer) {}
 | 
					    FormatBuf(Buffer<Char> &buffer) : buffer_(buffer) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 protected:
 | 
					protected:
 | 
				
			||||||
    // The put-area is actually always empty. This makes the implementation
 | 
					    // The put-area is actually always empty. This makes the implementation
 | 
				
			||||||
    // simpler and has the advantage that the streambuf and the buffer are always
 | 
					    // simpler and has the advantage that the streambuf and the buffer are always
 | 
				
			||||||
    // in sync and sputc never writes into uninitialized memory. The obvious
 | 
					    // in sync and sputc never writes into uninitialized memory. The obvious
 | 
				
			||||||
@ -36,13 +39,15 @@ class FormatBuf : public std::basic_streambuf<Char> {
 | 
				
			|||||||
    // to overflow. There is no disadvantage here for sputn since this always
 | 
					    // to overflow. There is no disadvantage here for sputn since this always
 | 
				
			||||||
    // results in a call to xsputn.
 | 
					    // results in a call to xsputn.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int_type overflow(int_type ch = traits_type::eof()) FMT_OVERRIDE {
 | 
					    int_type overflow(int_type ch = traits_type::eof()) FMT_OVERRIDE
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (!traits_type::eq_int_type(ch, traits_type::eof()))
 | 
					        if (!traits_type::eq_int_type(ch, traits_type::eof()))
 | 
				
			||||||
            buffer_.push_back(static_cast<Char>(ch));
 | 
					            buffer_.push_back(static_cast<Char>(ch));
 | 
				
			||||||
        return ch;
 | 
					        return ch;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::streamsize xsputn(const Char *s, std::streamsize count) FMT_OVERRIDE {
 | 
					    std::streamsize xsputn(const Char *s, std::streamsize count) FMT_OVERRIDE
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        buffer_.append(s, s + count);
 | 
					        buffer_.append(s, s + count);
 | 
				
			||||||
        return count;
 | 
					        return count;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -50,7 +55,8 @@ class FormatBuf : public std::basic_streambuf<Char> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Yes &convert(std::ostream &);
 | 
					Yes &convert(std::ostream &);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct DummyStream : std::ostream {
 | 
					struct DummyStream : std::ostream
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    DummyStream();  // Suppress a bogus warning in MSVC.
 | 
					    DummyStream();  // Suppress a bogus warning in MSVC.
 | 
				
			||||||
    // Hide all operator<< overloads from std::ostream.
 | 
					    // Hide all operator<< overloads from std::ostream.
 | 
				
			||||||
    void operator<<(Null<>);
 | 
					    void operator<<(Null<>);
 | 
				
			||||||
@ -59,9 +65,11 @@ struct DummyStream : std::ostream {
 | 
				
			|||||||
No &operator<<(std::ostream &, int);
 | 
					No &operator<<(std::ostream &, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename T>
 | 
					template<typename T>
 | 
				
			||||||
struct ConvertToIntImpl<T, true> {
 | 
					struct ConvertToIntImpl<T, true>
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    // Convert to int only if T doesn't have an overloaded operator<<.
 | 
					    // Convert to int only if T doesn't have an overloaded operator<<.
 | 
				
			||||||
  enum {
 | 
					    enum
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
 | 
					        value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -73,7 +81,8 @@ FMT_API void write(std::ostream &os, Writer &w);
 | 
				
			|||||||
// Formats a value.
 | 
					// Formats a value.
 | 
				
			||||||
template <typename Char, typename ArgFormatter_, typename T>
 | 
					template <typename Char, typename ArgFormatter_, typename T>
 | 
				
			||||||
void format_arg(BasicFormatter<Char, ArgFormatter_> &f,
 | 
					void format_arg(BasicFormatter<Char, ArgFormatter_> &f,
 | 
				
			||||||
                const Char *&format_str, const T &value) {
 | 
					                const Char *&format_str, const T &value)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
 | 
					    internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    internal::FormatBuf<Char> format_buf(buffer);
 | 
					    internal::FormatBuf<Char> format_buf(buffer);
 | 
				
			||||||
 | 
				
			|||||||
@ -64,31 +64,39 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
 | 
					#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace fmt {
 | 
					namespace fmt
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// An error code.
 | 
					// An error code.
 | 
				
			||||||
class ErrorCode {
 | 
					class ErrorCode
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    int value_;
 | 
					    int value_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
  explicit ErrorCode(int value = 0) FMT_NOEXCEPT : value_(value) {}
 | 
					explicit ErrorCode(int value = 0) FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    value_(value) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int get() const FMT_NOEXCEPT { return value_; }
 | 
					    int get() const FMT_NOEXCEPT
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return value_;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// A buffered file.
 | 
					// A buffered file.
 | 
				
			||||||
class BufferedFile {
 | 
					class BufferedFile
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    FILE *file_;
 | 
					    FILE *file_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    friend class File;
 | 
					    friend class File;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    explicit BufferedFile(FILE *f) : file_(f) {}
 | 
					    explicit BufferedFile(FILE *f) : file_(f) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    // Constructs a BufferedFile object which doesn't represent any file.
 | 
					    // Constructs a BufferedFile object which doesn't represent any file.
 | 
				
			||||||
  BufferedFile() FMT_NOEXCEPT : file_(FMT_NULL) {}
 | 
					BufferedFile() FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    file_(FMT_NULL) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Destroys the object closing the file it represents if any.
 | 
					    // Destroys the object closing the file it represents if any.
 | 
				
			||||||
    FMT_API ~BufferedFile() FMT_NOEXCEPT;
 | 
					    FMT_API ~BufferedFile() FMT_NOEXCEPT;
 | 
				
			||||||
@ -97,31 +105,37 @@ class BufferedFile {
 | 
				
			|||||||
    // Emulate a move constructor and a move assignment operator if rvalue
 | 
					    // Emulate a move constructor and a move assignment operator if rvalue
 | 
				
			||||||
    // references are not supported.
 | 
					    // references are not supported.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					private:
 | 
				
			||||||
    // A proxy object to emulate a move constructor.
 | 
					    // A proxy object to emulate a move constructor.
 | 
				
			||||||
    // It is private to make it impossible call operator Proxy directly.
 | 
					    // It is private to make it impossible call operator Proxy directly.
 | 
				
			||||||
  struct Proxy {
 | 
					    struct Proxy
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        FILE *file;
 | 
					        FILE *file;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    // A "move constructor" for moving from a temporary.
 | 
					    // A "move constructor" for moving from a temporary.
 | 
				
			||||||
  BufferedFile(Proxy p) FMT_NOEXCEPT : file_(p.file) {}
 | 
					BufferedFile(Proxy p) FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    file_(p.file) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // A "move constructor" for moving from an lvalue.
 | 
					    // A "move constructor" for moving from an lvalue.
 | 
				
			||||||
  BufferedFile(BufferedFile &f) FMT_NOEXCEPT : file_(f.file_) {
 | 
					BufferedFile(BufferedFile &f) FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    file_(f.file_)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        f.file_ = FMT_NULL;
 | 
					        f.file_ = FMT_NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // A "move assignment operator" for moving from a temporary.
 | 
					    // A "move assignment operator" for moving from a temporary.
 | 
				
			||||||
  BufferedFile &operator=(Proxy p) {
 | 
					    BufferedFile &operator=(Proxy p)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        close();
 | 
					        close();
 | 
				
			||||||
        file_ = p.file;
 | 
					        file_ = p.file;
 | 
				
			||||||
        return *this;
 | 
					        return *this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // A "move assignment operator" for moving from an lvalue.
 | 
					    // A "move assignment operator" for moving from an lvalue.
 | 
				
			||||||
  BufferedFile &operator=(BufferedFile &other) {
 | 
					    BufferedFile &operator=(BufferedFile &other)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        close();
 | 
					        close();
 | 
				
			||||||
        file_ = other.file_;
 | 
					        file_ = other.file_;
 | 
				
			||||||
        other.file_ = FMT_NULL;
 | 
					        other.file_ = FMT_NULL;
 | 
				
			||||||
@ -130,22 +144,26 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Returns a proxy object for moving from a temporary:
 | 
					    // Returns a proxy object for moving from a temporary:
 | 
				
			||||||
    //   BufferedFile file = BufferedFile(...);
 | 
					    //   BufferedFile file = BufferedFile(...);
 | 
				
			||||||
  operator Proxy() FMT_NOEXCEPT {
 | 
					    operator Proxy() FMT_NOEXCEPT
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        Proxy p = {file_};
 | 
					        Proxy p = {file_};
 | 
				
			||||||
        file_ = FMT_NULL;
 | 
					        file_ = FMT_NULL;
 | 
				
			||||||
        return p;
 | 
					        return p;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 private:
 | 
					private:
 | 
				
			||||||
    FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile);
 | 
					    FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
  BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : file_(other.file_) {
 | 
					BufferedFile(BufferedFile &&other) FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    file_(other.file_)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        other.file_ = FMT_NULL;
 | 
					        other.file_ = FMT_NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  BufferedFile& operator=(BufferedFile &&other) {
 | 
					    BufferedFile& operator=(BufferedFile &&other)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        close();
 | 
					        close();
 | 
				
			||||||
        file_ = other.file_;
 | 
					        file_ = other.file_;
 | 
				
			||||||
        other.file_ = FMT_NULL;
 | 
					        other.file_ = FMT_NULL;
 | 
				
			||||||
@ -160,13 +178,17 @@ public:
 | 
				
			|||||||
    FMT_API void close();
 | 
					    FMT_API void close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Returns the pointer to a FILE object representing this file.
 | 
					    // Returns the pointer to a FILE object representing this file.
 | 
				
			||||||
  FILE *get() const FMT_NOEXCEPT { return file_; }
 | 
					    FILE *get() const FMT_NOEXCEPT
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return file_;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // We place parentheses around fileno to workaround a bug in some versions
 | 
					    // We place parentheses around fileno to workaround a bug in some versions
 | 
				
			||||||
    // of MinGW that define fileno as a macro.
 | 
					    // of MinGW that define fileno as a macro.
 | 
				
			||||||
    FMT_API int (fileno)() const;
 | 
					    FMT_API int (fileno)() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void print(CStringRef format_str, const ArgList &args) {
 | 
					    void print(CStringRef format_str, const ArgList &args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        fmt::print(file_, format_str, args);
 | 
					        fmt::print(file_, format_str, args);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    FMT_VARIADIC(void, print, CStringRef)
 | 
					    FMT_VARIADIC(void, print, CStringRef)
 | 
				
			||||||
@ -178,23 +200,26 @@ public:
 | 
				
			|||||||
// closing the file multiple times will cause a crash on Windows rather
 | 
					// closing the file multiple times will cause a crash on Windows rather
 | 
				
			||||||
// than an exception. You can get standard behavior by overriding the
 | 
					// than an exception. You can get standard behavior by overriding the
 | 
				
			||||||
// invalid parameter handler with _set_invalid_parameter_handler.
 | 
					// invalid parameter handler with _set_invalid_parameter_handler.
 | 
				
			||||||
class File {
 | 
					class File
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    int fd_;  // File descriptor.
 | 
					    int fd_;  // File descriptor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Constructs a File object with a given descriptor.
 | 
					    // Constructs a File object with a given descriptor.
 | 
				
			||||||
    explicit File(int fd) : fd_(fd) {}
 | 
					    explicit File(int fd) : fd_(fd) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    // Possible values for the oflag argument to the constructor.
 | 
					    // Possible values for the oflag argument to the constructor.
 | 
				
			||||||
  enum {
 | 
					    enum
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only.
 | 
					        RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only.
 | 
				
			||||||
        WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only.
 | 
					        WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only.
 | 
				
			||||||
        RDWR   = FMT_POSIX(O_RDWR)    // Open for reading and writing.
 | 
					        RDWR   = FMT_POSIX(O_RDWR)    // Open for reading and writing.
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Constructs a File object which doesn't represent any file.
 | 
					    // Constructs a File object which doesn't represent any file.
 | 
				
			||||||
  File() FMT_NOEXCEPT : fd_(-1) {}
 | 
					File() FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    fd_(-1) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Opens a file and constructs a File object representing this file.
 | 
					    // Opens a file and constructs a File object representing this file.
 | 
				
			||||||
    FMT_API File(CStringRef path, int oflag);
 | 
					    FMT_API File(CStringRef path, int oflag);
 | 
				
			||||||
@ -203,31 +228,37 @@ class File {
 | 
				
			|||||||
    // Emulate a move constructor and a move assignment operator if rvalue
 | 
					    // Emulate a move constructor and a move assignment operator if rvalue
 | 
				
			||||||
    // references are not supported.
 | 
					    // references are not supported.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					private:
 | 
				
			||||||
    // A proxy object to emulate a move constructor.
 | 
					    // A proxy object to emulate a move constructor.
 | 
				
			||||||
    // It is private to make it impossible call operator Proxy directly.
 | 
					    // It is private to make it impossible call operator Proxy directly.
 | 
				
			||||||
  struct Proxy {
 | 
					    struct Proxy
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        int fd;
 | 
					        int fd;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    // A "move constructor" for moving from a temporary.
 | 
					    // A "move constructor" for moving from a temporary.
 | 
				
			||||||
  File(Proxy p) FMT_NOEXCEPT : fd_(p.fd) {}
 | 
					File(Proxy p) FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    fd_(p.fd) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // A "move constructor" for moving from an lvalue.
 | 
					    // A "move constructor" for moving from an lvalue.
 | 
				
			||||||
  File(File &other) FMT_NOEXCEPT : fd_(other.fd_) {
 | 
					File(File &other) FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    fd_(other.fd_)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        other.fd_ = -1;
 | 
					        other.fd_ = -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // A "move assignment operator" for moving from a temporary.
 | 
					    // A "move assignment operator" for moving from a temporary.
 | 
				
			||||||
  File &operator=(Proxy p) {
 | 
					    File &operator=(Proxy p)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        close();
 | 
					        close();
 | 
				
			||||||
        fd_ = p.fd;
 | 
					        fd_ = p.fd;
 | 
				
			||||||
        return *this;
 | 
					        return *this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // A "move assignment operator" for moving from an lvalue.
 | 
					    // A "move assignment operator" for moving from an lvalue.
 | 
				
			||||||
  File &operator=(File &other) {
 | 
					    File &operator=(File &other)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        close();
 | 
					        close();
 | 
				
			||||||
        fd_ = other.fd_;
 | 
					        fd_ = other.fd_;
 | 
				
			||||||
        other.fd_ = -1;
 | 
					        other.fd_ = -1;
 | 
				
			||||||
@ -236,22 +267,26 @@ class File {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Returns a proxy object for moving from a temporary:
 | 
					    // Returns a proxy object for moving from a temporary:
 | 
				
			||||||
    //   File file = File(...);
 | 
					    //   File file = File(...);
 | 
				
			||||||
  operator Proxy() FMT_NOEXCEPT {
 | 
					    operator Proxy() FMT_NOEXCEPT
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        Proxy p = {fd_};
 | 
					        Proxy p = {fd_};
 | 
				
			||||||
        fd_ = -1;
 | 
					        fd_ = -1;
 | 
				
			||||||
        return p;
 | 
					        return p;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 private:
 | 
					private:
 | 
				
			||||||
    FMT_DISALLOW_COPY_AND_ASSIGN(File);
 | 
					    FMT_DISALLOW_COPY_AND_ASSIGN(File);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
  File(File &&other) FMT_NOEXCEPT : fd_(other.fd_) {
 | 
					File(File &&other) FMT_NOEXCEPT :
 | 
				
			||||||
 | 
					    fd_(other.fd_)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        other.fd_ = -1;
 | 
					        other.fd_ = -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  File& operator=(File &&other) {
 | 
					    File& operator=(File &&other)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        close();
 | 
					        close();
 | 
				
			||||||
        fd_ = other.fd_;
 | 
					        fd_ = other.fd_;
 | 
				
			||||||
        other.fd_ = -1;
 | 
					        other.fd_ = -1;
 | 
				
			||||||
@ -263,7 +298,10 @@ class File {
 | 
				
			|||||||
    FMT_API ~File() FMT_NOEXCEPT;
 | 
					    FMT_API ~File() FMT_NOEXCEPT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Returns the file descriptor.
 | 
					    // Returns the file descriptor.
 | 
				
			||||||
  int descriptor() const FMT_NOEXCEPT { return fd_; }
 | 
					    int descriptor() const FMT_NOEXCEPT
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return fd_;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Closes the file.
 | 
					    // Closes the file.
 | 
				
			||||||
    FMT_API void close();
 | 
					    FMT_API void close();
 | 
				
			||||||
@ -309,22 +347,26 @@ long getpagesize();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef FMT_LOCALE
 | 
					#ifdef FMT_LOCALE
 | 
				
			||||||
// A "C" numeric locale.
 | 
					// A "C" numeric locale.
 | 
				
			||||||
class Locale {
 | 
					class Locale
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
# ifdef _MSC_VER
 | 
					# ifdef _MSC_VER
 | 
				
			||||||
    typedef _locale_t locale_t;
 | 
					    typedef _locale_t locale_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    enum { LC_NUMERIC_MASK = LC_NUMERIC };
 | 
					    enum { LC_NUMERIC_MASK = LC_NUMERIC };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static locale_t newlocale(int category_mask, const char *locale, locale_t) {
 | 
					    static locale_t newlocale(int category_mask, const char *locale, locale_t)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        return _create_locale(category_mask, locale);
 | 
					        return _create_locale(category_mask, locale);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static void freelocale(locale_t locale) {
 | 
					    static void freelocale(locale_t locale)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        _free_locale(locale);
 | 
					        _free_locale(locale);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static double strtod_l(const char *nptr, char **endptr, _locale_t locale) {
 | 
					    static double strtod_l(const char *nptr, char **endptr, _locale_t locale)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        return _strtod_l(nptr, endptr, locale);
 | 
					        return _strtod_l(nptr, endptr, locale);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
# endif
 | 
					# endif
 | 
				
			||||||
@ -333,20 +375,28 @@ class Locale {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    FMT_DISALLOW_COPY_AND_ASSIGN(Locale);
 | 
					    FMT_DISALLOW_COPY_AND_ASSIGN(Locale);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    typedef locale_t Type;
 | 
					    typedef locale_t Type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", FMT_NULL)) {
 | 
					    Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", FMT_NULL))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (!locale_)
 | 
					        if (!locale_)
 | 
				
			||||||
            FMT_THROW(fmt::SystemError(errno, "cannot create locale"));
 | 
					            FMT_THROW(fmt::SystemError(errno, "cannot create locale"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ~Locale() { freelocale(locale_); }
 | 
					    ~Locale()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        freelocale(locale_);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Type get() const { return locale_; }
 | 
					    Type get() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return locale_;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Converts string to floating-point number and advances str past the end
 | 
					    // Converts string to floating-point number and advances str past the end
 | 
				
			||||||
    // of the parsed input.
 | 
					    // of the parsed input.
 | 
				
			||||||
  double strtod(const char *&str) const {
 | 
					    double strtod(const char *&str) const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        char *end = FMT_NULL;
 | 
					        char *end = FMT_NULL;
 | 
				
			||||||
        double result = strtod_l(str, &end, locale_);
 | 
					        double result = strtod_l(str, &end, locale_);
 | 
				
			||||||
        str = end;
 | 
					        str = end;
 | 
				
			||||||
@ -357,10 +407,17 @@ class Locale {
 | 
				
			|||||||
}  // namespace fmt
 | 
					}  // namespace fmt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !FMT_USE_RVALUE_REFERENCES
 | 
					#if !FMT_USE_RVALUE_REFERENCES
 | 
				
			||||||
namespace std {
 | 
					namespace std
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
// For compatibility with C++98.
 | 
					// For compatibility with C++98.
 | 
				
			||||||
inline fmt::BufferedFile &move(fmt::BufferedFile &f) { return f; }
 | 
					inline fmt::BufferedFile &move(fmt::BufferedFile &f)
 | 
				
			||||||
inline fmt::File &move(fmt::File &f) { return f; }
 | 
					{
 | 
				
			||||||
 | 
					    return f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					inline fmt::File &move(fmt::File &f)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -15,39 +15,54 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "ostream.h"
 | 
					#include "ostream.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace fmt {
 | 
					namespace fmt
 | 
				
			||||||
namespace internal {
 | 
					{
 | 
				
			||||||
 | 
					namespace internal
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Checks if a value fits in int - used to avoid warnings about comparing
 | 
					// Checks if a value fits in int - used to avoid warnings about comparing
 | 
				
			||||||
// signed and unsigned integers.
 | 
					// signed and unsigned integers.
 | 
				
			||||||
template <bool IsSigned>
 | 
					template <bool IsSigned>
 | 
				
			||||||
struct IntChecker {
 | 
					struct IntChecker
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  static bool fits_in_int(T value) {
 | 
					    static bool fits_in_int(T value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        unsigned max = std::numeric_limits<int>::max();
 | 
					        unsigned max = std::numeric_limits<int>::max();
 | 
				
			||||||
        return value <= max;
 | 
					        return value <= max;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  static bool fits_in_int(bool) { return true; }
 | 
					    static bool fits_in_int(bool)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <>
 | 
					template <>
 | 
				
			||||||
struct IntChecker<true> {
 | 
					struct IntChecker<true>
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  static bool fits_in_int(T value) {
 | 
					    static bool fits_in_int(T value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        return value >= std::numeric_limits<int>::min() &&
 | 
					        return value >= std::numeric_limits<int>::min() &&
 | 
				
			||||||
               value <= std::numeric_limits<int>::max();
 | 
					               value <= std::numeric_limits<int>::max();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  static bool fits_in_int(int) { return true; }
 | 
					    static bool fits_in_int(int)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PrecisionHandler : public ArgVisitor<PrecisionHandler, int> {
 | 
					class PrecisionHandler : public ArgVisitor<PrecisionHandler, int>
 | 
				
			||||||
 public:
 | 
					{
 | 
				
			||||||
  void report_unhandled_arg() {
 | 
					public:
 | 
				
			||||||
 | 
					    void report_unhandled_arg()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        FMT_THROW(FormatError("precision is not integer"));
 | 
					        FMT_THROW(FormatError("precision is not integer"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  int visit_any_int(T value) {
 | 
					    int visit_any_int(T value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (!IntChecker<std::numeric_limits<T>::is_signed>::fits_in_int(value))
 | 
					        if (!IntChecker<std::numeric_limits<T>::is_signed>::fits_in_int(value))
 | 
				
			||||||
            FMT_THROW(FormatError("number is too big"));
 | 
					            FMT_THROW(FormatError("number is too big"));
 | 
				
			||||||
        return static_cast<int>(value);
 | 
					        return static_cast<int>(value);
 | 
				
			||||||
@ -55,37 +70,62 @@ class PrecisionHandler : public ArgVisitor<PrecisionHandler, int> {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsZeroInt::visit(arg) returns true iff arg is a zero integer.
 | 
					// IsZeroInt::visit(arg) returns true iff arg is a zero integer.
 | 
				
			||||||
class IsZeroInt : public ArgVisitor<IsZeroInt, bool> {
 | 
					class IsZeroInt : public ArgVisitor<IsZeroInt, bool>
 | 
				
			||||||
 public:
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  bool visit_any_int(T value) { return value == 0; }
 | 
					    bool visit_any_int(T value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return value == 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// returns the default type for format specific "%s"
 | 
					// returns the default type for format specific "%s"
 | 
				
			||||||
class DefaultType : public ArgVisitor<DefaultType, char> {
 | 
					class DefaultType : public ArgVisitor<DefaultType, char>
 | 
				
			||||||
 public:
 | 
					{
 | 
				
			||||||
  char visit_char(int) { return 'c'; }
 | 
					public:
 | 
				
			||||||
 | 
					    char visit_char(int)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 'c';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char visit_bool(bool) { return 's'; }
 | 
					    char visit_bool(bool)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 's';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char visit_pointer(const void *) { return 'p'; }
 | 
					    char visit_pointer(const void *)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 'p';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  char visit_any_int(T) { return 'd'; }
 | 
					    char visit_any_int(T)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 'd';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  char visit_any_double(T) { return 'g'; }
 | 
					    char visit_any_double(T)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 'g';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char visit_unhandled_arg() { return 's'; }
 | 
					    char visit_unhandled_arg()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 's';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T, typename U>
 | 
					template <typename T, typename U>
 | 
				
			||||||
struct is_same {
 | 
					struct is_same
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    enum { value = 0 };
 | 
					    enum { value = 0 };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T>
 | 
					template <typename T>
 | 
				
			||||||
struct is_same<T, T> {
 | 
					struct is_same<T, T>
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    enum { value = 1 };
 | 
					    enum { value = 1 };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -94,55 +134,69 @@ struct is_same<T, T> {
 | 
				
			|||||||
// corresponding signed or unsigned type depending on the type specifier:
 | 
					// corresponding signed or unsigned type depending on the type specifier:
 | 
				
			||||||
// 'd' and 'i' - signed, other - unsigned)
 | 
					// 'd' and 'i' - signed, other - unsigned)
 | 
				
			||||||
template <typename T = void>
 | 
					template <typename T = void>
 | 
				
			||||||
class ArgConverter : public ArgVisitor<ArgConverter<T>, void> {
 | 
					class ArgConverter : public ArgVisitor<ArgConverter<T>, void>
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    internal::Arg &arg_;
 | 
					    internal::Arg &arg_;
 | 
				
			||||||
    wchar_t type_;
 | 
					    wchar_t type_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter);
 | 
					    FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    ArgConverter(internal::Arg &arg, wchar_t type)
 | 
					    ArgConverter(internal::Arg &arg, wchar_t type)
 | 
				
			||||||
        : arg_(arg), type_(type) {}
 | 
					        : arg_(arg), type_(type) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void visit_bool(bool value) {
 | 
					    void visit_bool(bool value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (type_ != 's')
 | 
					        if (type_ != 's')
 | 
				
			||||||
            visit_any_int(value);
 | 
					            visit_any_int(value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void visit_char(char value) {
 | 
					    void visit_char(char value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (type_ != 's')
 | 
					        if (type_ != 's')
 | 
				
			||||||
            visit_any_int(value);
 | 
					            visit_any_int(value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template <typename U>
 | 
					    template <typename U>
 | 
				
			||||||
  void visit_any_int(U value) {
 | 
					    void visit_any_int(U value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        bool is_signed = type_ == 'd' || type_ == 'i';
 | 
					        bool is_signed = type_ == 'd' || type_ == 'i';
 | 
				
			||||||
    if (type_ == 's') {
 | 
					        if (type_ == 's')
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            is_signed = std::numeric_limits<U>::is_signed;
 | 
					            is_signed = std::numeric_limits<U>::is_signed;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        using internal::Arg;
 | 
					        using internal::Arg;
 | 
				
			||||||
        typedef typename internal::Conditional<
 | 
					        typedef typename internal::Conditional<
 | 
				
			||||||
        is_same<T, void>::value, U, T>::type TargetType;
 | 
					        is_same<T, void>::value, U, T>::type TargetType;
 | 
				
			||||||
    if (sizeof(TargetType) <= sizeof(int)) {
 | 
					        if (sizeof(TargetType) <= sizeof(int))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            // Extra casts are used to silence warnings.
 | 
					            // Extra casts are used to silence warnings.
 | 
				
			||||||
      if (is_signed) {
 | 
					            if (is_signed)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                arg_.type = Arg::INT;
 | 
					                arg_.type = Arg::INT;
 | 
				
			||||||
                arg_.int_value = static_cast<int>(static_cast<TargetType>(value));
 | 
					                arg_.int_value = static_cast<int>(static_cast<TargetType>(value));
 | 
				
			||||||
      } else {
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                arg_.type = Arg::UINT;
 | 
					                arg_.type = Arg::UINT;
 | 
				
			||||||
                typedef typename internal::MakeUnsigned<TargetType>::Type Unsigned;
 | 
					                typedef typename internal::MakeUnsigned<TargetType>::Type Unsigned;
 | 
				
			||||||
                arg_.uint_value = static_cast<unsigned>(static_cast<Unsigned>(value));
 | 
					                arg_.uint_value = static_cast<unsigned>(static_cast<Unsigned>(value));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
    } else {
 | 
					        }
 | 
				
			||||||
      if (is_signed) {
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (is_signed)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                arg_.type = Arg::LONG_LONG;
 | 
					                arg_.type = Arg::LONG_LONG;
 | 
				
			||||||
                // glibc's printf doesn't sign extend arguments of smaller types:
 | 
					                // glibc's printf doesn't sign extend arguments of smaller types:
 | 
				
			||||||
                //   std::printf("%lld", -42);  // prints "4294967254"
 | 
					                //   std::printf("%lld", -42);  // prints "4294967254"
 | 
				
			||||||
                // but we don't have to do the same because it's a UB.
 | 
					                // but we don't have to do the same because it's a UB.
 | 
				
			||||||
                arg_.long_long_value = static_cast<LongLong>(value);
 | 
					                arg_.long_long_value = static_cast<LongLong>(value);
 | 
				
			||||||
      } else {
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                arg_.type = Arg::ULONG_LONG;
 | 
					                arg_.type = Arg::ULONG_LONG;
 | 
				
			||||||
                arg_.ulong_long_value =
 | 
					                arg_.ulong_long_value =
 | 
				
			||||||
                    static_cast<typename internal::MakeUnsigned<U>::Type>(value);
 | 
					                    static_cast<typename internal::MakeUnsigned<U>::Type>(value);
 | 
				
			||||||
@ -152,17 +206,19 @@ class ArgConverter : public ArgVisitor<ArgConverter<T>, void> {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Converts an integer argument to char for printf.
 | 
					// Converts an integer argument to char for printf.
 | 
				
			||||||
class CharConverter : public ArgVisitor<CharConverter, void> {
 | 
					class CharConverter : public ArgVisitor<CharConverter, void>
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    internal::Arg &arg_;
 | 
					    internal::Arg &arg_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter);
 | 
					    FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    explicit CharConverter(internal::Arg &arg) : arg_(arg) {}
 | 
					    explicit CharConverter(internal::Arg &arg) : arg_(arg) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  void visit_any_int(T value) {
 | 
					    void visit_any_int(T value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        arg_.type = internal::Arg::CHAR;
 | 
					        arg_.type = internal::Arg::CHAR;
 | 
				
			||||||
        arg_.int_value = static_cast<char>(value);
 | 
					        arg_.int_value = static_cast<char>(value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -170,24 +226,28 @@ class CharConverter : public ArgVisitor<CharConverter, void> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Checks if an argument is a valid printf width specifier and sets
 | 
					// Checks if an argument is a valid printf width specifier and sets
 | 
				
			||||||
// left alignment if it is negative.
 | 
					// left alignment if it is negative.
 | 
				
			||||||
class WidthHandler : public ArgVisitor<WidthHandler, unsigned> {
 | 
					class WidthHandler : public ArgVisitor<WidthHandler, unsigned>
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    FormatSpec &spec_;
 | 
					    FormatSpec &spec_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler);
 | 
					    FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    explicit WidthHandler(FormatSpec &spec) : spec_(spec) {}
 | 
					    explicit WidthHandler(FormatSpec &spec) : spec_(spec) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void report_unhandled_arg() {
 | 
					    void report_unhandled_arg()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        FMT_THROW(FormatError("width is not integer"));
 | 
					        FMT_THROW(FormatError("width is not integer"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template <typename T>
 | 
					    template <typename T>
 | 
				
			||||||
  unsigned visit_any_int(T value) {
 | 
					    unsigned visit_any_int(T value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        typedef typename internal::IntTraits<T>::MainType UnsignedType;
 | 
					        typedef typename internal::IntTraits<T>::MainType UnsignedType;
 | 
				
			||||||
        UnsignedType width = static_cast<UnsignedType>(value);
 | 
					        UnsignedType width = static_cast<UnsignedType>(value);
 | 
				
			||||||
    if (internal::is_negative(value)) {
 | 
					        if (internal::is_negative(value))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            spec_.align_ = ALIGN_LEFT;
 | 
					            spec_.align_ = ALIGN_LEFT;
 | 
				
			||||||
            width = 0 - width;
 | 
					            width = 0 - width;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -218,16 +278,18 @@ class WidthHandler : public ArgVisitor<WidthHandler, unsigned> {
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
template <typename Impl, typename Char, typename Spec>
 | 
					template <typename Impl, typename Char, typename Spec>
 | 
				
			||||||
class BasicPrintfArgFormatter :
 | 
					class BasicPrintfArgFormatter :
 | 
				
			||||||
    public internal::ArgFormatterBase<Impl, Char, Spec> {
 | 
					    public internal::ArgFormatterBase<Impl, Char, Spec>
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
  void write_null_pointer() {
 | 
					private:
 | 
				
			||||||
 | 
					    void write_null_pointer()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        this->spec().type_ = 0;
 | 
					        this->spec().type_ = 0;
 | 
				
			||||||
        this->write("(nil)");
 | 
					        this->write("(nil)");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    typedef internal::ArgFormatterBase<Impl, Char, Spec> Base;
 | 
					    typedef internal::ArgFormatterBase<Impl, Char, Spec> Base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
      \rst
 | 
					      \rst
 | 
				
			||||||
      Constructs an argument formatter object.
 | 
					      Constructs an argument formatter object.
 | 
				
			||||||
@ -239,7 +301,8 @@ class BasicPrintfArgFormatter :
 | 
				
			|||||||
        : internal::ArgFormatterBase<Impl, Char, Spec>(w, s) {}
 | 
					        : internal::ArgFormatterBase<Impl, Char, Spec>(w, s) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Formats an argument of type ``bool``. */
 | 
					    /** Formats an argument of type ``bool``. */
 | 
				
			||||||
  void visit_bool(bool value) {
 | 
					    void visit_bool(bool value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        Spec &fmt_spec = this->spec();
 | 
					        Spec &fmt_spec = this->spec();
 | 
				
			||||||
        if (fmt_spec.type_ != 's')
 | 
					        if (fmt_spec.type_ != 's')
 | 
				
			||||||
            return this->visit_any_int(value);
 | 
					            return this->visit_any_int(value);
 | 
				
			||||||
@ -248,30 +311,38 @@ class BasicPrintfArgFormatter :
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Formats a character. */
 | 
					    /** Formats a character. */
 | 
				
			||||||
  void visit_char(int value) {
 | 
					    void visit_char(int value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        const Spec &fmt_spec = this->spec();
 | 
					        const Spec &fmt_spec = this->spec();
 | 
				
			||||||
        BasicWriter<Char> &w = this->writer();
 | 
					        BasicWriter<Char> &w = this->writer();
 | 
				
			||||||
        if (fmt_spec.type_ && fmt_spec.type_ != 'c')
 | 
					        if (fmt_spec.type_ && fmt_spec.type_ != 'c')
 | 
				
			||||||
            w.write_int(value, fmt_spec);
 | 
					            w.write_int(value, fmt_spec);
 | 
				
			||||||
        typedef typename BasicWriter<Char>::CharPtr CharPtr;
 | 
					        typedef typename BasicWriter<Char>::CharPtr CharPtr;
 | 
				
			||||||
        CharPtr out = CharPtr();
 | 
					        CharPtr out = CharPtr();
 | 
				
			||||||
    if (fmt_spec.width_ > 1) {
 | 
					        if (fmt_spec.width_ > 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            Char fill = ' ';
 | 
					            Char fill = ' ';
 | 
				
			||||||
            out = w.grow_buffer(fmt_spec.width_);
 | 
					            out = w.grow_buffer(fmt_spec.width_);
 | 
				
			||||||
      if (fmt_spec.align_ != ALIGN_LEFT) {
 | 
					            if (fmt_spec.align_ != ALIGN_LEFT)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                std::fill_n(out, fmt_spec.width_ - 1, fill);
 | 
					                std::fill_n(out, fmt_spec.width_ - 1, fill);
 | 
				
			||||||
                out += fmt_spec.width_ - 1;
 | 
					                out += fmt_spec.width_ - 1;
 | 
				
			||||||
      } else {
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                std::fill_n(out + 1, fmt_spec.width_ - 1, fill);
 | 
					                std::fill_n(out + 1, fmt_spec.width_ - 1, fill);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
    } else {
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            out = w.grow_buffer(1);
 | 
					            out = w.grow_buffer(1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        *out = static_cast<Char>(value);
 | 
					        *out = static_cast<Char>(value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Formats a null-terminated C string. */
 | 
					    /** Formats a null-terminated C string. */
 | 
				
			||||||
  void visit_cstring(const char *value) {
 | 
					    void visit_cstring(const char *value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (value)
 | 
					        if (value)
 | 
				
			||||||
            Base::visit_cstring(value);
 | 
					            Base::visit_cstring(value);
 | 
				
			||||||
        else if (this->spec().type_ == 'p')
 | 
					        else if (this->spec().type_ == 'p')
 | 
				
			||||||
@ -281,7 +352,8 @@ class BasicPrintfArgFormatter :
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Formats a pointer. */
 | 
					    /** Formats a pointer. */
 | 
				
			||||||
  void visit_pointer(const void *value) {
 | 
					    void visit_pointer(const void *value)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (value)
 | 
					        if (value)
 | 
				
			||||||
            return Base::visit_pointer(value);
 | 
					            return Base::visit_pointer(value);
 | 
				
			||||||
        this->spec().type_ = 0;
 | 
					        this->spec().type_ = 0;
 | 
				
			||||||
@ -289,7 +361,8 @@ class BasicPrintfArgFormatter :
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** Formats an argument of a custom (user-defined) type. */
 | 
					    /** Formats an argument of a custom (user-defined) type. */
 | 
				
			||||||
  void visit_custom(internal::Arg::CustomValue c) {
 | 
					    void visit_custom(internal::Arg::CustomValue c)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        BasicFormatter<Char> formatter(ArgList(), this->writer());
 | 
					        BasicFormatter<Char> formatter(ArgList(), this->writer());
 | 
				
			||||||
        const Char format_str[] = {'}', 0};
 | 
					        const Char format_str[] = {'}', 0};
 | 
				
			||||||
        const Char *format = format_str;
 | 
					        const Char *format = format_str;
 | 
				
			||||||
@ -300,8 +373,9 @@ class BasicPrintfArgFormatter :
 | 
				
			|||||||
/** The default printf argument formatter. */
 | 
					/** The default printf argument formatter. */
 | 
				
			||||||
template <typename Char>
 | 
					template <typename Char>
 | 
				
			||||||
class PrintfArgFormatter :
 | 
					class PrintfArgFormatter :
 | 
				
			||||||
    public BasicPrintfArgFormatter<PrintfArgFormatter<Char>, Char, FormatSpec> {
 | 
					    public BasicPrintfArgFormatter<PrintfArgFormatter<Char>, Char, FormatSpec>
 | 
				
			||||||
 public:
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
    /** Constructs an argument formatter object. */
 | 
					    /** Constructs an argument formatter object. */
 | 
				
			||||||
    PrintfArgFormatter(BasicWriter<Char> &w, FormatSpec &s)
 | 
					    PrintfArgFormatter(BasicWriter<Char> &w, FormatSpec &s)
 | 
				
			||||||
        : BasicPrintfArgFormatter<PrintfArgFormatter<Char>, Char, FormatSpec>(w, s) {}
 | 
					        : BasicPrintfArgFormatter<PrintfArgFormatter<Char>, Char, FormatSpec>(w, s) {}
 | 
				
			||||||
@ -309,8 +383,9 @@ class PrintfArgFormatter :
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/** This template formats data and writes the output to a writer. */
 | 
					/** This template formats data and writes the output to a writer. */
 | 
				
			||||||
template <typename Char, typename ArgFormatter = PrintfArgFormatter<Char> >
 | 
					template <typename Char, typename ArgFormatter = PrintfArgFormatter<Char> >
 | 
				
			||||||
class PrintfFormatter : private internal::FormatterBase {
 | 
					class PrintfFormatter : private internal::FormatterBase
 | 
				
			||||||
 private:
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    BasicWriter<Char> &writer_;
 | 
					    BasicWriter<Char> &writer_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void parse_flags(FormatSpec &spec, const Char *&s);
 | 
					    void parse_flags(FormatSpec &spec, const Char *&s);
 | 
				
			||||||
@ -324,7 +399,7 @@ class PrintfFormatter : private internal::FormatterBase {
 | 
				
			|||||||
    // Parses argument index, flags and width and returns the argument index.
 | 
					    // Parses argument index, flags and width and returns the argument index.
 | 
				
			||||||
    unsigned parse_header(const Char *&s, FormatSpec &spec);
 | 
					    unsigned parse_header(const Char *&s, FormatSpec &spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 public:
 | 
					public:
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     \rst
 | 
					     \rst
 | 
				
			||||||
     Constructs a ``PrintfFormatter`` object. References to the arguments and
 | 
					     Constructs a ``PrintfFormatter`` object. References to the arguments and
 | 
				
			||||||
@ -340,9 +415,12 @@ class PrintfFormatter : private internal::FormatterBase {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename Char, typename AF>
 | 
					template <typename Char, typename AF>
 | 
				
			||||||
void PrintfFormatter<Char, AF>::parse_flags(FormatSpec &spec, const Char *&s) {
 | 
					void PrintfFormatter<Char, AF>::parse_flags(FormatSpec &spec, const Char *&s)
 | 
				
			||||||
  for (;;) {
 | 
					{
 | 
				
			||||||
    switch (*s++) {
 | 
					    for (;;)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        switch (*s++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
        case '-':
 | 
					        case '-':
 | 
				
			||||||
            spec.align_ = ALIGN_LEFT;
 | 
					            spec.align_ = ALIGN_LEFT;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@ -367,7 +445,8 @@ void PrintfFormatter<Char, AF>::parse_flags(FormatSpec &spec, const Char *&s) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
template <typename Char, typename AF>
 | 
					template <typename Char, typename AF>
 | 
				
			||||||
internal::Arg PrintfFormatter<Char, AF>::get_arg(const Char *s,
 | 
					internal::Arg PrintfFormatter<Char, AF>::get_arg(const Char *s,
 | 
				
			||||||
                                                 unsigned arg_index) {
 | 
					        unsigned arg_index)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    (void)s;
 | 
					    (void)s;
 | 
				
			||||||
    const char *error = FMT_NULL;
 | 
					    const char *error = FMT_NULL;
 | 
				
			||||||
    internal::Arg arg = arg_index == std::numeric_limits<unsigned>::max() ?
 | 
					    internal::Arg arg = arg_index == std::numeric_limits<unsigned>::max() ?
 | 
				
			||||||
@ -379,20 +458,26 @@ internal::Arg PrintfFormatter<Char, AF>::get_arg(const Char *s,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
template <typename Char, typename AF>
 | 
					template <typename Char, typename AF>
 | 
				
			||||||
unsigned PrintfFormatter<Char, AF>::parse_header(
 | 
					unsigned PrintfFormatter<Char, AF>::parse_header(
 | 
				
			||||||
  const Char *&s, FormatSpec &spec) {
 | 
					    const Char *&s, FormatSpec &spec)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    unsigned arg_index = std::numeric_limits<unsigned>::max();
 | 
					    unsigned arg_index = std::numeric_limits<unsigned>::max();
 | 
				
			||||||
    Char c = *s;
 | 
					    Char c = *s;
 | 
				
			||||||
  if (c >= '0' && c <= '9') {
 | 
					    if (c >= '0' && c <= '9')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        // Parse an argument index (if followed by '$') or a width possibly
 | 
					        // Parse an argument index (if followed by '$') or a width possibly
 | 
				
			||||||
        // preceded with '0' flag(s).
 | 
					        // preceded with '0' flag(s).
 | 
				
			||||||
        unsigned value = internal::parse_nonnegative_int(s);
 | 
					        unsigned value = internal::parse_nonnegative_int(s);
 | 
				
			||||||
    if (*s == '$') {  // value is an argument index
 | 
					        if (*s == '$')    // value is an argument index
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            ++s;
 | 
					            ++s;
 | 
				
			||||||
            arg_index = value;
 | 
					            arg_index = value;
 | 
				
			||||||
    } else {
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            if (c == '0')
 | 
					            if (c == '0')
 | 
				
			||||||
                spec.fill_ = '0';
 | 
					                spec.fill_ = '0';
 | 
				
			||||||
      if (value != 0) {
 | 
					            if (value != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                // Nonzero value means that we parsed width and don't need to
 | 
					                // Nonzero value means that we parsed width and don't need to
 | 
				
			||||||
                // parse it or flags again, so return now.
 | 
					                // parse it or flags again, so return now.
 | 
				
			||||||
                spec.width_ = value;
 | 
					                spec.width_ = value;
 | 
				
			||||||
@ -402,9 +487,12 @@ unsigned PrintfFormatter<Char, AF>::parse_header(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    parse_flags(spec, s);
 | 
					    parse_flags(spec, s);
 | 
				
			||||||
    // Parse width.
 | 
					    // Parse width.
 | 
				
			||||||
  if (*s >= '0' && *s <= '9') {
 | 
					    if (*s >= '0' && *s <= '9')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        spec.width_ = internal::parse_nonnegative_int(s);
 | 
					        spec.width_ = internal::parse_nonnegative_int(s);
 | 
				
			||||||
  } else if (*s == '*') {
 | 
					    }
 | 
				
			||||||
 | 
					    else if (*s == '*')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        ++s;
 | 
					        ++s;
 | 
				
			||||||
        spec.width_ = internal::WidthHandler(spec).visit(get_arg(s));
 | 
					        spec.width_ = internal::WidthHandler(spec).visit(get_arg(s));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -412,13 +500,16 @@ unsigned PrintfFormatter<Char, AF>::parse_header(
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename Char, typename AF>
 | 
					template <typename Char, typename AF>
 | 
				
			||||||
void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
 | 
					void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    const Char *start = format_str.c_str();
 | 
					    const Char *start = format_str.c_str();
 | 
				
			||||||
    const Char *s = start;
 | 
					    const Char *s = start;
 | 
				
			||||||
  while (*s) {
 | 
					    while (*s)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        Char c = *s++;
 | 
					        Char c = *s++;
 | 
				
			||||||
        if (c != '%') continue;
 | 
					        if (c != '%') continue;
 | 
				
			||||||
    if (*s == c) {
 | 
					        if (*s == c)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            write(writer_, start, s);
 | 
					            write(writer_, start, s);
 | 
				
			||||||
            start = ++s;
 | 
					            start = ++s;
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
@ -432,14 +523,20 @@ void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
 | 
				
			|||||||
        unsigned arg_index = parse_header(s, spec);
 | 
					        unsigned arg_index = parse_header(s, spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Parse precision.
 | 
					        // Parse precision.
 | 
				
			||||||
    if (*s == '.') {
 | 
					        if (*s == '.')
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            ++s;
 | 
					            ++s;
 | 
				
			||||||
      if ('0' <= *s && *s <= '9') {
 | 
					            if ('0' <= *s && *s <= '9')
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                spec.precision_ = static_cast<int>(internal::parse_nonnegative_int(s));
 | 
					                spec.precision_ = static_cast<int>(internal::parse_nonnegative_int(s));
 | 
				
			||||||
      } else if (*s == '*') {
 | 
					            }
 | 
				
			||||||
 | 
					            else if (*s == '*')
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                ++s;
 | 
					                ++s;
 | 
				
			||||||
                spec.precision_ = internal::PrecisionHandler().visit(get_arg(s));
 | 
					                spec.precision_ = internal::PrecisionHandler().visit(get_arg(s));
 | 
				
			||||||
      } else {
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                spec.precision_ = 0;
 | 
					                spec.precision_ = 0;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -448,7 +545,8 @@ void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
 | 
				
			|||||||
        Arg arg = get_arg(s, arg_index);
 | 
					        Arg arg = get_arg(s, arg_index);
 | 
				
			||||||
        if (spec.flag(HASH_FLAG) && internal::IsZeroInt().visit(arg))
 | 
					        if (spec.flag(HASH_FLAG) && internal::IsZeroInt().visit(arg))
 | 
				
			||||||
            spec.flags_ &= ~internal::to_unsigned<int>(HASH_FLAG);
 | 
					            spec.flags_ &= ~internal::to_unsigned<int>(HASH_FLAG);
 | 
				
			||||||
    if (spec.fill_ == '0') {
 | 
					        if (spec.fill_ == '0')
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            if (arg.type <= Arg::LAST_NUMERIC_TYPE)
 | 
					            if (arg.type <= Arg::LAST_NUMERIC_TYPE)
 | 
				
			||||||
                spec.align_ = ALIGN_NUMERIC;
 | 
					                spec.align_ = ALIGN_NUMERIC;
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
@ -457,7 +555,8 @@ void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Parse length and convert the argument to the required type.
 | 
					        // Parse length and convert the argument to the required type.
 | 
				
			||||||
        using internal::ArgConverter;
 | 
					        using internal::ArgConverter;
 | 
				
			||||||
    switch (*s++) {
 | 
					        switch (*s++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
        case 'h':
 | 
					        case 'h':
 | 
				
			||||||
            if (*s == 'h')
 | 
					            if (*s == 'h')
 | 
				
			||||||
                ArgConverter<signed char>(arg, *++s).visit(arg);
 | 
					                ArgConverter<signed char>(arg, *++s).visit(arg);
 | 
				
			||||||
@ -493,15 +592,19 @@ void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
 | 
				
			|||||||
            FMT_THROW(FormatError("invalid format string"));
 | 
					            FMT_THROW(FormatError("invalid format string"));
 | 
				
			||||||
        spec.type_ = static_cast<char>(*s++);
 | 
					        spec.type_ = static_cast<char>(*s++);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (spec.type_ == 's') {
 | 
					        if (spec.type_ == 's')
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            // set the format type to the default if 's' is specified
 | 
					            // set the format type to the default if 's' is specified
 | 
				
			||||||
            spec.type_ = internal::DefaultType().visit(arg);
 | 
					            spec.type_ = internal::DefaultType().visit(arg);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (arg.type <= Arg::LAST_INTEGER_TYPE) {
 | 
					        if (arg.type <= Arg::LAST_INTEGER_TYPE)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            // Normalize type.
 | 
					            // Normalize type.
 | 
				
			||||||
      switch (spec.type_) {
 | 
					            switch (spec.type_)
 | 
				
			||||||
      case 'i': case 'u':
 | 
					            {
 | 
				
			||||||
 | 
					            case 'i':
 | 
				
			||||||
 | 
					            case 'u':
 | 
				
			||||||
                spec.type_ = 'd';
 | 
					                spec.type_ = 'd';
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case 'c':
 | 
					            case 'c':
 | 
				
			||||||
@ -519,12 +622,14 @@ void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
 | 
				
			|||||||
    write(writer_, start, s);
 | 
					    write(writer_, start, s);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void printf(Writer &w, CStringRef format, ArgList args) {
 | 
					inline void printf(Writer &w, CStringRef format, ArgList args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    PrintfFormatter<char>(args, w).format(format);
 | 
					    PrintfFormatter<char>(args, w).format(format);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
FMT_VARIADIC(void, printf, Writer &, CStringRef)
 | 
					FMT_VARIADIC(void, printf, Writer &, CStringRef)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void printf(WWriter &w, WCStringRef format, ArgList args) {
 | 
					inline void printf(WWriter &w, WCStringRef format, ArgList args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    PrintfFormatter<wchar_t>(args, w).format(format);
 | 
					    PrintfFormatter<wchar_t>(args, w).format(format);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
FMT_VARIADIC(void, printf, WWriter &, WCStringRef)
 | 
					FMT_VARIADIC(void, printf, WWriter &, WCStringRef)
 | 
				
			||||||
@ -538,14 +643,16 @@ FMT_VARIADIC(void, printf, WWriter &, WCStringRef)
 | 
				
			|||||||
    std::string message = fmt::sprintf("The answer is %d", 42);
 | 
					    std::string message = fmt::sprintf("The answer is %d", 42);
 | 
				
			||||||
  \endrst
 | 
					  \endrst
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
inline std::string sprintf(CStringRef format, ArgList args) {
 | 
					inline std::string sprintf(CStringRef format, ArgList args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    MemoryWriter w;
 | 
					    MemoryWriter w;
 | 
				
			||||||
    printf(w, format, args);
 | 
					    printf(w, format, args);
 | 
				
			||||||
    return w.str();
 | 
					    return w.str();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
FMT_VARIADIC(std::string, sprintf, CStringRef)
 | 
					FMT_VARIADIC(std::string, sprintf, CStringRef)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline std::wstring sprintf(WCStringRef format, ArgList args) {
 | 
					inline std::wstring sprintf(WCStringRef format, ArgList args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    WMemoryWriter w;
 | 
					    WMemoryWriter w;
 | 
				
			||||||
    printf(w, format, args);
 | 
					    printf(w, format, args);
 | 
				
			||||||
    return w.str();
 | 
					    return w.str();
 | 
				
			||||||
@ -573,7 +680,8 @@ FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef)
 | 
				
			|||||||
    fmt::printf("Elapsed time: %.2f seconds", 1.23);
 | 
					    fmt::printf("Elapsed time: %.2f seconds", 1.23);
 | 
				
			||||||
  \endrst
 | 
					  \endrst
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
inline int printf(CStringRef format, ArgList args) {
 | 
					inline int printf(CStringRef format, ArgList args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    return fprintf(stdout, format, args);
 | 
					    return fprintf(stdout, format, args);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
FMT_VARIADIC(int, printf, CStringRef)
 | 
					FMT_VARIADIC(int, printf, CStringRef)
 | 
				
			||||||
@ -587,7 +695,8 @@ FMT_VARIADIC(int, printf, CStringRef)
 | 
				
			|||||||
    fprintf(cerr, "Don't %s!", "panic");
 | 
					    fprintf(cerr, "Don't %s!", "panic");
 | 
				
			||||||
  \endrst
 | 
					  \endrst
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
inline int fprintf(std::ostream &os, CStringRef format_str, ArgList args) {
 | 
					inline int fprintf(std::ostream &os, CStringRef format_str, ArgList args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    MemoryWriter w;
 | 
					    MemoryWriter w;
 | 
				
			||||||
    printf(w, format_str, args);
 | 
					    printf(w, format_str, args);
 | 
				
			||||||
    internal::write(os, w);
 | 
					    internal::write(os, w);
 | 
				
			||||||
 | 
				
			|||||||
@ -19,10 +19,12 @@
 | 
				
			|||||||
# pragma warning(disable: 4996)  // "deprecated" functions
 | 
					# pragma warning(disable: 4996)  // "deprecated" functions
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace fmt {
 | 
					namespace fmt
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
template <typename ArgFormatter>
 | 
					template <typename ArgFormatter>
 | 
				
			||||||
void format_arg(BasicFormatter<char, ArgFormatter> &f,
 | 
					void format_arg(BasicFormatter<char, ArgFormatter> &f,
 | 
				
			||||||
                const char *&format_str, const std::tm &tm) {
 | 
					                const char *&format_str, const std::tm &tm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    if (*format_str == ':')
 | 
					    if (*format_str == ':')
 | 
				
			||||||
        ++format_str;
 | 
					        ++format_str;
 | 
				
			||||||
    const char *end = format_str;
 | 
					    const char *end = format_str;
 | 
				
			||||||
@ -35,14 +37,17 @@ void format_arg(BasicFormatter<char, ArgFormatter> &f,
 | 
				
			|||||||
    format[format.size() - 1] = '\0';
 | 
					    format[format.size() - 1] = '\0';
 | 
				
			||||||
    Buffer<char> &buffer = f.writer().buffer();
 | 
					    Buffer<char> &buffer = f.writer().buffer();
 | 
				
			||||||
    std::size_t start = buffer.size();
 | 
					    std::size_t start = buffer.size();
 | 
				
			||||||
  for (;;) {
 | 
					    for (;;)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        std::size_t size = buffer.capacity() - start;
 | 
					        std::size_t size = buffer.capacity() - start;
 | 
				
			||||||
        std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm);
 | 
					        std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm);
 | 
				
			||||||
    if (count != 0) {
 | 
					        if (count != 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            buffer.resize(start + count);
 | 
					            buffer.resize(start + count);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    if (size >= format.size() * 256) {
 | 
					        if (size >= format.size() * 256)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            // If the buffer is 256 times larger than the format string, assume
 | 
					            // If the buffer is 256 times larger than the format string, assume
 | 
				
			||||||
            // that `strftime` gives an empty result. There doesn't seem to be a
 | 
					            // that `strftime` gives an empty result. There doesn't seem to be a
 | 
				
			||||||
            // better way to distinguish the two cases:
 | 
					            // better way to distinguish the two cases:
 | 
				
			||||||
@ -55,36 +60,60 @@ void format_arg(BasicFormatter<char, ArgFormatter> &f,
 | 
				
			|||||||
    format_str = end + 1;
 | 
					    format_str = end + 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace internal{
 | 
					namespace internal
 | 
				
			||||||
inline Null<> localtime_r(...) { return Null<>(); }
 | 
					{
 | 
				
			||||||
inline Null<> localtime_s(...) { return Null<>(); }
 | 
					inline Null<> localtime_r(...)
 | 
				
			||||||
inline Null<> gmtime_r(...) { return Null<>(); }
 | 
					{
 | 
				
			||||||
inline Null<> gmtime_s(...) { return Null<>(); }
 | 
					    return Null<>();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					inline Null<> localtime_s(...)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return Null<>();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					inline Null<> gmtime_r(...)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return Null<>();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					inline Null<> gmtime_s(...)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return Null<>();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Thread-safe replacement for std::localtime
 | 
					// Thread-safe replacement for std::localtime
 | 
				
			||||||
inline std::tm localtime(std::time_t time) {
 | 
					inline std::tm localtime(std::time_t time)
 | 
				
			||||||
  struct LocalTime {
 | 
					{
 | 
				
			||||||
 | 
					    struct LocalTime
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        std::time_t time_;
 | 
					        std::time_t time_;
 | 
				
			||||||
        std::tm tm_;
 | 
					        std::tm tm_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        LocalTime(std::time_t t): time_(t) {}
 | 
					        LocalTime(std::time_t t): time_(t) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool run() {
 | 
					        bool run()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            using namespace fmt::internal;
 | 
					            using namespace fmt::internal;
 | 
				
			||||||
            return handle(localtime_r(&time_, &tm_));
 | 
					            return handle(localtime_r(&time_, &tm_));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool handle(std::tm *tm) { return tm != FMT_NULL; }
 | 
					        bool handle(std::tm *tm)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return tm != FMT_NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool handle(internal::Null<>) {
 | 
					        bool handle(internal::Null<>)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            using namespace fmt::internal;
 | 
					            using namespace fmt::internal;
 | 
				
			||||||
            return fallback(localtime_s(&tm_, &time_));
 | 
					            return fallback(localtime_s(&tm_, &time_));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool fallback(int res) { return res == 0; }
 | 
					        bool fallback(int res)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return res == 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool fallback(internal::Null<>) {
 | 
					        bool fallback(internal::Null<>)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            using namespace fmt::internal;
 | 
					            using namespace fmt::internal;
 | 
				
			||||||
            std::tm *tm = std::localtime(&time_);
 | 
					            std::tm *tm = std::localtime(&time_);
 | 
				
			||||||
            if (tm) tm_ = *tm;
 | 
					            if (tm) tm_ = *tm;
 | 
				
			||||||
@ -100,28 +129,39 @@ inline std::tm localtime(std::time_t time) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Thread-safe replacement for std::gmtime
 | 
					// Thread-safe replacement for std::gmtime
 | 
				
			||||||
inline std::tm gmtime(std::time_t time) {
 | 
					inline std::tm gmtime(std::time_t time)
 | 
				
			||||||
  struct GMTime {
 | 
					{
 | 
				
			||||||
 | 
					    struct GMTime
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        std::time_t time_;
 | 
					        std::time_t time_;
 | 
				
			||||||
        std::tm tm_;
 | 
					        std::tm tm_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GMTime(std::time_t t): time_(t) {}
 | 
					        GMTime(std::time_t t): time_(t) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool run() {
 | 
					        bool run()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            using namespace fmt::internal;
 | 
					            using namespace fmt::internal;
 | 
				
			||||||
            return handle(gmtime_r(&time_, &tm_));
 | 
					            return handle(gmtime_r(&time_, &tm_));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool handle(std::tm *tm) { return tm != FMT_NULL; }
 | 
					        bool handle(std::tm *tm)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return tm != FMT_NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool handle(internal::Null<>) {
 | 
					        bool handle(internal::Null<>)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            using namespace fmt::internal;
 | 
					            using namespace fmt::internal;
 | 
				
			||||||
            return fallback(gmtime_s(&tm_, &time_));
 | 
					            return fallback(gmtime_s(&tm_, &time_));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool fallback(int res) { return res == 0; }
 | 
					        bool fallback(int res)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return res == 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool fallback(internal::Null<>) {
 | 
					        bool fallback(internal::Null<>)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            std::tm *tm = std::gmtime(&time_);
 | 
					            std::tm *tm = std::gmtime(&time_);
 | 
				
			||||||
            if (tm != FMT_NULL) tm_ = *tm;
 | 
					            if (tm != FMT_NULL) tm_ = *tm;
 | 
				
			||||||
            return tm != FMT_NULL;
 | 
					            return tm != FMT_NULL;
 | 
				
			||||||
 | 
				
			|||||||
@ -169,11 +169,11 @@ void drop_all();
 | 
				
			|||||||
#define SPDLOG_STR_H(x) #x
 | 
					#define SPDLOG_STR_H(x) #x
 | 
				
			||||||
#define SPDLOG_STR_HELPER(x) SPDLOG_STR_H(x)
 | 
					#define SPDLOG_STR_HELPER(x) SPDLOG_STR_H(x)
 | 
				
			||||||
#ifdef _MSC_VER
 | 
					#ifdef _MSC_VER
 | 
				
			||||||
  #define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
 | 
					#define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
 | 
				
			||||||
  #define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
 | 
					#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ "(" SPDLOG_STR_HELPER(__LINE__) ") ] " __VA_ARGS__)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  #define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
 | 
					#define SPDLOG_TRACE(logger, ...) logger->trace("[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
 | 
				
			||||||
  #define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
 | 
					#define SPDLOG_TRACE_IF(logger, flag, ...) logger->trace_if(flag, "[ " __FILE__ ":" SPDLOG_STR_HELPER(__LINE__) " ] " __VA_ARGS__)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define SPDLOG_TRACE(logger, ...)
 | 
					#define SPDLOG_TRACE(logger, ...)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user