diff options
Diffstat (limited to 'boost/beast/_experimental/unit_test/dstream.hpp')
-rw-r--r-- | boost/beast/_experimental/unit_test/dstream.hpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/boost/beast/_experimental/unit_test/dstream.hpp b/boost/beast/_experimental/unit_test/dstream.hpp new file mode 100644 index 0000000000..60066ac7bd --- /dev/null +++ b/boost/beast/_experimental/unit_test/dstream.hpp @@ -0,0 +1,131 @@ +// +// 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_UNIT_TEST_DSTREAM_HPP +#define BOOST_BEAST_UNIT_TEST_DSTREAM_HPP + +#include <boost/config.hpp> +#include <ios> +#include <memory> +#include <ostream> +#include <sstream> +#include <streambuf> +#include <string> + +#ifdef BOOST_WINDOWS +#include <boost/winapi/basic_types.hpp> +#include <boost/winapi/debugapi.hpp> +#endif + +namespace boost { +namespace beast { +namespace unit_test { + +#ifdef BOOST_WINDOWS + +namespace detail { + +template<class CharT, class Traits, class Allocator> +class dstream_buf + : public std::basic_stringbuf<CharT, Traits, Allocator> +{ + using ostream = std::basic_ostream<CharT, Traits>; + + ostream& os_; + bool dbg_; + + template<class T> + void write(T const*) = delete; + + void write(char const* s) + { + if(dbg_) + boost::winapi::OutputDebugStringA(s); + os_ << s; + } + + void write(wchar_t const* s) + { + if(dbg_) + boost::winapi::OutputDebugStringW(s); + os_ << s; + } + +public: + explicit + dstream_buf(ostream& os) + : os_(os) + , dbg_(boost::winapi::IsDebuggerPresent() != 0) + { + } + + ~dstream_buf() + { + sync(); + } + + int + sync() override + { + write(this->str().c_str()); + this->str(""); + return 0; + } +}; + +} // detail + +/** std::ostream with Visual Studio IDE redirection. + + Instances of this stream wrap a specified `std::ostream` + (such as `std::cout` or `std::cerr`). If the IDE debugger + is attached when the stream is created, output will be + additionally copied to the Visual Studio Output window. +*/ +template< + class CharT, + class Traits = std::char_traits<CharT>, + class Allocator = std::allocator<CharT> +> +class basic_dstream + : public std::basic_ostream<CharT, Traits> +{ + detail::dstream_buf< + CharT, Traits, Allocator> buf_; + +public: + /** Construct a stream. + + @param os The output stream to wrap. + */ + explicit + basic_dstream(std::ostream& os) + : std::basic_ostream<CharT, Traits>(&buf_) + , buf_(os) + { + if(os.flags() & std::ios::unitbuf) + std::unitbuf(*this); + } +}; + +using dstream = basic_dstream<char>; +using dwstream = basic_dstream<wchar_t>; + +#else + +using dstream = std::ostream&; +using dwstream = std::wostream&; + +#endif + +} // unit_test +} // beast +} // boost + +#endif |