123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- //
- // 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
|