Commit 81f3cc55 authored by gabime's avatar gabime

clang format

parent 1fd166d4
...@@ -339,9 +339,9 @@ public: ...@@ -339,9 +339,9 @@ public:
dest.push_back('+'); dest.push_back('+');
} }
fmt_helper::pad2(total_minutes / 60, dest); //hours fmt_helper::pad2(total_minutes / 60, dest); // hours
dest.push_back(':'); dest.push_back(':');
fmt_helper::pad2(total_minutes % 60, dest); //minutes fmt_helper::pad2(total_minutes % 60, dest); // minutes
} }
private: private:
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -14,128 +14,137 @@ ...@@ -14,128 +14,137 @@
FMT_BEGIN_NAMESPACE FMT_BEGIN_NAMESPACE
namespace internal { namespace internal {
template <class Char> template<class Char>
class formatbuf : public std::basic_streambuf<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;
basic_buffer<Char> &buffer_;
basic_buffer<Char> &buffer_;
public:
formatbuf(basic_buffer<Char> &buffer) : buffer_(buffer) {} public:
formatbuf(basic_buffer<Char> &buffer)
protected: : buffer_(buffer)
// 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 protected:
// to overflow. There is no disadvantage here for sputn since this always // The put-area is actually always empty. This makes the implementation
// results in a call to xsputn. // simpler and has the advantage that the streambuf and the buffer are always
// in sync and sputc never writes into uninitialized memory. The obvious
int_type overflow(int_type ch = traits_type::eof()) FMT_OVERRIDE { // disadvantage is that each call to sputc always results in a (virtual) call
if (!traits_type::eq_int_type(ch, traits_type::eof())) // to overflow. There is no disadvantage here for sputn since this always
buffer_.push_back(static_cast<Char>(ch)); // results in a call to xsputn.
return ch;
} int_type overflow(int_type ch = traits_type::eof()) FMT_OVERRIDE
{
std::streamsize xsputn(const Char *s, std::streamsize count) FMT_OVERRIDE { if (!traits_type::eq_int_type(ch, traits_type::eof()))
buffer_.append(s, s + count); buffer_.push_back(static_cast<Char>(ch));
return count; return ch;
} }
std::streamsize xsputn(const Char *s, std::streamsize count) FMT_OVERRIDE
{
buffer_.append(s, s + count);
return count;
}
}; };
template <typename Char> template<typename Char>
struct test_stream : std::basic_ostream<Char> { struct test_stream : std::basic_ostream<Char>
private: {
struct null; private:
// Hide all operator<< from std::basic_ostream<Char>. struct null;
void operator<<(null); // Hide all operator<< from std::basic_ostream<Char>.
void operator<<(null);
}; };
// Checks if T has a user-defined operator<< (e.g. not a member of std::ostream). // Checks if T has a user-defined operator<< (e.g. not a member of std::ostream).
template <typename T, typename Char> template<typename T, typename Char>
class is_streamable { class is_streamable
private: {
template <typename U> private:
static decltype( template<typename U>
internal::declval<test_stream<Char>&>() static decltype(internal::declval<test_stream<Char> &>() << internal::declval<U>(), std::true_type()) test(int);
<< internal::declval<U>(), std::true_type()) test(int);
template<typename>
template <typename> static std::false_type test(...);
static std::false_type test(...);
typedef decltype(test<T>(0)) result;
typedef decltype(test<T>(0)) result;
public:
public: // std::string operator<< is not considered user-defined because we handle strings
// std::string operator<< is not considered user-defined because we handle strings // specially.
// specially. static const bool value = result::value && !std::is_same<T, std::string>::value;
static const bool value = result::value && !std::is_same<T, std::string>::value;
}; };
// Disable conversion to int if T has an overloaded operator<< which is a free // Disable conversion to int if T has an overloaded operator<< which is a free
// function (not a member of std::ostream). // function (not a member of std::ostream).
template <typename T, typename Char> template<typename T, typename Char>
class convert_to_int<T, Char, true> { class convert_to_int<T, Char, true>
public: {
static const bool value = public:
convert_to_int<T, Char, false>::value && !is_streamable<T, Char>::value; static const bool value = convert_to_int<T, Char, false>::value && !is_streamable<T, Char>::value;
}; };
// Write the content of buf to os. // Write the content of buf to os.
template <typename Char> template<typename Char>
void write(std::basic_ostream<Char> &os, basic_buffer<Char> &buf) { void write(std::basic_ostream<Char> &os, basic_buffer<Char> &buf)
const Char *data = buf.data(); {
typedef std::make_unsigned<std::streamsize>::type UnsignedStreamSize; const Char *data = buf.data();
UnsignedStreamSize size = buf.size(); typedef std::make_unsigned<std::streamsize>::type UnsignedStreamSize;
UnsignedStreamSize max_size = UnsignedStreamSize size = buf.size();
internal::to_unsigned((std::numeric_limits<std::streamsize>::max)()); UnsignedStreamSize max_size = internal::to_unsigned((std::numeric_limits<std::streamsize>::max)());
do { do
UnsignedStreamSize n = size <= max_size ? size : max_size; {
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);
} }
template <typename Char, typename T> template<typename Char, typename T>
void format_value(basic_buffer<Char> &buffer, const T &value) { void format_value(basic_buffer<Char> &buffer, const T &value)
internal::formatbuf<Char> format_buf(buffer); {
std::basic_ostream<Char> output(&format_buf); internal::formatbuf<Char> format_buf(buffer);
output.exceptions(std::ios_base::failbit | std::ios_base::badbit); std::basic_ostream<Char> output(&format_buf);
output << value; output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
buffer.resize(buffer.size()); output << value;
buffer.resize(buffer.size());
} }
// Disable builtin formatting of enums and use operator<< instead. // Disable builtin formatting of enums and use operator<< instead.
template <typename T> template<typename T>
struct format_enum<T, struct format_enum<T, typename std::enable_if<std::is_enum<T>::value>::type> : std::false_type
typename std::enable_if<std::is_enum<T>::value>::type> : std::false_type {}; {
} // namespace internal };
} // namespace internal
// Formats an object of type T that has an overloaded ostream operator<<. // Formats an object of type T that has an overloaded ostream operator<<.
template <typename T, typename Char> template<typename T, typename Char>
struct formatter<T, Char, struct formatter<T, Char, typename std::enable_if<internal::is_streamable<T, Char>::value>::type> : formatter<basic_string_view<Char>, Char>
typename std::enable_if<internal::is_streamable<T, Char>::value>::type> {
: formatter<basic_string_view<Char>, Char> {
template<typename Context>
template <typename Context> auto format(const T &value, Context &ctx) -> decltype(ctx.out())
auto format(const T &value, Context &ctx) -> decltype(ctx.out()) { {
basic_memory_buffer<Char> buffer; basic_memory_buffer<Char> buffer;
internal::format_value(buffer, value); internal::format_value(buffer, value);
basic_string_view<Char> str(buffer.data(), buffer.size()); basic_string_view<Char> str(buffer.data(), buffer.size());
formatter<basic_string_view<Char>, Char>::format(str, ctx); formatter<basic_string_view<Char>, Char>::format(str, ctx);
return ctx.out(); return ctx.out();
} }
}; };
template <typename Char> template<typename Char>
inline void vprint(std::basic_ostream<Char> &os, inline void vprint(
basic_string_view<Char> format_str, std::basic_ostream<Char> &os, basic_string_view<Char> format_str, basic_format_args<typename buffer_context<Char>::type> args)
basic_format_args<typename buffer_context<Char>::type> args) { {
basic_memory_buffer<Char> buffer; basic_memory_buffer<Char> buffer;
vformat_to(buffer, format_str, args); vformat_to(buffer, format_str, args);
internal::write(os, buffer); internal::write(os, buffer);
} }
/** /**
\rst \rst
...@@ -146,17 +155,17 @@ inline void vprint(std::basic_ostream<Char> &os, ...@@ -146,17 +155,17 @@ inline void vprint(std::basic_ostream<Char> &os,
fmt::print(cerr, "Don't {}!", "panic"); fmt::print(cerr, "Don't {}!", "panic");
\endrst \endrst
*/ */
template <typename... Args> template<typename... Args>
inline void print(std::ostream &os, string_view format_str, inline void print(std::ostream &os, string_view format_str, const Args &... args)
const Args & ... args) { {
vprint<char>(os, format_str, make_format_args<format_context>(args...)); vprint<char>(os, format_str, make_format_args<format_context>(args...));
} }
template <typename... Args> template<typename... Args>
inline void print(std::wostream &os, wstring_view format_str, inline void print(std::wostream &os, wstring_view format_str, const Args &... args)
const Args & ... args) { {
vprint<wchar_t>(os, format_str, make_format_args<wformat_context>(args...)); vprint<wchar_t>(os, format_str, make_format_args<wformat_context>(args...));
} }
FMT_END_NAMESPACE FMT_END_NAMESPACE
#endif // FMT_OSTREAM_H_ #endif // FMT_OSTREAM_H_
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -20,7 +20,6 @@ public: ...@@ -20,7 +20,6 @@ public:
{ {
} }
virtual ~sink() = default; virtual ~sink() = default;
virtual void log(const details::log_msg &msg) = 0; virtual void log(const details::log_msg &msg) = 0;
......
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