From: Kefu Chai Date: Thu, 16 Nov 2017 04:19:00 +0000 (+0800) Subject: common: add {,make_}ostream_joiner X-Git-Tag: v13.0.1~95^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=77a391dcf1d75ab410c2c1ef7c9b43f6c648d587;p=ceph.git common: add {,make_}ostream_joiner it's handy to print arrays like containers. Signed-off-by: Kefu Chai --- diff --git a/src/common/backport14.h b/src/common/backport14.h index c89b3310d21..5d5c9ffcbed 100644 --- a/src/common/backport14.h +++ b/src/common/backport14.h @@ -133,6 +133,68 @@ template constexpr in_place_type_t in_place_type{}; #endif // __cpp_variable_templates } // namespace _backport17 + +namespace _backport_ts { +template > +class ostream_joiner { +public: + using char_type = CharT; + using traits_type = Traits; + using ostream_type = std::basic_ostream; + using iterator_category = std::output_iterator_tag; + using value_type = void; + using difference_type = void; + using pointer = void; + using reference = void; + + ostream_joiner(ostream_type& s, const DelimT& delimiter) + : out_stream(std::addressof(out_stream)), + delim(delimiter), + first_element(true) + {} + ostream_joiner(ostream_type& s, DelimT&& delimiter) + : out_stream(std::addressof(s)), + delim(std::move(delimiter)), + first_element(true) + {} + + template + ostream_joiner& operator=(const T& value) { + if (!first_element) + *out_stream << delim; + first_element = false; + *out_stream << value; + return *this; + } + + ostream_joiner& operator*() noexcept { + return *this; + } + ostream_joiner& operator++() noexcept { + return *this; + } + ostream_joiner& operator++(int) noexcept { + return this; + } + +private: + ostream_type* out_stream; + DelimT delim; + bool first_element; +}; + +template +ostream_joiner, CharT, Traits> +make_ostream_joiner(std::basic_ostream& os, + DelimT&& delimiter) { + return ostream_joiner, + CharT, Traits>(os, std::forward(delimiter)); +} + +} // namespace _backport_ts + using _backport14::make_unique; using _backport17::size; using _backport14::max; @@ -143,6 +205,8 @@ using _backport17::in_place_type_t; #ifdef __cpp_variable_templates using _backport17::in_place_type; #endif // __cpp_variable_templates +using _backport_ts::ostream_joiner; +using _backport_ts::make_ostream_joiner; } // namespace ceph #endif // CEPH_COMMON_BACKPORT14_H