BioCMAMC-ST
console.hpp
1#ifndef __LOGGER_CONSOLE_HPP__
2#define __LOGGER_CONSOLE_HPP__
3
4#include <common/logger.hpp>
5#include <memory>
6#include <optional>
7#include <ostream>
8#include <source_location>
9#include <sstream>
10#include <streambuf>
11
12namespace IO
13{
14 class Console final : public Logger
15 {
16 public:
17 Console();
18 ~Console() override = default;
19
20 Console(const Console&) = delete;
21 Console(Console&&) = delete;
22 Console& operator=(const Console&) = delete;
24
25 void debug(std::string_view message) final;
26 void print(std::string_view prefix, std::string_view message) final;
27 void alert(std::string_view prefix,std::string_view message) final;
28 void error(std::string_view message,std::source_location location =std::source_location::current()) final;
29
30
31 void raw_log(std::string_view message) final;
32
33 void toggle_debug() final;
34 void toggle_print() final;
35 void toggle_alert() final;
36 void toggle_error() final;
37 void toggle_all() final;
38
39 std::ostream& get_output()
40 {
41 return output;
42 };
43
44 private:
45 uint32_t flags;
46 std::ostream& output;
47 std::ostream& err_output;
48 };
49
50 //TODO move elsewhere
51
52
53
59
60 class RedirectGuard;
61
63 {
64 public:
65 RedirectHandle(std::shared_ptr<RedirectGuard> owner,
66 std::shared_ptr<bool> active_flag,
67 bool owns,
68 RedirectionType _type);
69
71
74
77
78 private:
79 std::shared_ptr<RedirectGuard> owner_ptr;
80 std::shared_ptr<bool> active_flag;
81 bool owns_guard = false;
83 };
84
85 class RedirectGuard : public std::enable_shared_from_this<RedirectGuard>
86 {
87 public:
89
90 [[nodiscard("Handle must be held")]] RedirectHandle redirect();
91
92 [[nodiscard("Handle must be held")]] RedirectHandle redirect_to_file();
93
94 void restore();
95
96 std::optional<std::string> getCapturedOutput() const;
97
98 private:
99 friend class RedirectHandle;
100
102 std::streambuf* coutbuf = nullptr;
103 std::stringstream buffer;
105
106 std::shared_ptr<bool> active_flag;
107 };
108}
109
110#endif
~Console() override=default
Console & operator=(const Console &)=delete
void toggle_alert() final
Definition logger.cpp:229
void alert(std::string_view prefix, std::string_view message) final
Definition logger.cpp:186
void toggle_error() final
Definition logger.cpp:234
void toggle_debug() final
Definition logger.cpp:213
void debug(std::string_view message) final
Definition logger.cpp:167
std::ostream & err_output
Definition console.hpp:47
void error(std::string_view message, std::source_location location=std::source_location::current()) final
Definition logger.cpp:195
void toggle_print() final
Definition logger.cpp:224
std::ostream & get_output()
Definition console.hpp:39
Console & operator=(Console &&)=delete
uint32_t flags
Definition console.hpp:45
Console()
Definition logger.cpp:150
void toggle_all() final
Definition logger.cpp:219
std::ostream & output
Definition console.hpp:46
void print(std::string_view prefix, std::string_view message) final
Definition logger.cpp:177
void raw_log(std::string_view message) final
Definition logger.cpp:205
Console(const Console &)=delete
Console(Console &&)=delete
Logger()=default
std::shared_ptr< bool > active_flag
Definition console.hpp:106
RedirectHandle redirect_to_file()
Definition logger.cpp:73
void restore()
Definition logger.cpp:105
bool has_been_redirected
Definition console.hpp:101
std::optional< std::string > getCapturedOutput() const
Definition logger.cpp:132
std::stringstream buffer
Definition console.hpp:103
RedirectGuard()
Definition logger.cpp:45
int original_stdout_fd
Definition console.hpp:104
std::streambuf * coutbuf
Definition console.hpp:102
RedirectHandle redirect()
Definition logger.cpp:49
friend class RedirectHandle
Definition console.hpp:99
RedirectionType type
Definition console.hpp:82
RedirectHandle(RedirectHandle &&)=default
RedirectHandle & operator=(const RedirectHandle &)=delete
std::shared_ptr< RedirectGuard > owner_ptr
Definition console.hpp:79
~RedirectHandle()
Definition logger.cpp:142
std::shared_ptr< bool > active_flag
Definition console.hpp:80
RedirectHandle(const RedirectHandle &)=delete
bool owns_guard
Definition console.hpp:81
RedirectHandle(std::shared_ptr< RedirectGuard > owner, std::shared_ptr< bool > active_flag, bool owns, RedirectionType _type)
Definition logger.cpp:36
RedirectHandle & operator=(RedirectHandle &&)=default
Definition impl_post_process.hpp:12
RedirectionType
Definition console.hpp:55
@ File
Definition console.hpp:57
@ Buffer
Definition console.hpp:56