summaryrefslogtreecommitdiff
path: root/boost/beast/core/make_printable.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/core/make_printable.hpp')
-rw-r--r--boost/beast/core/make_printable.hpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/boost/beast/core/make_printable.hpp b/boost/beast/core/make_printable.hpp
new file mode 100644
index 0000000000..cead41a96b
--- /dev/null
+++ b/boost/beast/core/make_printable.hpp
@@ -0,0 +1,107 @@
+//
+// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_MAKE_PRINTABLE_HPP
+#define BOOST_BEAST_MAKE_PRINTABLE_HPP
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/asio/buffer.hpp>
+#include <ostream>
+
+namespace boost {
+namespace beast {
+
+namespace detail {
+
+template<class Buffers>
+class make_printable_adaptor
+{
+ Buffers b_;
+
+public:
+ explicit
+ make_printable_adaptor(Buffers const& b)
+ : b_(b)
+ {
+ }
+
+ template<class B>
+ friend
+ std::ostream&
+ operator<<(std::ostream& os,
+ make_printable_adaptor<B> const& v);
+};
+
+template<class Buffers>
+std::ostream&
+operator<<(std::ostream& os,
+ make_printable_adaptor<Buffers> const& v)
+{
+ for(
+ auto it = net::buffer_sequence_begin(v.b_),
+ end = net::buffer_sequence_end(v.b_);
+ it != end;
+ ++it)
+ {
+ net::const_buffer cb = *it;
+ os.write(static_cast<char const*>(
+ cb.data()), cb.size());
+ }
+ return os;
+}
+
+} // detail
+
+/** Helper to permit a buffer sequence to be printed to a std::ostream
+
+ This function is used to wrap a buffer sequence to allow it to
+ be interpreted as characters and written to a `std::ostream` such
+ as `std::cout`. No character translation is performed; unprintable
+ and null characters will be transferred as-is to the output stream.
+
+ @par Example
+ This function prints the size and contents of a buffer sequence
+ to standard output:
+ @code
+ template <class ConstBufferSequence>
+ void
+ print (ConstBufferSequence const& buffers)
+ {
+ std::cout <<
+ "Buffer size: " << buffer_bytes(buffers) << " bytes\n"
+ "Buffer data: '" << make_printable(buffers) << "'\n";
+ }
+ @endcode
+
+ @param buffers An object meeting the requirements of
+ <em>ConstBufferSequence</em> to be streamed. The implementation
+ will make a copy of this object. Ownership of the underlying
+ memory is not transferred, the application is still responsible
+ for managing its lifetime.
+*/
+template<class ConstBufferSequence>
+#if BOOST_BEAST_DOXYGEN
+__implementation_defined__
+#else
+detail::make_printable_adaptor<ConstBufferSequence>
+#endif
+make_printable(ConstBufferSequence const& buffers)
+{
+ static_assert(net::is_const_buffer_sequence<
+ ConstBufferSequence>::value,
+ "ConstBufferSequence type requirements not met");
+ return detail::make_printable_adaptor<
+ ConstBufferSequence>{buffers};
+}
+
+} // beast
+} // boost
+
+#endif