diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2018-07-11 07:33:08 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2018-07-11 07:33:08 +0200 |
commit | 621f4acf1406e51eaf5d9429c46625e6f5fde98e (patch) | |
tree | 0fe1fd92a0502602f54b2bf12a8c247ef575d00f /lib/spdlog/fmt/bundled/ostream.h | |
parent | 25d4e8d5ee396a852568b7ae1c15971a9da409db (diff) | |
parent | 5aa4b715375b173e9c24363f977883786b05cd6d (diff) |
Merge branch 'release/debian/2.0.0-1'debian/2.0.0-1
Diffstat (limited to 'lib/spdlog/fmt/bundled/ostream.h')
-rw-r--r-- | lib/spdlog/fmt/bundled/ostream.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/lib/spdlog/fmt/bundled/ostream.h b/lib/spdlog/fmt/bundled/ostream.h new file mode 100644 index 0000000..ffa75ab --- /dev/null +++ b/lib/spdlog/fmt/bundled/ostream.h @@ -0,0 +1,117 @@ +/* + Formatting library for C++ - std::ostream support + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#ifndef FMT_OSTREAM_H_ +#define FMT_OSTREAM_H_ + +#include "format.h" +#include <ostream> + +namespace fmt { + +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; + + Buffer<Char> &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. + + 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; + } +}; + +Yes &convert(std::ostream &); + +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 &); +}; + +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) + }; +}; + +// Write the content of w to os. +FMT_API void write(std::ostream &os, Writer &w); +} // namespace internal + +// 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; + + 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)); +} + +/** + \rst + Prints formatted data to the stream *os*. + + **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_ |