diff --git a/format.h b/format.h index 2f645f76..6cffc105 100644 --- a/format.h +++ b/format.h @@ -38,14 +38,13 @@ #include #include #include -#include #ifndef FMT_USE_IOSTREAMS # define FMT_USE_IOSTREAMS 1 #endif #if FMT_USE_IOSTREAMS -# include +# include #endif #ifdef _SECURE_SCL @@ -1805,6 +1804,38 @@ inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) { (t12.type << 48) | (t13.type << 52) | (t14.type << 56); } #endif + +template +class FormatBuf : public std::basic_streambuf { + private: + typedef typename std::basic_streambuf::int_type int_type; + typedef typename std::basic_streambuf::traits_type traits_type; + + Buffer &buffer_; + Char *start_; + + public: + FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) { + this->setp(start_, start_ + buffer_.capacity()); + } + + int_type overflow(int_type ch = traits_type::eof()) { + if (!traits_type::eq_int_type(ch, traits_type::eof())) { + size_t size = this->pptr() - start_; + buffer_.resize(size); + buffer_.reserve(size * 2); + + start_ = &buffer_[0]; + start_[size] = traits_type::to_char_type(ch); + this->setp(start_+ size + 1, start_ + size * 2); + } + return ch; + } + + size_t size() { + return this->pptr() - start_; + } +}; } // namespace internal # define FMT_MAKE_TEMPLATE_ARG(n) typename T##n @@ -2688,56 +2719,16 @@ class BasicArrayWriter : public BasicWriter { typedef BasicArrayWriter ArrayWriter; typedef BasicArrayWriter WArrayWriter; -template > -class basic_formatbuf : public std::basic_streambuf { - - typedef typename std::basic_streambuf::int_type int_type; - typedef typename std::basic_streambuf::traits_type traits_type; - - using std::basic_streambuf::setp; - using std::basic_streambuf::pptr; - using std::basic_streambuf::pbase; - - Buffer& buffer_; - Elem* start_; - -public: - basic_formatbuf(Buffer& buffer) : buffer_(buffer), start_(&buffer[0]) { - - setp(start_, start_ + buffer_.capacity()); - } - - virtual int_type overflow(int_type _Meta = traits_type::eof()) { - - if (!traits_type::eq_int_type(_Meta, traits_type::eof())) { - - size_t size = pptr() - start_; - buffer_.resize(size); - buffer_.reserve(size * 2); - - start_ = &buffer_[0]; - start_[size] = traits_type::to_char_type(_Meta); - setp(start_+ size + 1, start_ + size * 2); - } - - return _Meta; - } - - size_t size() { - return pptr() - start_; - } -}; - // Formats a value. template void format(BasicFormatter &f, const Char *&format_str, const T &value) { internal::MemoryBuffer buffer; - basic_formatbuf format_buf(buffer); + internal::FormatBuf format_buf(buffer); std::basic_ostream output(&format_buf); output << value; - BasicStringRef str(format_buf.size() > 0 ? &buffer[0] : 0, format_buf.size()); + BasicStringRef str(&buffer[0], format_buf.size()); internal::Arg arg = internal::MakeValue(str); arg.type = static_cast( internal::MakeValue::type(str));