2017-05-03 15:29:23 -07:00
|
|
|
//
|
2017-07-24 09:42:36 -07:00
|
|
|
// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
2017-05-03 15:29:23 -07:00
|
|
|
//
|
|
|
|
// 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)
|
|
|
|
//
|
2017-07-20 13:40:34 -07:00
|
|
|
// Official repository: https://github.com/boostorg/beast
|
|
|
|
//
|
2017-05-03 15:29:23 -07:00
|
|
|
|
2017-07-20 13:40:34 -07:00
|
|
|
#ifndef BOOST_BEAST_WRITE_OSTREAM_HPP
|
|
|
|
#define BOOST_BEAST_WRITE_OSTREAM_HPP
|
2017-05-03 15:29:23 -07:00
|
|
|
|
2017-10-10 07:49:03 -07:00
|
|
|
#include <boost/beast/core/detail/config.hpp>
|
2017-07-20 13:40:34 -07:00
|
|
|
#include <boost/beast/core/type_traits.hpp>
|
|
|
|
#include <boost/beast/core/detail/ostream.hpp>
|
2017-05-03 15:29:23 -07:00
|
|
|
#include <type_traits>
|
|
|
|
#include <streambuf>
|
|
|
|
#include <utility>
|
|
|
|
|
2017-07-20 13:40:34 -07:00
|
|
|
namespace boost {
|
2017-05-03 15:29:23 -07:00
|
|
|
namespace beast {
|
|
|
|
|
2017-05-04 05:01:50 -07:00
|
|
|
/** Return an object representing a @b ConstBufferSequence.
|
|
|
|
|
|
|
|
This function wraps a reference to a buffer sequence and permits
|
|
|
|
the following operation:
|
|
|
|
|
|
|
|
@li `operator<<` to `std::ostream`. No character translation is
|
|
|
|
performed; unprintable and null characters will be transferred
|
|
|
|
as-is to the output stream.
|
|
|
|
|
|
|
|
@par Example
|
|
|
|
@code
|
2017-05-04 15:40:07 -07:00
|
|
|
multi_buffer b;
|
2017-05-04 05:01:50 -07:00
|
|
|
...
|
2017-05-04 15:40:07 -07:00
|
|
|
std::cout << buffers(b.data()) << std::endl;
|
2017-05-04 05:01:50 -07:00
|
|
|
@endcode
|
|
|
|
|
|
|
|
@param b An object meeting the requirements of @b ConstBufferSequence
|
|
|
|
to be streamed. The implementation will make a copy of this object.
|
2017-05-10 12:03:00 -07:00
|
|
|
Ownership of the underlying memory is not transferred, the application
|
|
|
|
is still responsible for managing its lifetime.
|
2017-05-04 05:01:50 -07:00
|
|
|
*/
|
|
|
|
template<class ConstBufferSequence>
|
2017-07-20 13:40:34 -07:00
|
|
|
#if BOOST_BEAST_DOXYGEN
|
2018-11-11 21:53:13 -08:00
|
|
|
__implementation_defined__
|
2017-05-04 05:01:50 -07:00
|
|
|
#else
|
|
|
|
detail::buffers_helper<ConstBufferSequence>
|
|
|
|
#endif
|
|
|
|
buffers(ConstBufferSequence const& b)
|
|
|
|
{
|
2018-11-30 14:58:38 -08:00
|
|
|
static_assert(net::is_const_buffer_sequence<
|
2017-05-04 05:01:50 -07:00
|
|
|
ConstBufferSequence>::value,
|
2017-06-04 07:49:38 -07:00
|
|
|
"ConstBufferSequence requirements not met");
|
2017-05-04 05:01:50 -07:00
|
|
|
return detail::buffers_helper<
|
|
|
|
ConstBufferSequence>{b};
|
|
|
|
}
|
|
|
|
|
2017-05-03 15:29:23 -07:00
|
|
|
/** Return an output stream that formats values into a @b DynamicBuffer.
|
|
|
|
|
|
|
|
This function wraps the caller provided @b DynamicBuffer into
|
|
|
|
a `std::ostream` derived class, to allow `operator<<` stream style
|
|
|
|
formatting operations.
|
|
|
|
|
|
|
|
@par Example
|
|
|
|
@code
|
|
|
|
ostream(buffer) << "Hello, world!" << std::endl;
|
|
|
|
@endcode
|
|
|
|
|
|
|
|
@note Calling members of the underlying buffer before the output
|
|
|
|
stream is destroyed results in undefined behavior.
|
|
|
|
|
|
|
|
@param buffer An object meeting the requirements of @b DynamicBuffer
|
|
|
|
into which the formatted output will be placed.
|
|
|
|
|
2017-05-10 12:03:00 -07:00
|
|
|
@return An object derived from `std::ostream` which redirects output
|
|
|
|
The wrapped dynamic buffer is not modified, a copy is made instead.
|
|
|
|
Ownership of the underlying memory is not transferred, the application
|
|
|
|
is still responsible for managing its lifetime. The caller is
|
|
|
|
responsible for ensuring the dynamic buffer is not destroyed for the
|
|
|
|
lifetime of the output stream.
|
2017-05-03 15:29:23 -07:00
|
|
|
*/
|
|
|
|
template<class DynamicBuffer>
|
2017-07-20 13:40:34 -07:00
|
|
|
#if BOOST_BEAST_DOXYGEN
|
2018-11-11 21:53:13 -08:00
|
|
|
__implementation_defined__
|
2017-05-03 15:29:23 -07:00
|
|
|
#else
|
|
|
|
detail::ostream_helper<
|
|
|
|
DynamicBuffer, char, std::char_traits<char>,
|
2017-05-08 19:02:58 -07:00
|
|
|
detail::basic_streambuf_movable::value>
|
2017-05-03 15:29:23 -07:00
|
|
|
#endif
|
|
|
|
ostream(DynamicBuffer& buffer)
|
|
|
|
{
|
2017-09-07 07:39:52 -07:00
|
|
|
static_assert(
|
2018-11-30 14:58:38 -08:00
|
|
|
net::is_dynamic_buffer<DynamicBuffer>::value,
|
2017-05-03 15:29:23 -07:00
|
|
|
"DynamicBuffer requirements not met");
|
|
|
|
return detail::ostream_helper<
|
|
|
|
DynamicBuffer, char, std::char_traits<char>,
|
2017-05-08 19:02:58 -07:00
|
|
|
detail::basic_streambuf_movable::value>{buffer};
|
2017-05-03 15:29:23 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
} // beast
|
2017-07-20 13:40:34 -07:00
|
|
|
} // boost
|
2017-05-03 15:29:23 -07:00
|
|
|
|
|
|
|
#endif
|