stc
Loading...
Searching...
No Matches
CaptureStream.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <iostream>
4#include <sstream>
5
6namespace stc::testutil {
7
18template <class T, typename = std::enable_if_t<std::is_base_of_v<std::ios_base, T>>>
20private:
21 T& stream;
22 // We need to store the buffer to restore it afterwards
23 decltype(stream.rdbuf()) buffer;
24
25public:
26 std::stringstream content;
27
28 [[nodiscard("Discarding the field means all the streams are immediately uncaptured")]]
29 CaptureStream(T& stream) : stream(stream) {
30 this->buffer = stream.rdbuf();
31 this->stream.rdbuf(content.rdbuf());
32 }
33
35 restore();
36 }
37
38 void restore() {
39 if (buffer != nullptr) {
40 stream.rdbuf(buffer);
41 buffer = nullptr;
42 }
43 }
44
49 void reset() {
50 content = {};
51 stream.rdbuf(content.rdbuf());
52 }
53};
54
60 CaptureStream<decltype(std::cout)> cout{std::cout};
61 CaptureStream<decltype(std::cerr)> cerr{std::cerr};
62 CaptureStream<decltype(std::cin)> cin{std::cin};
63};
64
65}
Definition CaptureStream.hpp:19
~CaptureStream()
Definition CaptureStream.hpp:34
std::stringstream content
Definition CaptureStream.hpp:26
CaptureStream(T &stream)
Definition CaptureStream.hpp:29
void reset()
Definition CaptureStream.hpp:49
void restore()
Definition CaptureStream.hpp:38
Definition CaptureStream.hpp:6
Definition CaptureStream.hpp:59
CaptureStream< decltype(std::cin)> cin
Definition CaptureStream.hpp:62
CaptureStream< decltype(std::cout)> cout
Definition CaptureStream.hpp:60
CaptureStream< decltype(std::cerr)> cerr
Definition CaptureStream.hpp:61