Commit d142f135 authored by gabime's avatar gabime

Updated fmto to version def687462c32ec40757e49eb6069f109d50236d6

parent e12916c0
This diff is collapsed.
This diff is collapsed.
/* /*
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.
*/ */
#include "ostream.h" #include "ostream.h"
namespace fmt { namespace fmt {
namespace internal { namespace internal {
FMT_FUNC void write(std::ostream &os, Writer &w) { FMT_FUNC void write(std::ostream &os, Writer &w)
const char *data = w.data(); {
typedef internal::MakeUnsigned<std::streamsize>::Type UnsignedStreamSize; const char *data = w.data();
UnsignedStreamSize size = w.size(); typedef internal::MakeUnsigned<std::streamsize>::Type UnsignedStreamSize;
UnsignedStreamSize max_size = UnsignedStreamSize size = w.size();
internal::to_unsigned((std::numeric_limits<std::streamsize>::max)()); UnsignedStreamSize max_size =
do { internal::to_unsigned((std::numeric_limits<std::streamsize>::max)());
UnsignedStreamSize n = size <= max_size ? size : max_size; do {
os.write(data, static_cast<std::streamsize>(n)); UnsignedStreamSize n = size <= max_size ? size : max_size;
data += n; os.write(data, static_cast<std::streamsize>(n));
size -= n; data += n;
} while (size != 0); size -= n;
} } while (size != 0);
} }
}
FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args) {
MemoryWriter w; FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args)
w.write(format_str, args); {
internal::write(os, w); MemoryWriter w;
} w.write(format_str, args);
} // namespace fmt internal::write(os, w);
\ No newline at end of file }
} // namespace fmt
...@@ -11,108 +11,105 @@ For the license information refer to format.h. ...@@ -11,108 +11,105 @@ For the license information refer to format.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>
template <class Char> {
class FormatBuf : public std::basic_streambuf<Char> private:
{ typedef typename std::basic_streambuf<Char>::int_type int_type;
private: typedef typename std::basic_streambuf<Char>::traits_type traits_type;
typedef typename std::basic_streambuf<Char>::int_type int_type;
typedef typename std::basic_streambuf<Char>::traits_type traits_type; Buffer<Char> &buffer_;
Char *start_;
Buffer<Char> &buffer_;
Char *start_; public:
FormatBuf(Buffer<Char> &buffer): buffer_(buffer), start_(&buffer[0])
public: {
FormatBuf(Buffer<Char> &buffer) : buffer_(buffer), start_(&buffer[0]) this->setp(start_, start_ + buffer_.capacity());
{ }
this->setp(start_, start_ + buffer_.capacity());
} int_type overflow(int_type ch = traits_type::eof())
{
int_type overflow(int_type ch = traits_type::eof()) if (!traits_type::eq_int_type(ch, traits_type::eof())) {
{ size_t buf_size = size();
if (!traits_type::eq_int_type(ch, traits_type::eof())) buffer_.resize(buf_size);
{ buffer_.reserve(buf_size * 2);
size_t buf_size = size();
buffer_.resize(buf_size); start_ = &buffer_[0];
buffer_.reserve(buf_size * 2); start_[buf_size] = traits_type::to_char_type(ch);
this->setp(start_ + buf_size + 1, start_ + buf_size * 2);
start_ = &buffer_[0]; }
start_[buf_size] = traits_type::to_char_type(ch); return ch;
this->setp(start_ + buf_size + 1, start_ + buf_size * 2); }
}
return ch; size_t size() const
} {
return to_unsigned(this->pptr() - start_);
size_t size() const }
{ };
return to_unsigned(this->pptr() - start_);
} Yes &convert(std::ostream &);
};
struct DummyStream: std::ostream
Yes &convert(std::ostream &); {
DummyStream(); // Suppress a bogus warning in MSVC.
struct DummyStream : std::ostream // Hide all operator<< overloads from std::ostream.
{ void operator<<(Null<>);
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>
No &operator<<(std::ostream &, int); struct ConvertToIntImpl<T, true>
{
template<typename T> // Convert to int only if T doesn't have an overloaded operator<<.
struct ConvertToIntImpl<T, true> enum
{ {
// Convert to int only if T doesn't have an overloaded operator<<. value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
enum };
{ };
value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
}; // Write the content of w to os.
}; void write(std::ostream &os, Writer &w);
} // namespace internal
// Write the content of w to os.
void write(std::ostream &os, Writer &w); // Formats a value.
} // namespace internal template <typename Char, typename ArgFormatter, typename T>
void format_arg(BasicFormatter<Char, ArgFormatter> &f,
// Formats a value. const Char *&format_str, const T &value)
template <typename Char, typename ArgFormatter, typename T> {
void format_arg(BasicFormatter<Char, ArgFormatter> &f, internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
const Char *&format_str, const T &value)
{ internal::FormatBuf<Char> format_buf(buffer);
internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer; std::basic_ostream<Char> output(&format_buf);
output << value;
internal::FormatBuf<Char> format_buf(buffer);
std::basic_ostream<Char> output(&format_buf); BasicStringRef<Char> str(&buffer[0], format_buf.size());
output << value; typedef internal::MakeArg< BasicFormatter<Char> > MakeArg;
format_str = f.format(format_str, MakeArg(str));
BasicStringRef<Char> str(&buffer[0], format_buf.size()); }
typedef internal::MakeArg< BasicFormatter<Char> > MakeArg;
format_str = f.format(format_str, MakeArg(str)); /**
} \rst
Prints formatted data to the stream *os*.
/**
\rst **Example**::
Prints formatted data to the stream *os*.
print(cerr, "Don't {}!", "panic");
**Example**:: \endrst
*/
print(cerr, "Don't {}!", "panic"); FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args);
\endrst FMT_VARIADIC(void, print, std::ostream &, CStringRef)
*/
FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args);
FMT_VARIADIC(void, print, std::ostream &, CStringRef)
} // namespace fmt } // namespace fmt
#ifdef FMT_HEADER_ONLY #ifdef FMT_HEADER_ONLY
# include "ostream.cc" # include "ostream.cc"
#endif #endif
#endif // FMT_OSTREAM_H_ #endif // FMT_OSTREAM_H_
\ No newline at end of file
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment