37 #ifndef GMM_FEEDBACK_MANAGEMENT_H__
38 #define GMM_FEEDBACK_MANAGEMENT_H__
50 struct warning_level {
51 static int level(
int l = -2)
52 {
static int level_ = 3;
return (l != -2) ? (level_ = l) : level_; }
55 inline void set_warning_level(
int l) { warning_level::level(l>0 ? l : 0); }
56 inline int get_warning_level(
void) {
return warning_level::level(-2); }
64 static int level(
int l = -2)
65 {
static int level_ = 3;
return (l != -2) ? (level_ = l) : level_; }
68 inline void set_traces_level(
int l) { traces_level::level(l>0 ? l : 0); }
69 inline int get_traces_level(
void) {
return traces_level::level(); }
76 enum class FeedbackType {
88 struct base_feedback_handler {
89 virtual ~base_feedback_handler() =
default;
90 virtual void send(
const std::string &message, FeedbackType messageType,
size_t level) = 0;
91 virtual size_t traces_level() {
return get_traces_level(); }
92 virtual size_t warning_level() {
return get_warning_level(); }
93 virtual void terminating_action() = 0;
98 struct default_feedback_handler final :
public base_feedback_handler {
99 void send(
const std::string &message, FeedbackType,
size_t)
override {
100 std::cerr << message << std::endl;
102 void terminating_action()
override {
109 class feedback_manager {
126 static base_feedback_handler* manage(
enum Action action=GET, base_feedback_handler *pHandler=
nullptr);
127 static void send(
const std::string &message, FeedbackType type,
size_t level);
128 static size_t traces_level();
129 static size_t warning_level();
131 static void terminating_action();
136 inline base_feedback_handler* feedback_manager::manage(
enum Action action, base_feedback_handler *pHandler) {
137 static std::unique_ptr<base_feedback_handler>
138 pHandler_ = std::make_unique<default_feedback_handler>();
139 base_feedback_handler *rethandler =
nullptr;
142 pHandler_.reset(pHandler !=
nullptr ? pHandler :
new default_feedback_handler);
143 rethandler = pHandler_.get();
146 rethandler = pHandler_.get();
149 rethandler = pHandler_.release();
150 pHandler_.reset(pHandler !=
nullptr ? pHandler :
new default_feedback_handler);
156 inline void feedback_manager::send(
const std::string &message, FeedbackType type,
size_t level) {
157 feedback_manager::manage()->send(message, type, level);
160 inline void feedback_manager::terminating_action() {
161 feedback_manager::manage()->terminating_action();
164 inline size_t feedback_manager::traces_level() {
165 return feedback_manager::manage()->traces_level();
168 inline size_t feedback_manager::warning_level() {
169 return feedback_manager::manage()->warning_level();