This commit is contained in:
gabime 2016-10-20 12:14:25 +03:00
parent 6128a87da2
commit 87ddb9a6c1
3 changed files with 5252 additions and 4746 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,107 +1,118 @@
/* /*
Formatting library for C++ - std::ostream support Formatting library for C++ - std::ostream support
Copyright (c) 2012 - 2016, Victor Zverovich Copyright (c) 2012 - 2016, Victor Zverovich
All rights reserved. All rights reserved.
For the license information refer to format.h. For the license information refer to format.h.
*/ */
#ifndef FMT_OSTREAM_H_ #ifndef FMT_OSTREAM_H_
#define FMT_OSTREAM_H_ #define FMT_OSTREAM_H_
// commented out by spdlog // commented out by spdlog
//#include "format.h" //#include "format.h"
#include <ostream> #include <ostream>
namespace fmt { namespace fmt
{
namespace internal {
namespace internal
template <class Char> {
class FormatBuf : public std::basic_streambuf<Char> {
private: template <class Char>
typedef typename std::basic_streambuf<Char>::int_type int_type; class FormatBuf : public std::basic_streambuf<Char>
typedef typename std::basic_streambuf<Char>::traits_type traits_type; {
private:
Buffer<Char> &buffer_; typedef typename std::basic_streambuf<Char>::int_type int_type;
Char *start_; typedef typename std::basic_streambuf<Char>::traits_type traits_type;
public: Buffer<Char> &buffer_;
FormatBuf(Buffer<Char> &buffer) : buffer_(buffer), start_(&buffer[0]) { Char *start_;
this->setp(start_, start_ + buffer_.capacity());
} public:
FormatBuf(Buffer<Char> &buffer) : buffer_(buffer), start_(&buffer[0])
int_type overflow(int_type ch = traits_type::eof()) { {
if (!traits_type::eq_int_type(ch, traits_type::eof())) { this->setp(start_, start_ + buffer_.capacity());
size_t buf_size = size(); }
buffer_.resize(buf_size);
buffer_.reserve(buf_size * 2); int_type overflow(int_type ch = traits_type::eof())
{
start_ = &buffer_[0]; if (!traits_type::eq_int_type(ch, traits_type::eof()))
start_[buf_size] = traits_type::to_char_type(ch); {
this->setp(start_ + buf_size + 1, start_ + buf_size * 2); size_t buf_size = size();
} buffer_.resize(buf_size);
return ch; buffer_.reserve(buf_size * 2);
}
start_ = &buffer_[0];
size_t size() const { start_[buf_size] = traits_type::to_char_type(ch);
return to_unsigned(this->pptr() - start_); this->setp(start_ + buf_size + 1, start_ + buf_size * 2);
} }
}; return ch;
}
Yes &convert(std::ostream &);
size_t size() const
struct DummyStream : std::ostream { {
DummyStream(); // Suppress a bogus warning in MSVC. return to_unsigned(this->pptr() - start_);
// Hide all operator<< overloads from std::ostream. }
void operator<<(Null<>); };
};
Yes &convert(std::ostream &);
No &operator<<(std::ostream &, int);
struct DummyStream : std::ostream
template<typename T> {
struct ConvertToIntImpl<T, true> { DummyStream(); // Suppress a bogus warning in MSVC.
// Convert to int only if T doesn't have an overloaded operator<<. // Hide all operator<< overloads from std::ostream.
enum { void operator<<(Null<>);
value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No) };
};
}; No &operator<<(std::ostream &, int);
// Write the content of w to os. template<typename T>
void write(std::ostream &os, Writer &w); struct ConvertToIntImpl<T, true>
} // namespace internal {
// Convert to int only if T doesn't have an overloaded operator<<.
// Formats a value. enum
template <typename Char, typename ArgFormatter, typename T> {
void format_arg(BasicFormatter<Char, ArgFormatter> &f, value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
const Char *&format_str, const T &value) { };
internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer; };
internal::FormatBuf<Char> format_buf(buffer); // Write the content of w to os.
std::basic_ostream<Char> output(&format_buf); void write(std::ostream &os, Writer &w);
output << value; } // namespace internal
BasicStringRef<Char> str(&buffer[0], format_buf.size()); // Formats a value.
typedef internal::MakeArg< BasicFormatter<Char> > MakeArg; template <typename Char, typename ArgFormatter, typename T>
format_str = f.format(format_str, MakeArg(str)); void format_arg(BasicFormatter<Char, ArgFormatter> &f,
} const Char *&format_str, const T &value)
{
/** internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
\rst
Prints formatted data to the stream *os*. internal::FormatBuf<Char> format_buf(buffer);
std::basic_ostream<Char> output(&format_buf);
**Example**:: output << value;
print(cerr, "Don't {}!", "panic"); BasicStringRef<Char> str(&buffer[0], format_buf.size());
\endrst typedef internal::MakeArg< BasicFormatter<Char> > MakeArg;
*/ format_str = f.format(format_str, MakeArg(str));
FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); }
FMT_VARIADIC(void, print, std::ostream &, CStringRef)
} // namespace fmt /**
\rst
#ifdef FMT_HEADER_ONLY Prints formatted data to the stream *os*.
# include "ostream.cc"
#endif **Example**::
print(cerr, "Don't {}!", "panic");
\endrst
*/
FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args);
FMT_VARIADIC(void, print, std::ostream &, CStringRef)
} // namespace fmt
#ifdef FMT_HEADER_ONLY
# include "ostream.cc"
#endif
#endif // FMT_OSTREAM_H_ #endif // FMT_OSTREAM_H_

File diff suppressed because it is too large Load Diff