summaryrefslogtreecommitdiff
path: root/boost/beast/_experimental/unit_test/dstream.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/_experimental/unit_test/dstream.hpp')
-rw-r--r--boost/beast/_experimental/unit_test/dstream.hpp131
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