astyle
This commit is contained in:
		@@ -439,7 +439,7 @@ inline int pid()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
	return static_cast<int>(::GetCurrentProcessId());
 | 
			
		||||
    return static_cast<int>(::GetCurrentProcessId());
 | 
			
		||||
#else
 | 
			
		||||
    return static_cast<int>(::getpid());
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -13,59 +13,67 @@
 | 
			
		||||
#include "format.h"
 | 
			
		||||
#include <ostream>
 | 
			
		||||
 | 
			
		||||
namespace fmt {
 | 
			
		||||
namespace fmt
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace internal {
 | 
			
		||||
namespace internal
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template <class Char>
 | 
			
		||||
class FormatBuf : public std::basic_streambuf<Char> {
 | 
			
		||||
 private:
 | 
			
		||||
  typedef typename std::basic_streambuf<Char>::int_type int_type;
 | 
			
		||||
  typedef typename std::basic_streambuf<Char>::traits_type traits_type;
 | 
			
		||||
class FormatBuf : public std::basic_streambuf<Char>
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    typedef typename std::basic_streambuf<Char>::int_type int_type;
 | 
			
		||||
    typedef typename std::basic_streambuf<Char>::traits_type traits_type;
 | 
			
		||||
 | 
			
		||||
  Buffer<Char> &buffer_;
 | 
			
		||||
    Buffer<Char> &buffer_;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  FormatBuf(Buffer<Char> &buffer) : buffer_(buffer) {}
 | 
			
		||||
public:
 | 
			
		||||
    FormatBuf(Buffer<Char> &buffer) : buffer_(buffer) {}
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  // The put-area is actually always empty. This makes the implementation
 | 
			
		||||
  // simpler and has the advantage that the streambuf and the buffer are always
 | 
			
		||||
  // in sync and sputc never writes into uninitialized memory. The obvious
 | 
			
		||||
  // disadvantage is that each call to sputc always results in a (virtual) call
 | 
			
		||||
  // to overflow. There is no disadvantage here for sputn since this always
 | 
			
		||||
  // results in a call to xsputn.
 | 
			
		||||
protected:
 | 
			
		||||
    // The put-area is actually always empty. This makes the implementation
 | 
			
		||||
    // simpler and has the advantage that the streambuf and the buffer are always
 | 
			
		||||
    // in sync and sputc never writes into uninitialized memory. The obvious
 | 
			
		||||
    // disadvantage is that each call to sputc always results in a (virtual) call
 | 
			
		||||
    // to overflow. There is no disadvantage here for sputn since this always
 | 
			
		||||
    // results in a call to xsputn.
 | 
			
		||||
 | 
			
		||||
  int_type overflow(int_type ch = traits_type::eof()) FMT_OVERRIDE {
 | 
			
		||||
    if (!traits_type::eq_int_type(ch, traits_type::eof()))
 | 
			
		||||
      buffer_.push_back(static_cast<Char>(ch));
 | 
			
		||||
    return ch;
 | 
			
		||||
  }
 | 
			
		||||
    int_type overflow(int_type ch = traits_type::eof()) FMT_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        if (!traits_type::eq_int_type(ch, traits_type::eof()))
 | 
			
		||||
            buffer_.push_back(static_cast<Char>(ch));
 | 
			
		||||
        return ch;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  std::streamsize xsputn(const Char *s, std::streamsize count) FMT_OVERRIDE {
 | 
			
		||||
    buffer_.append(s, s + count);
 | 
			
		||||
    return count;
 | 
			
		||||
  }
 | 
			
		||||
    std::streamsize xsputn(const Char *s, std::streamsize count) FMT_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        buffer_.append(s, s + count);
 | 
			
		||||
        return count;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Yes &convert(std::ostream &);
 | 
			
		||||
 | 
			
		||||
struct DummyStream : std::ostream {
 | 
			
		||||
  DummyStream();  // Suppress a bogus warning in MSVC.
 | 
			
		||||
struct DummyStream : std::ostream
 | 
			
		||||
{
 | 
			
		||||
    DummyStream();  // Suppress a bogus warning in MSVC.
 | 
			
		||||
 | 
			
		||||
  // Hide all operator<< overloads from std::ostream.
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  typename EnableIf<sizeof(T) == 0>::type operator<<(const T &);
 | 
			
		||||
    // Hide all operator<< overloads from std::ostream.
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    typename EnableIf<sizeof(T) == 0>::type operator<<(const T &);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
No &operator<<(std::ostream &, int);
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct ConvertToIntImpl<T, true> {
 | 
			
		||||
  // Convert to int only if T doesn't have an overloaded operator<<.
 | 
			
		||||
  enum {
 | 
			
		||||
    value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
 | 
			
		||||
  };
 | 
			
		||||
struct ConvertToIntImpl<T, true>
 | 
			
		||||
{
 | 
			
		||||
    // Convert to int only if T doesn't have an overloaded operator<<.
 | 
			
		||||
    enum
 | 
			
		||||
    {
 | 
			
		||||
        value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Write the content of w to os.
 | 
			
		||||
@@ -75,17 +83,18 @@ FMT_API void write(std::ostream &os, Writer &w);
 | 
			
		||||
// Formats a value.
 | 
			
		||||
template <typename Char, typename ArgFormatter_, typename T>
 | 
			
		||||
void format_arg(BasicFormatter<Char, ArgFormatter_> &f,
 | 
			
		||||
                const Char *&format_str, const T &value) {
 | 
			
		||||
  internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
 | 
			
		||||
                const Char *&format_str, const T &value)
 | 
			
		||||
{
 | 
			
		||||
    internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
 | 
			
		||||
 | 
			
		||||
  internal::FormatBuf<Char> format_buf(buffer);
 | 
			
		||||
  std::basic_ostream<Char> output(&format_buf);
 | 
			
		||||
  output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
 | 
			
		||||
  output << value;
 | 
			
		||||
    internal::FormatBuf<Char> format_buf(buffer);
 | 
			
		||||
    std::basic_ostream<Char> output(&format_buf);
 | 
			
		||||
    output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
 | 
			
		||||
    output << value;
 | 
			
		||||
 | 
			
		||||
  BasicStringRef<Char> str(&buffer[0], buffer.size());
 | 
			
		||||
  typedef internal::MakeArg< BasicFormatter<Char> > MakeArg;
 | 
			
		||||
  format_str = f.format(format_str, MakeArg(str));
 | 
			
		||||
    BasicStringRef<Char> str(&buffer[0], buffer.size());
 | 
			
		||||
    typedef internal::MakeArg< BasicFormatter<Char> > MakeArg;
 | 
			
		||||
    format_str = f.format(format_str, MakeArg(str));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -64,112 +64,134 @@
 | 
			
		||||
 | 
			
		||||
#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
 | 
			
		||||
 | 
			
		||||
namespace fmt {
 | 
			
		||||
namespace fmt
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// An error code.
 | 
			
		||||
class ErrorCode {
 | 
			
		||||
 private:
 | 
			
		||||
  int value_;
 | 
			
		||||
class ErrorCode
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    int value_;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  explicit ErrorCode(int value = 0) FMT_NOEXCEPT : value_(value) {}
 | 
			
		||||
public:
 | 
			
		||||
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.
 | 
			
		||||
class BufferedFile {
 | 
			
		||||
 private:
 | 
			
		||||
  FILE *file_;
 | 
			
		||||
class BufferedFile
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    FILE *file_;
 | 
			
		||||
 | 
			
		||||
  friend class File;
 | 
			
		||||
    friend class File;
 | 
			
		||||
 | 
			
		||||
  explicit BufferedFile(FILE *f) : file_(f) {}
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  // Constructs a BufferedFile object which doesn't represent any file.
 | 
			
		||||
  BufferedFile() FMT_NOEXCEPT : file_(FMT_NULL) {}
 | 
			
		||||
 | 
			
		||||
  // Destroys the object closing the file it represents if any.
 | 
			
		||||
  FMT_API ~BufferedFile() FMT_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
#if !FMT_USE_RVALUE_REFERENCES
 | 
			
		||||
  // Emulate a move constructor and a move assignment operator if rvalue
 | 
			
		||||
  // references are not supported.
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // A proxy object to emulate a move constructor.
 | 
			
		||||
  // It is private to make it impossible call operator Proxy directly.
 | 
			
		||||
  struct Proxy {
 | 
			
		||||
    FILE *file;
 | 
			
		||||
  };
 | 
			
		||||
    explicit BufferedFile(FILE *f) : file_(f) {}
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  // A "move constructor" for moving from a temporary.
 | 
			
		||||
  BufferedFile(Proxy p) FMT_NOEXCEPT : file_(p.file) {}
 | 
			
		||||
    // Constructs a BufferedFile object which doesn't represent any file.
 | 
			
		||||
BufferedFile() FMT_NOEXCEPT :
 | 
			
		||||
    file_(FMT_NULL) {}
 | 
			
		||||
 | 
			
		||||
  // A "move constructor" for moving from an lvalue.
 | 
			
		||||
  BufferedFile(BufferedFile &f) FMT_NOEXCEPT : file_(f.file_) {
 | 
			
		||||
    f.file_ = FMT_NULL;
 | 
			
		||||
  }
 | 
			
		||||
    // Destroys the object closing the file it represents if any.
 | 
			
		||||
    FMT_API ~BufferedFile() FMT_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
  // A "move assignment operator" for moving from a temporary.
 | 
			
		||||
  BufferedFile &operator=(Proxy p) {
 | 
			
		||||
    close();
 | 
			
		||||
    file_ = p.file;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
#if !FMT_USE_RVALUE_REFERENCES
 | 
			
		||||
    // Emulate a move constructor and a move assignment operator if rvalue
 | 
			
		||||
    // references are not supported.
 | 
			
		||||
 | 
			
		||||
  // A "move assignment operator" for moving from an lvalue.
 | 
			
		||||
  BufferedFile &operator=(BufferedFile &other) {
 | 
			
		||||
    close();
 | 
			
		||||
    file_ = other.file_;
 | 
			
		||||
    other.file_ = FMT_NULL;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
private:
 | 
			
		||||
    // A proxy object to emulate a move constructor.
 | 
			
		||||
    // It is private to make it impossible call operator Proxy directly.
 | 
			
		||||
    struct Proxy
 | 
			
		||||
    {
 | 
			
		||||
        FILE *file;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  // Returns a proxy object for moving from a temporary:
 | 
			
		||||
  //   BufferedFile file = BufferedFile(...);
 | 
			
		||||
  operator Proxy() FMT_NOEXCEPT {
 | 
			
		||||
    Proxy p = {file_};
 | 
			
		||||
    file_ = FMT_NULL;
 | 
			
		||||
    return p;
 | 
			
		||||
  }
 | 
			
		||||
public:
 | 
			
		||||
    // A "move constructor" for moving from a temporary.
 | 
			
		||||
BufferedFile(Proxy p) FMT_NOEXCEPT :
 | 
			
		||||
    file_(p.file) {}
 | 
			
		||||
 | 
			
		||||
    // A "move constructor" for moving from an lvalue.
 | 
			
		||||
BufferedFile(BufferedFile &f) FMT_NOEXCEPT :
 | 
			
		||||
    file_(f.file_)
 | 
			
		||||
    {
 | 
			
		||||
        f.file_ = FMT_NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // A "move assignment operator" for moving from a temporary.
 | 
			
		||||
    BufferedFile &operator=(Proxy p)
 | 
			
		||||
    {
 | 
			
		||||
        close();
 | 
			
		||||
        file_ = p.file;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // A "move assignment operator" for moving from an lvalue.
 | 
			
		||||
    BufferedFile &operator=(BufferedFile &other)
 | 
			
		||||
    {
 | 
			
		||||
        close();
 | 
			
		||||
        file_ = other.file_;
 | 
			
		||||
        other.file_ = FMT_NULL;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Returns a proxy object for moving from a temporary:
 | 
			
		||||
    //   BufferedFile file = BufferedFile(...);
 | 
			
		||||
    operator Proxy() FMT_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        Proxy p = {file_};
 | 
			
		||||
        file_ = FMT_NULL;
 | 
			
		||||
        return p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 private:
 | 
			
		||||
  FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile);
 | 
			
		||||
private:
 | 
			
		||||
    FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile);
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : file_(other.file_) {
 | 
			
		||||
    other.file_ = FMT_NULL;
 | 
			
		||||
  }
 | 
			
		||||
public:
 | 
			
		||||
BufferedFile(BufferedFile &&other) FMT_NOEXCEPT :
 | 
			
		||||
    file_(other.file_)
 | 
			
		||||
    {
 | 
			
		||||
        other.file_ = FMT_NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  BufferedFile& operator=(BufferedFile &&other) {
 | 
			
		||||
    close();
 | 
			
		||||
    file_ = other.file_;
 | 
			
		||||
    other.file_ = FMT_NULL;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
    BufferedFile& operator=(BufferedFile &&other)
 | 
			
		||||
    {
 | 
			
		||||
        close();
 | 
			
		||||
        file_ = other.file_;
 | 
			
		||||
        other.file_ = FMT_NULL;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  // Opens a file.
 | 
			
		||||
  FMT_API BufferedFile(CStringRef filename, CStringRef mode);
 | 
			
		||||
    // Opens a file.
 | 
			
		||||
    FMT_API BufferedFile(CStringRef filename, CStringRef mode);
 | 
			
		||||
 | 
			
		||||
  // Closes the file.
 | 
			
		||||
  FMT_API void close();
 | 
			
		||||
    // Closes the file.
 | 
			
		||||
    FMT_API void close();
 | 
			
		||||
 | 
			
		||||
  // Returns the pointer to a FILE object representing this file.
 | 
			
		||||
  FILE *get() const FMT_NOEXCEPT { return file_; }
 | 
			
		||||
    // Returns the pointer to a FILE object representing this file.
 | 
			
		||||
    FILE *get() const FMT_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return file_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  // We place parentheses around fileno to workaround a bug in some versions
 | 
			
		||||
  // of MinGW that define fileno as a macro.
 | 
			
		||||
  FMT_API int (fileno)() const;
 | 
			
		||||
    // We place parentheses around fileno to workaround a bug in some versions
 | 
			
		||||
    // of MinGW that define fileno as a macro.
 | 
			
		||||
    FMT_API int (fileno)() const;
 | 
			
		||||
 | 
			
		||||
  void print(CStringRef format_str, const ArgList &args) {
 | 
			
		||||
    fmt::print(file_, format_str, args);
 | 
			
		||||
  }
 | 
			
		||||
  FMT_VARIADIC(void, print, CStringRef)
 | 
			
		||||
    void print(CStringRef format_str, const ArgList &args)
 | 
			
		||||
    {
 | 
			
		||||
        fmt::print(file_, format_str, args);
 | 
			
		||||
    }
 | 
			
		||||
    FMT_VARIADIC(void, print, CStringRef)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// A file. Closed file is represented by a File object with descriptor -1.
 | 
			
		||||
@@ -178,125 +200,141 @@ public:
 | 
			
		||||
// closing the file multiple times will cause a crash on Windows rather
 | 
			
		||||
// than an exception. You can get standard behavior by overriding the
 | 
			
		||||
// invalid parameter handler with _set_invalid_parameter_handler.
 | 
			
		||||
class File {
 | 
			
		||||
 private:
 | 
			
		||||
  int fd_;  // File descriptor.
 | 
			
		||||
class File
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    int fd_;  // File descriptor.
 | 
			
		||||
 | 
			
		||||
  // Constructs a File object with a given descriptor.
 | 
			
		||||
  explicit File(int fd) : fd_(fd) {}
 | 
			
		||||
    // Constructs a File object with a given descriptor.
 | 
			
		||||
    explicit File(int fd) : fd_(fd) {}
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  // Possible values for the oflag argument to the constructor.
 | 
			
		||||
  enum {
 | 
			
		||||
    RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only.
 | 
			
		||||
    WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only.
 | 
			
		||||
    RDWR   = FMT_POSIX(O_RDWR)    // Open for reading and writing.
 | 
			
		||||
  };
 | 
			
		||||
public:
 | 
			
		||||
    // Possible values for the oflag argument to the constructor.
 | 
			
		||||
    enum
 | 
			
		||||
    {
 | 
			
		||||
        RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only.
 | 
			
		||||
        WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only.
 | 
			
		||||
        RDWR   = FMT_POSIX(O_RDWR)    // Open for reading and writing.
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  // Constructs a File object which doesn't represent any file.
 | 
			
		||||
  File() FMT_NOEXCEPT : fd_(-1) {}
 | 
			
		||||
    // Constructs a File object which doesn't represent any file.
 | 
			
		||||
File() FMT_NOEXCEPT :
 | 
			
		||||
    fd_(-1) {}
 | 
			
		||||
 | 
			
		||||
  // Opens a file and constructs a File object representing this file.
 | 
			
		||||
  FMT_API File(CStringRef path, int oflag);
 | 
			
		||||
    // Opens a file and constructs a File object representing this file.
 | 
			
		||||
    FMT_API File(CStringRef path, int oflag);
 | 
			
		||||
 | 
			
		||||
#if !FMT_USE_RVALUE_REFERENCES
 | 
			
		||||
  // Emulate a move constructor and a move assignment operator if rvalue
 | 
			
		||||
  // references are not supported.
 | 
			
		||||
    // Emulate a move constructor and a move assignment operator if rvalue
 | 
			
		||||
    // references are not supported.
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // A proxy object to emulate a move constructor.
 | 
			
		||||
  // It is private to make it impossible call operator Proxy directly.
 | 
			
		||||
  struct Proxy {
 | 
			
		||||
    int fd;
 | 
			
		||||
  };
 | 
			
		||||
private:
 | 
			
		||||
    // A proxy object to emulate a move constructor.
 | 
			
		||||
    // It is private to make it impossible call operator Proxy directly.
 | 
			
		||||
    struct Proxy
 | 
			
		||||
    {
 | 
			
		||||
        int fd;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  // A "move constructor" for moving from a temporary.
 | 
			
		||||
  File(Proxy p) FMT_NOEXCEPT : fd_(p.fd) {}
 | 
			
		||||
public:
 | 
			
		||||
    // A "move constructor" for moving from a temporary.
 | 
			
		||||
File(Proxy p) FMT_NOEXCEPT :
 | 
			
		||||
    fd_(p.fd) {}
 | 
			
		||||
 | 
			
		||||
  // A "move constructor" for moving from an lvalue.
 | 
			
		||||
  File(File &other) FMT_NOEXCEPT : fd_(other.fd_) {
 | 
			
		||||
    other.fd_ = -1;
 | 
			
		||||
  }
 | 
			
		||||
    // A "move constructor" for moving from an lvalue.
 | 
			
		||||
File(File &other) FMT_NOEXCEPT :
 | 
			
		||||
    fd_(other.fd_)
 | 
			
		||||
    {
 | 
			
		||||
        other.fd_ = -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  // A "move assignment operator" for moving from a temporary.
 | 
			
		||||
  File &operator=(Proxy p) {
 | 
			
		||||
    close();
 | 
			
		||||
    fd_ = p.fd;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
    // A "move assignment operator" for moving from a temporary.
 | 
			
		||||
    File &operator=(Proxy p)
 | 
			
		||||
    {
 | 
			
		||||
        close();
 | 
			
		||||
        fd_ = p.fd;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  // A "move assignment operator" for moving from an lvalue.
 | 
			
		||||
  File &operator=(File &other) {
 | 
			
		||||
    close();
 | 
			
		||||
    fd_ = other.fd_;
 | 
			
		||||
    other.fd_ = -1;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
    // A "move assignment operator" for moving from an lvalue.
 | 
			
		||||
    File &operator=(File &other)
 | 
			
		||||
    {
 | 
			
		||||
        close();
 | 
			
		||||
        fd_ = other.fd_;
 | 
			
		||||
        other.fd_ = -1;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  // Returns a proxy object for moving from a temporary:
 | 
			
		||||
  //   File file = File(...);
 | 
			
		||||
  operator Proxy() FMT_NOEXCEPT {
 | 
			
		||||
    Proxy p = {fd_};
 | 
			
		||||
    fd_ = -1;
 | 
			
		||||
    return p;
 | 
			
		||||
  }
 | 
			
		||||
    // Returns a proxy object for moving from a temporary:
 | 
			
		||||
    //   File file = File(...);
 | 
			
		||||
    operator Proxy() FMT_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        Proxy p = {fd_};
 | 
			
		||||
        fd_ = -1;
 | 
			
		||||
        return p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 private:
 | 
			
		||||
  FMT_DISALLOW_COPY_AND_ASSIGN(File);
 | 
			
		||||
private:
 | 
			
		||||
    FMT_DISALLOW_COPY_AND_ASSIGN(File);
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  File(File &&other) FMT_NOEXCEPT : fd_(other.fd_) {
 | 
			
		||||
    other.fd_ = -1;
 | 
			
		||||
  }
 | 
			
		||||
public:
 | 
			
		||||
File(File &&other) FMT_NOEXCEPT :
 | 
			
		||||
    fd_(other.fd_)
 | 
			
		||||
    {
 | 
			
		||||
        other.fd_ = -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  File& operator=(File &&other) {
 | 
			
		||||
    close();
 | 
			
		||||
    fd_ = other.fd_;
 | 
			
		||||
    other.fd_ = -1;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
    File& operator=(File &&other)
 | 
			
		||||
    {
 | 
			
		||||
        close();
 | 
			
		||||
        fd_ = other.fd_;
 | 
			
		||||
        other.fd_ = -1;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  // Destroys the object closing the file it represents if any.
 | 
			
		||||
  FMT_API ~File() FMT_NOEXCEPT;
 | 
			
		||||
    // Destroys the object closing the file it represents if any.
 | 
			
		||||
    FMT_API ~File() FMT_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
  // Returns the file descriptor.
 | 
			
		||||
  int descriptor() const FMT_NOEXCEPT { return fd_; }
 | 
			
		||||
    // Returns the file descriptor.
 | 
			
		||||
    int descriptor() const FMT_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return fd_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  // Closes the file.
 | 
			
		||||
  FMT_API void close();
 | 
			
		||||
    // Closes the file.
 | 
			
		||||
    FMT_API void close();
 | 
			
		||||
 | 
			
		||||
  // Returns the file size. The size has signed type for consistency with
 | 
			
		||||
  // stat::st_size.
 | 
			
		||||
  FMT_API LongLong size() const;
 | 
			
		||||
    // Returns the file size. The size has signed type for consistency with
 | 
			
		||||
    // stat::st_size.
 | 
			
		||||
    FMT_API LongLong size() const;
 | 
			
		||||
 | 
			
		||||
  // Attempts to read count bytes from the file into the specified buffer.
 | 
			
		||||
  FMT_API std::size_t read(void *buffer, std::size_t count);
 | 
			
		||||
    // Attempts to read count bytes from the file into the specified buffer.
 | 
			
		||||
    FMT_API std::size_t read(void *buffer, std::size_t count);
 | 
			
		||||
 | 
			
		||||
  // Attempts to write count bytes from the specified buffer to the file.
 | 
			
		||||
  FMT_API std::size_t write(const void *buffer, std::size_t count);
 | 
			
		||||
    // Attempts to write count bytes from the specified buffer to the file.
 | 
			
		||||
    FMT_API std::size_t write(const void *buffer, std::size_t count);
 | 
			
		||||
 | 
			
		||||
  // Duplicates a file descriptor with the dup function and returns
 | 
			
		||||
  // the duplicate as a file object.
 | 
			
		||||
  FMT_API static File dup(int fd);
 | 
			
		||||
    // Duplicates a file descriptor with the dup function and returns
 | 
			
		||||
    // the duplicate as a file object.
 | 
			
		||||
    FMT_API static File dup(int fd);
 | 
			
		||||
 | 
			
		||||
  // Makes fd be the copy of this file descriptor, closing fd first if
 | 
			
		||||
  // necessary.
 | 
			
		||||
  FMT_API void dup2(int fd);
 | 
			
		||||
    // Makes fd be the copy of this file descriptor, closing fd first if
 | 
			
		||||
    // necessary.
 | 
			
		||||
    FMT_API void dup2(int fd);
 | 
			
		||||
 | 
			
		||||
  // Makes fd be the copy of this file descriptor, closing fd first if
 | 
			
		||||
  // necessary.
 | 
			
		||||
  FMT_API void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT;
 | 
			
		||||
    // Makes fd be the copy of this file descriptor, closing fd first if
 | 
			
		||||
    // necessary.
 | 
			
		||||
    FMT_API void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
  // Creates a pipe setting up read_end and write_end file objects for reading
 | 
			
		||||
  // and writing respectively.
 | 
			
		||||
  FMT_API static void pipe(File &read_end, File &write_end);
 | 
			
		||||
    // Creates a pipe setting up read_end and write_end file objects for reading
 | 
			
		||||
    // and writing respectively.
 | 
			
		||||
    FMT_API static void pipe(File &read_end, File &write_end);
 | 
			
		||||
 | 
			
		||||
  // Creates a BufferedFile object associated with this file and detaches
 | 
			
		||||
  // this File object from the file.
 | 
			
		||||
  FMT_API BufferedFile fdopen(const char *mode);
 | 
			
		||||
    // Creates a BufferedFile object associated with this file and detaches
 | 
			
		||||
    // this File object from the file.
 | 
			
		||||
    FMT_API BufferedFile fdopen(const char *mode);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Returns the memory page size.
 | 
			
		||||
@@ -309,58 +347,77 @@ long getpagesize();
 | 
			
		||||
 | 
			
		||||
#ifdef FMT_LOCALE
 | 
			
		||||
// A "C" numeric locale.
 | 
			
		||||
class Locale {
 | 
			
		||||
 private:
 | 
			
		||||
class Locale
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
# 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) {
 | 
			
		||||
    return _create_locale(category_mask, locale);
 | 
			
		||||
  }
 | 
			
		||||
    static locale_t newlocale(int category_mask, const char *locale, locale_t)
 | 
			
		||||
    {
 | 
			
		||||
        return _create_locale(category_mask, locale);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  static void freelocale(locale_t locale) {
 | 
			
		||||
    _free_locale(locale);
 | 
			
		||||
  }
 | 
			
		||||
    static void freelocale(locale_t locale)
 | 
			
		||||
    {
 | 
			
		||||
        _free_locale(locale);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  static double strtod_l(const char *nptr, char **endptr, _locale_t locale) {
 | 
			
		||||
    return _strtod_l(nptr, endptr, locale);
 | 
			
		||||
  }
 | 
			
		||||
    static double strtod_l(const char *nptr, char **endptr, _locale_t locale)
 | 
			
		||||
    {
 | 
			
		||||
        return _strtod_l(nptr, endptr, locale);
 | 
			
		||||
    }
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
  locale_t locale_;
 | 
			
		||||
    locale_t locale_;
 | 
			
		||||
 | 
			
		||||
  FMT_DISALLOW_COPY_AND_ASSIGN(Locale);
 | 
			
		||||
    FMT_DISALLOW_COPY_AND_ASSIGN(Locale);
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  typedef locale_t Type;
 | 
			
		||||
public:
 | 
			
		||||
    typedef locale_t Type;
 | 
			
		||||
 | 
			
		||||
  Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", FMT_NULL)) {
 | 
			
		||||
    if (!locale_)
 | 
			
		||||
      FMT_THROW(fmt::SystemError(errno, "cannot create locale"));
 | 
			
		||||
  }
 | 
			
		||||
  ~Locale() { freelocale(locale_); }
 | 
			
		||||
    Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", FMT_NULL))
 | 
			
		||||
    {
 | 
			
		||||
        if (!locale_)
 | 
			
		||||
            FMT_THROW(fmt::SystemError(errno, "cannot create 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
 | 
			
		||||
  // of the parsed input.
 | 
			
		||||
  double strtod(const char *&str) const {
 | 
			
		||||
    char *end = FMT_NULL;
 | 
			
		||||
    double result = strtod_l(str, &end, locale_);
 | 
			
		||||
    str = end;
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
    // Converts string to floating-point number and advances str past the end
 | 
			
		||||
    // of the parsed input.
 | 
			
		||||
    double strtod(const char *&str) const
 | 
			
		||||
    {
 | 
			
		||||
        char *end = FMT_NULL;
 | 
			
		||||
        double result = strtod_l(str, &end, locale_);
 | 
			
		||||
        str = end;
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
#endif  // FMT_LOCALE
 | 
			
		||||
}  // namespace fmt
 | 
			
		||||
 | 
			
		||||
#if !FMT_USE_RVALUE_REFERENCES
 | 
			
		||||
namespace std {
 | 
			
		||||
namespace std
 | 
			
		||||
{
 | 
			
		||||
// For compatibility with C++98.
 | 
			
		||||
inline fmt::BufferedFile &move(fmt::BufferedFile &f) { return f; }
 | 
			
		||||
inline fmt::File &move(fmt::File &f) { return f; }
 | 
			
		||||
inline fmt::BufferedFile &move(fmt::BufferedFile &f)
 | 
			
		||||
{
 | 
			
		||||
    return f;
 | 
			
		||||
}
 | 
			
		||||
inline fmt::File &move(fmt::File &f)
 | 
			
		||||
{
 | 
			
		||||
    return f;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -19,120 +19,160 @@
 | 
			
		||||
# pragma warning(disable: 4996)  // "deprecated" functions
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace fmt {
 | 
			
		||||
namespace fmt
 | 
			
		||||
{
 | 
			
		||||
template <typename ArgFormatter>
 | 
			
		||||
void format_arg(BasicFormatter<char, ArgFormatter> &f,
 | 
			
		||||
                const char *&format_str, const std::tm &tm) {
 | 
			
		||||
  if (*format_str == ':')
 | 
			
		||||
    ++format_str;
 | 
			
		||||
  const char *end = format_str;
 | 
			
		||||
  while (*end && *end != '}')
 | 
			
		||||
    ++end;
 | 
			
		||||
  if (*end != '}')
 | 
			
		||||
    FMT_THROW(FormatError("missing '}' in format string"));
 | 
			
		||||
  internal::MemoryBuffer<char, internal::INLINE_BUFFER_SIZE> format;
 | 
			
		||||
  format.append(format_str, end + 1);
 | 
			
		||||
  format[format.size() - 1] = '\0';
 | 
			
		||||
  Buffer<char> &buffer = f.writer().buffer();
 | 
			
		||||
  std::size_t start = buffer.size();
 | 
			
		||||
  for (;;) {
 | 
			
		||||
    std::size_t size = buffer.capacity() - start;
 | 
			
		||||
    std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm);
 | 
			
		||||
    if (count != 0) {
 | 
			
		||||
      buffer.resize(start + count);
 | 
			
		||||
      break;
 | 
			
		||||
                const char *&format_str, const std::tm &tm)
 | 
			
		||||
{
 | 
			
		||||
    if (*format_str == ':')
 | 
			
		||||
        ++format_str;
 | 
			
		||||
    const char *end = format_str;
 | 
			
		||||
    while (*end && *end != '}')
 | 
			
		||||
        ++end;
 | 
			
		||||
    if (*end != '}')
 | 
			
		||||
        FMT_THROW(FormatError("missing '}' in format string"));
 | 
			
		||||
    internal::MemoryBuffer<char, internal::INLINE_BUFFER_SIZE> format;
 | 
			
		||||
    format.append(format_str, end + 1);
 | 
			
		||||
    format[format.size() - 1] = '\0';
 | 
			
		||||
    Buffer<char> &buffer = f.writer().buffer();
 | 
			
		||||
    std::size_t start = buffer.size();
 | 
			
		||||
    for (;;)
 | 
			
		||||
    {
 | 
			
		||||
        std::size_t size = buffer.capacity() - start;
 | 
			
		||||
        std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm);
 | 
			
		||||
        if (count != 0)
 | 
			
		||||
        {
 | 
			
		||||
            buffer.resize(start + count);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        if (size >= format.size() * 256)
 | 
			
		||||
        {
 | 
			
		||||
            // 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
 | 
			
		||||
            // better way to distinguish the two cases:
 | 
			
		||||
            // https://github.com/fmtlib/fmt/issues/367
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        const std::size_t MIN_GROWTH = 10;
 | 
			
		||||
        buffer.reserve(buffer.capacity() + (size > MIN_GROWTH ? size : MIN_GROWTH));
 | 
			
		||||
    }
 | 
			
		||||
    if (size >= format.size() * 256) {
 | 
			
		||||
      // 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
 | 
			
		||||
      // better way to distinguish the two cases:
 | 
			
		||||
      // https://github.com/fmtlib/fmt/issues/367
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    const std::size_t MIN_GROWTH = 10;
 | 
			
		||||
    buffer.reserve(buffer.capacity() + (size > MIN_GROWTH ? size : MIN_GROWTH));
 | 
			
		||||
  }
 | 
			
		||||
  format_str = end + 1;
 | 
			
		||||
    format_str = end + 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace internal{
 | 
			
		||||
inline Null<> localtime_r(...) { return Null<>(); }
 | 
			
		||||
inline Null<> localtime_s(...) { return Null<>(); }
 | 
			
		||||
inline Null<> gmtime_r(...) { return Null<>(); }
 | 
			
		||||
inline Null<> gmtime_s(...) { return Null<>(); }
 | 
			
		||||
namespace internal
 | 
			
		||||
{
 | 
			
		||||
inline Null<> localtime_r(...)
 | 
			
		||||
{
 | 
			
		||||
    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
 | 
			
		||||
inline std::tm localtime(std::time_t time) {
 | 
			
		||||
  struct LocalTime {
 | 
			
		||||
    std::time_t time_;
 | 
			
		||||
    std::tm tm_;
 | 
			
		||||
inline std::tm localtime(std::time_t time)
 | 
			
		||||
{
 | 
			
		||||
    struct LocalTime
 | 
			
		||||
    {
 | 
			
		||||
        std::time_t time_;
 | 
			
		||||
        std::tm tm_;
 | 
			
		||||
 | 
			
		||||
    LocalTime(std::time_t t): time_(t) {}
 | 
			
		||||
        LocalTime(std::time_t t): time_(t) {}
 | 
			
		||||
 | 
			
		||||
    bool run() {
 | 
			
		||||
      using namespace fmt::internal;
 | 
			
		||||
      return handle(localtime_r(&time_, &tm_));
 | 
			
		||||
    }
 | 
			
		||||
        bool run()
 | 
			
		||||
        {
 | 
			
		||||
            using namespace fmt::internal;
 | 
			
		||||
            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<>) {
 | 
			
		||||
      using namespace fmt::internal;
 | 
			
		||||
      return fallback(localtime_s(&tm_, &time_));
 | 
			
		||||
    }
 | 
			
		||||
        bool handle(internal::Null<>)
 | 
			
		||||
        {
 | 
			
		||||
            using namespace fmt::internal;
 | 
			
		||||
            return fallback(localtime_s(&tm_, &time_));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    bool fallback(int res) { return res == 0; }
 | 
			
		||||
        bool fallback(int res)
 | 
			
		||||
        {
 | 
			
		||||
            return res == 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    bool fallback(internal::Null<>) {
 | 
			
		||||
      using namespace fmt::internal;
 | 
			
		||||
      std::tm *tm = std::localtime(&time_);
 | 
			
		||||
      if (tm) tm_ = *tm;
 | 
			
		||||
      return tm != FMT_NULL;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  LocalTime lt(time);
 | 
			
		||||
  if (lt.run())
 | 
			
		||||
    return lt.tm_;
 | 
			
		||||
  // Too big time values may be unsupported.
 | 
			
		||||
  FMT_THROW(fmt::FormatError("time_t value out of range"));
 | 
			
		||||
  return std::tm();
 | 
			
		||||
        bool fallback(internal::Null<>)
 | 
			
		||||
        {
 | 
			
		||||
            using namespace fmt::internal;
 | 
			
		||||
            std::tm *tm = std::localtime(&time_);
 | 
			
		||||
            if (tm) tm_ = *tm;
 | 
			
		||||
            return tm != FMT_NULL;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    LocalTime lt(time);
 | 
			
		||||
    if (lt.run())
 | 
			
		||||
        return lt.tm_;
 | 
			
		||||
    // Too big time values may be unsupported.
 | 
			
		||||
    FMT_THROW(fmt::FormatError("time_t value out of range"));
 | 
			
		||||
    return std::tm();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Thread-safe replacement for std::gmtime
 | 
			
		||||
inline std::tm gmtime(std::time_t time) {
 | 
			
		||||
  struct GMTime {
 | 
			
		||||
    std::time_t time_;
 | 
			
		||||
    std::tm tm_;
 | 
			
		||||
inline std::tm gmtime(std::time_t time)
 | 
			
		||||
{
 | 
			
		||||
    struct GMTime
 | 
			
		||||
    {
 | 
			
		||||
        std::time_t time_;
 | 
			
		||||
        std::tm tm_;
 | 
			
		||||
 | 
			
		||||
    GMTime(std::time_t t): time_(t) {}
 | 
			
		||||
        GMTime(std::time_t t): time_(t) {}
 | 
			
		||||
 | 
			
		||||
    bool run() {
 | 
			
		||||
      using namespace fmt::internal;
 | 
			
		||||
      return handle(gmtime_r(&time_, &tm_));
 | 
			
		||||
    }
 | 
			
		||||
        bool run()
 | 
			
		||||
        {
 | 
			
		||||
            using namespace fmt::internal;
 | 
			
		||||
            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<>) {
 | 
			
		||||
      using namespace fmt::internal;
 | 
			
		||||
      return fallback(gmtime_s(&tm_, &time_));
 | 
			
		||||
    }
 | 
			
		||||
        bool handle(internal::Null<>)
 | 
			
		||||
        {
 | 
			
		||||
            using namespace fmt::internal;
 | 
			
		||||
            return fallback(gmtime_s(&tm_, &time_));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    bool fallback(int res) { return res == 0; }
 | 
			
		||||
        bool fallback(int res)
 | 
			
		||||
        {
 | 
			
		||||
            return res == 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    bool fallback(internal::Null<>) {
 | 
			
		||||
      std::tm *tm = std::gmtime(&time_);
 | 
			
		||||
      if (tm != FMT_NULL) tm_ = *tm;
 | 
			
		||||
      return tm != FMT_NULL;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  GMTime gt(time);
 | 
			
		||||
  if (gt.run())
 | 
			
		||||
    return gt.tm_;
 | 
			
		||||
  // Too big time values may be unsupported.
 | 
			
		||||
  FMT_THROW(fmt::FormatError("time_t value out of range"));
 | 
			
		||||
  return std::tm();
 | 
			
		||||
        bool fallback(internal::Null<>)
 | 
			
		||||
        {
 | 
			
		||||
            std::tm *tm = std::gmtime(&time_);
 | 
			
		||||
            if (tm != FMT_NULL) tm_ = *tm;
 | 
			
		||||
            return tm != FMT_NULL;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    GMTime gt(time);
 | 
			
		||||
    if (gt.run())
 | 
			
		||||
        return gt.tm_;
 | 
			
		||||
    // Too big time values may be unsupported.
 | 
			
		||||
    FMT_THROW(fmt::FormatError("time_t value out of range"));
 | 
			
		||||
    return std::tm();
 | 
			
		||||
}
 | 
			
		||||
} //namespace fmt
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,63 +3,63 @@
 | 
			
		||||
// log to str and return it
 | 
			
		||||
static std::string log_to_str(const std::string& msg, std::shared_ptr<spdlog::formatter> formatter = nullptr)
 | 
			
		||||
{
 | 
			
		||||
	std::ostringstream oss;
 | 
			
		||||
	auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
 | 
			
		||||
	spdlog::logger oss_logger("pattern_tester", oss_sink);
 | 
			
		||||
	oss_logger.set_level(spdlog::level::info);
 | 
			
		||||
	if (formatter) oss_logger.set_formatter(formatter);
 | 
			
		||||
	oss_logger.info(msg);
 | 
			
		||||
	return oss.str();
 | 
			
		||||
    std::ostringstream oss;
 | 
			
		||||
    auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
 | 
			
		||||
    spdlog::logger oss_logger("pattern_tester", oss_sink);
 | 
			
		||||
    oss_logger.set_level(spdlog::level::info);
 | 
			
		||||
    if (formatter) oss_logger.set_formatter(formatter);
 | 
			
		||||
    oss_logger.info(msg);
 | 
			
		||||
    return oss.str();
 | 
			
		||||
}
 | 
			
		||||
TEST_CASE("custom eol", "[pattern_formatter]")
 | 
			
		||||
{
 | 
			
		||||
	std::string msg = "Hello custom eol test";
 | 
			
		||||
	std::string eol = ";)";
 | 
			
		||||
	auto formatter = std::make_shared<spdlog::pattern_formatter>("%v", spdlog::pattern_time_type::local, ";)");
 | 
			
		||||
    std::string msg = "Hello custom eol test";
 | 
			
		||||
    std::string eol = ";)";
 | 
			
		||||
    auto formatter = std::make_shared<spdlog::pattern_formatter>("%v", spdlog::pattern_time_type::local, ";)");
 | 
			
		||||
 | 
			
		||||
	REQUIRE(log_to_str(msg, formatter) == msg + eol);
 | 
			
		||||
    REQUIRE(log_to_str(msg, formatter) == msg + eol);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_CASE("empty format", "[pattern_formatter]")
 | 
			
		||||
{
 | 
			
		||||
	auto formatter = std::make_shared<spdlog::pattern_formatter>("", spdlog::pattern_time_type::local, "");
 | 
			
		||||
	REQUIRE(log_to_str("Some message", formatter) == "");
 | 
			
		||||
    auto formatter = std::make_shared<spdlog::pattern_formatter>("", spdlog::pattern_time_type::local, "");
 | 
			
		||||
    REQUIRE(log_to_str("Some message", formatter) == "");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_CASE("empty format2", "[pattern_formatter]")
 | 
			
		||||
{
 | 
			
		||||
	auto formatter = std::make_shared<spdlog::pattern_formatter>("", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
	REQUIRE(log_to_str("Some message", formatter) == "\n");
 | 
			
		||||
    auto formatter = std::make_shared<spdlog::pattern_formatter>("", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
    REQUIRE(log_to_str("Some message", formatter) == "\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_CASE("level", "[pattern_formatter]")
 | 
			
		||||
{
 | 
			
		||||
	auto formatter = std::make_shared<spdlog::pattern_formatter>("[%l] %v", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
	REQUIRE(log_to_str("Some message", formatter) == "[info] Some message\n");
 | 
			
		||||
    auto formatter = std::make_shared<spdlog::pattern_formatter>("[%l] %v", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
    REQUIRE(log_to_str("Some message", formatter) == "[info] Some message\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_CASE("short level", "[pattern_formatter]")
 | 
			
		||||
{
 | 
			
		||||
	auto formatter = std::make_shared<spdlog::pattern_formatter>("[%L] %v", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
	REQUIRE(log_to_str("Some message", formatter) == "[I] Some message\n");
 | 
			
		||||
    auto formatter = std::make_shared<spdlog::pattern_formatter>("[%L] %v", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
    REQUIRE(log_to_str("Some message", formatter) == "[I] Some message\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_CASE("name", "[pattern_formatter]")
 | 
			
		||||
{
 | 
			
		||||
	auto formatter = std::make_shared<spdlog::pattern_formatter>("[%n] %v", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
	REQUIRE(log_to_str("Some message", formatter) == "[pattern_tester] Some message\n");
 | 
			
		||||
    auto formatter = std::make_shared<spdlog::pattern_formatter>("[%n] %v", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
    REQUIRE(log_to_str("Some message", formatter) == "[pattern_tester] Some message\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST_CASE("date MM/DD/YY ", "[pattern_formatter]")
 | 
			
		||||
{
 | 
			
		||||
	using namespace::std::chrono;
 | 
			
		||||
	auto formatter = std::make_shared<spdlog::pattern_formatter>("%D %v", spdlog::pattern_time_type::local, "\n");	
 | 
			
		||||
	auto now_tm = spdlog::details::os::localtime();			
 | 
			
		||||
	std::stringstream oss;	
 | 
			
		||||
	oss << std::setfill('0') << std::setw(2) << now_tm.tm_mon + 1 << "/" << now_tm.tm_mday << "/" << (now_tm.tm_year + 1900) % 1000 << " Some message\n";
 | 
			
		||||
	REQUIRE(log_to_str("Some message", formatter) == oss.str());
 | 
			
		||||
    using namespace::std::chrono;
 | 
			
		||||
    auto formatter = std::make_shared<spdlog::pattern_formatter>("%D %v", spdlog::pattern_time_type::local, "\n");
 | 
			
		||||
    auto now_tm = spdlog::details::os::localtime();
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    oss << std::setfill('0') << std::setw(2) << now_tm.tm_mon + 1 << "/" << now_tm.tm_mday << "/" << (now_tm.tm_year + 1900) % 1000 << " Some message\n";
 | 
			
		||||
    REQUIRE(log_to_str("Some message", formatter) == oss.str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user