X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fvendor%2Ffmt%2Fostream.h;fp=src%2Fvendor%2Ffmt%2Fostream.h;h=3d716ece84d00c3ee05298c79b5504e72d433402;hp=0000000000000000000000000000000000000000;hb=05aa7e19ec97871aad18d7c9787c4c89611cd2cd;hpb=b3647fb885288c63d21478ea9a9c85685bc5c5f2 diff --git a/src/vendor/fmt/ostream.h b/src/vendor/fmt/ostream.h new file mode 100644 index 000000000..3d716ece8 --- /dev/null +++ b/src/vendor/fmt/ostream.h @@ -0,0 +1,135 @@ +// Formatting library for C++ - std::ostream support +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_OSTREAM_H_ +#define FMT_OSTREAM_H_ + +#include + +#include "format.h" + +FMT_BEGIN_NAMESPACE + +template class basic_printf_context; + +namespace detail { + +// Checks if T has a user-defined operator<<. +template +class is_streamable { + private: + template + static auto test(int) + -> bool_constant&>() + << std::declval()) != 0>; + + template static auto test(...) -> std::false_type; + + using result = decltype(test(0)); + + public: + is_streamable() = default; + + static const bool value = result::value; +}; + +// Formatting of built-in types and arrays is intentionally disabled because +// it's handled by standard (non-ostream) formatters. +template +struct is_streamable< + T, Char, + enable_if_t< + std::is_arithmetic::value || std::is_array::value || + std::is_pointer::value || std::is_same::value || + std::is_same>::value || + std::is_same>::value || + (std::is_convertible::value && !std::is_enum::value)>> + : std::false_type {}; + +// Write the content of buf to os. +// It is a separate function rather than a part of vprint to simplify testing. +template +void write_buffer(std::basic_ostream& os, buffer& buf) { + const Char* buf_data = buf.data(); + using unsigned_streamsize = std::make_unsigned::type; + unsigned_streamsize size = buf.size(); + unsigned_streamsize max_size = to_unsigned(max_value()); + do { + unsigned_streamsize n = size <= max_size ? size : max_size; + os.write(buf_data, static_cast(n)); + buf_data += n; + size -= n; + } while (size != 0); +} + +template +void format_value(buffer& buf, const T& value, + locale_ref loc = locale_ref()) { + auto&& format_buf = formatbuf>(buf); + auto&& output = std::basic_ostream(&format_buf); +#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) + if (loc) output.imbue(loc.get()); +#endif + output << value; + output.exceptions(std::ios_base::failbit | std::ios_base::badbit); + buf.try_resize(buf.size()); +} + +// Formats an object of type T that has an overloaded ostream operator<<. +template +struct fallback_formatter::value>> + : private formatter, Char> { + using formatter, Char>::parse; + + template + auto format(const T& value, basic_format_context& ctx) + -> OutputIt { + auto buffer = basic_memory_buffer(); + format_value(buffer, value, ctx.locale()); + return formatter, Char>::format( + {buffer.data(), buffer.size()}, ctx); + } + + // DEPRECATED! + template + auto format(const T& value, basic_printf_context& ctx) + -> OutputIt { + auto buffer = basic_memory_buffer(); + format_value(buffer, value, ctx.locale()); + return std::copy(buffer.begin(), buffer.end(), ctx.out()); + } +}; +} // namespace detail + +FMT_MODULE_EXPORT +template +void vprint(std::basic_ostream& os, basic_string_view format_str, + basic_format_args>> args) { + auto buffer = basic_memory_buffer(); + detail::vformat_to(buffer, format_str, args); + detail::write_buffer(os, buffer); +} + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + fmt::print(cerr, "Don't {}!", "panic"); + \endrst + */ +FMT_MODULE_EXPORT +template ::value, char_t>> +void print(std::basic_ostream& os, const S& format_str, Args&&... args) { + vprint(os, to_string_view(format_str), + fmt::make_args_checked(format_str, args...)); +} +FMT_END_NAMESPACE + +#endif // FMT_OSTREAM_H_