fmtlegacy/fmt/ostream.h

117 lines
2.9 KiB
C
Raw Normal View History

2016-05-06 14:37:20 +00:00
/*
Formatting library for C++ - std::ostream support
Copyright (c) 2012 - 2016, Victor Zverovich
All rights reserved.
2016-06-22 13:33:56 +00:00
For the license information refer to format.h.
2016-05-06 14:37:20 +00:00
*/
#ifndef FMT_OSTREAM_H_
#define FMT_OSTREAM_H_
#include "fmt/format.h"
2016-05-06 14:37:20 +00:00
#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_;
2016-05-06 14:37:20 +00:00
Char *start_;
public:
FormatBuf(buffer<Char> &buffer) : buffer_(buffer), start_(&buffer[0]) {
2016-05-06 14:37:20 +00:00
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())) {
2016-05-07 14:03:21 +00:00
size_t buf_size = size();
buffer_.resize(buf_size);
buffer_.reserve(buf_size * 2);
2016-05-06 14:37:20 +00:00
start_ = &buffer_[0];
2016-05-07 14:03:21 +00:00
start_[buf_size] = traits_type::to_char_type(ch);
this->setp(start_+ buf_size + 1, start_ + buf_size * 2);
2016-05-06 14:37:20 +00:00
}
return ch;
}
size_t size() const {
return to_unsigned(this->pptr() - start_);
}
};
Yes &convert(std::ostream &);
struct DummyStream : std::ostream {
DummyStream(); // Suppress a bogus warning in MSVC.
// Hide all operator<< overloads from std::ostream.
void operator<<(Null<>);
};
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)
};
};
2016-08-03 15:52:05 +00:00
// Write the content of w to os.
2016-12-30 20:11:27 +00:00
void write(std::ostream &os, writer &w);
template <typename Char, typename T>
BasicStringRef<Char> format_value(
internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> &buffer,
const T &value) {
internal::FormatBuf<Char> format_buf(buffer);
std::basic_ostream<Char> output(&format_buf);
output << value;
return BasicStringRef<Char>(&buffer[0], format_buf.size());
}
2016-05-06 14:37:20 +00:00
} // namespace internal
// Formats a value.
2016-11-07 00:11:24 +00:00
template <typename Char, typename T>
2016-12-30 20:11:27 +00:00
void format_value(basic_writer<Char> &w, const T &value,
2016-11-07 00:11:24 +00:00
basic_format_context<Char> &ctx) {
2016-05-06 14:37:20 +00:00
internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
auto str = internal::format_value(buffer, value);
2016-12-27 15:55:44 +00:00
do_format_arg< ArgFormatter<Char> >(
w, internal::make_arg< basic_format_context<Char> >(str), ctx);
2016-05-06 14:37:20 +00:00
}
2016-08-27 00:23:13 +00:00
FMT_API void vprint(std::ostream &os, CStringRef format_str, format_args args);
2016-05-06 14:37:20 +00:00
/**
\rst
Prints formatted data to the stream *os*.
**Example**::
print(cerr, "Don't {}!", "panic");
\endrst
*/
2016-08-27 00:23:13 +00:00
template <typename... Args>
inline void print(std::ostream &os, CStringRef format_str,
const Args & ... args) {
2016-11-07 03:27:14 +00:00
vprint(os, format_str, make_format_args(args...));
2016-08-27 00:23:13 +00:00
}
2016-05-06 14:37:20 +00:00
} // namespace fmt
#ifdef FMT_HEADER_ONLY
# include "ostream.cc"
#endif
#endif // FMT_OSTREAM_H_