Agora  1.2.0
Agora project
ostream.h
Go to the documentation of this file.
1 // Formatting library for C++ - std::ostream support
2 //
3 // Copyright (c) 2012 - present, Victor Zverovich
4 // All rights reserved.
5 //
6 // For the license information refer to format.h.
7 
8 #ifndef FMT_OSTREAM_H_
9 #define FMT_OSTREAM_H_
10 
11 #include <ostream>
12 
13 #include "format.h"
14 
16 
17 template <typename OutputIt, typename Char> class basic_printf_context;
18 
19 namespace detail {
20 
21 // Checks if T has a user-defined operator<<.
22 template <typename T, typename Char, typename Enable = void>
24  private:
25  template <typename U>
26  static auto test(int)
27  -> bool_constant<sizeof(std::declval<std::basic_ostream<Char>&>()
28  << std::declval<U>()) != 0>;
29 
30  template <typename> static auto test(...) -> std::false_type;
31 
32  using result = decltype(test<T>(0));
33 
34  public:
35  is_streamable() = default;
36 
37  static const bool value = result::value;
38 };
39 
40 // Formatting of built-in types and arrays is intentionally disabled because
41 // it's handled by standard (non-ostream) formatters.
42 template <typename T, typename Char>
44  T, Char,
46  std::is_arithmetic<T>::value || std::is_array<T>::value ||
47  std::is_pointer<T>::value || std::is_same<T, char8_type>::value ||
48  std::is_same<T, std::basic_string<Char>>::value ||
49  std::is_same<T, std_string_view<Char>>::value ||
50  (std::is_convertible<T, int>::value && !std::is_enum<T>::value)>>
51  : std::false_type {};
52 
53 // Write the content of buf to os.
54 // It is a separate function rather than a part of vprint to simplify testing.
55 template <typename Char>
56 void write_buffer(std::basic_ostream<Char>& os, buffer<Char>& buf) {
57  const Char* buf_data = buf.data();
58  using unsigned_streamsize = std::make_unsigned<std::streamsize>::type;
59  unsigned_streamsize size = buf.size();
60  unsigned_streamsize max_size = to_unsigned(max_value<std::streamsize>());
61  do {
62  unsigned_streamsize n = size <= max_size ? size : max_size;
63  os.write(buf_data, static_cast<std::streamsize>(n));
64  buf_data += n;
65  size -= n;
66  } while (size != 0);
67 }
68 
69 template <typename Char, typename T>
70 void format_value(buffer<Char>& buf, const T& value,
71  locale_ref loc = locale_ref()) {
72  auto&& format_buf = formatbuf<std::basic_streambuf<Char>>(buf);
73  auto&& output = std::basic_ostream<Char>(&format_buf);
74 #if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)
75  if (loc) output.imbue(loc.get<std::locale>());
76 #endif
77  output << value;
78  output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
79  buf.try_resize(buf.size());
80 }
81 
82 // Formats an object of type T that has an overloaded ostream operator<<.
83 template <typename T, typename Char>
85  : private formatter<basic_string_view<Char>, Char> {
86  using formatter<basic_string_view<Char>, Char>::parse;
87 
88  template <typename OutputIt>
90  -> OutputIt {
92  format_value(buffer, value, ctx.locale());
94  {buffer.data(), buffer.size()}, ctx);
95  }
96 
97  // DEPRECATED!
98  template <typename OutputIt>
100  -> OutputIt {
102  format_value(buffer, value, ctx.locale());
103  return std::copy(buffer.begin(), buffer.end(), ctx.out());
104  }
105 };
106 } // namespace detail
107 
109 template <typename Char>
110 void vprint(std::basic_ostream<Char>& os, basic_string_view<Char> format_str,
112  auto buffer = basic_memory_buffer<Char>();
113  detail::vformat_to(buffer, format_str, args);
114  detail::write_buffer(os, buffer);
115 }
116 
127 template <typename S, typename... Args,
129 void print(std::basic_ostream<Char>& os, const S& format_str, Args&&... args) {
130  vprint(os, to_string_view(format_str),
131  fmt::make_args_checked<Args...>(format_str, args...));
132 }
134 
135 #endif // FMT_OSTREAM_H_
spdlog::level::to_string_view
const SPDLOG_INLINE string_view_t & to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT
Definition: common-inl.h:23
fmt::v8::char_t
typename detail::char_t_impl< S >::type char_t
Definition: core.h:623
size
end IFFT Reshape the symbol vector into two different spatial streams size
Definition: generate_data.m:73
fmt::v8::basic_format_args
Definition: core.h:702
Catch::Generators::value
GeneratorWrapper< T > value(T &&value)
Definition: catch.hpp:3999
format.h
fmt::v8::detail::buffer::size
constexpr auto size() const -> size_t
Definition: core.h:820
fmt::v8::detail::locale_ref
Definition: core.h:1669
fmt::v8::detail::format_value
void format_value(buffer< Char > &buf, const T &value, locale_ref loc=locale_ref())
Definition: ostream.h:70
fmt::v8::basic_string_view
Definition: core.h:448
detail
Definition: fmt.cpp:13
fmt::v8::detail::formatbuf
Definition: format.h:255
fmt::v8::detail::buffer
Definition: core.h:778
fmt::v8::detail::fallback_formatter< T, Char, enable_if_t< is_streamable< T, Char >::value > >::format
auto format(const T &value, basic_format_context< OutputIt, Char > &ctx) -> OutputIt
Definition: ostream.h:89
fmt::v8::detail::value
Definition: core.h:1208
T
T
Definition: simulate_performance.m:4
fmt::v8::basic_memory_buffer
Definition: format.h:677
fmt::v8::detail::is_streamable
Definition: ostream.h:23
fmt::v8::basic_format_context
Definition: core.h:1742
fmt::v8::bool_constant
std::integral_constant< bool, B > bool_constant
Definition: core.h:324
FMT_END_NAMESPACE
#define FMT_END_NAMESPACE
Definition: core.h:240
fmt::v8::print
void print(std::basic_ostream< Char > &os, const S &format_str, Args &&... args)
Definition: ostream.h:129
fmt::v8::detail::buffer::begin
auto begin() -> T *
Definition: core.h:813
fmt::v8::detail::fallback_formatter< T, Char, enable_if_t< is_streamable< T, Char >::value > >::format
auto format(const T &value, basic_printf_context< OutputIt, Char > &ctx) -> OutputIt
Definition: ostream.h:99
FMT_MODULE_EXPORT
#define FMT_MODULE_EXPORT
Definition: core.h:246
fmt::v8::vprint
void vprint(std::basic_ostream< Char > &os, basic_string_view< Char > format_str, basic_format_args< buffer_context< type_identity_t< Char >>> args)
Definition: ostream.h:110
fmt::v8::detail::write_buffer
void write_buffer(std::basic_ostream< Char > &os, buffer< Char > &buf)
Definition: ostream.h:56
fmt::v8::detail::buffer::end
auto end() -> T *
Definition: core.h:814
fmt::v8::detail::vformat_to
void vformat_to(buffer< Char > &buf, const text_style &ts, basic_string_view< Char > format_str, basic_format_args< buffer_context< type_identity_t< Char >>> args)
Definition: color.h:502
fmt::v8::detail::fallback_formatter
Definition: core.h:1040
n
n
Definition: simulate_performance.m:1
fmt::v8::formatter
Definition: core.h:707
fmt::v8::detail::buffer::data
auto data() -> T *
Definition: core.h:826
std
Definition: json.hpp:5213
fmt::v8::detail::copy
OutputIterator copy(const RangeT &range, OutputIterator out)
Definition: ranges.h:26
FMT_BEGIN_NAMESPACE
#define FMT_BEGIN_NAMESPACE
Definition: core.h:237
fmt::v8::basic_printf_context
Definition: ostream.h:17
fmt::v8::type_identity_t
typename type_identity< T >::type type_identity_t
Definition: core.h:332
fmt::v8::detail::is_streamable::result
decltype(test< T >(0)) result
Definition: ostream.h:32
fmt::v8::enable_if_t
typename std::enable_if< B, T >::type enable_if_t
Definition: core.h:321
fmt::v8::detail::buffer::try_resize
void try_resize(size_t count)
Definition: core.h:836
fmt::v8::detail::to_unsigned
auto to_unsigned(Int value) -> typename std::make_unsigned< Int >::type
Definition: core.h:424
utils::format
std::string format(const T &value)
Definition: utils.h:15
fmt::v8::detail::type
type
Definition: core.h:1131