22 #ifndef DCCLLOGGER20121009H
23 #define DCCLLOGGER20121009H
29 #include <boost/signals2.hpp>
41 ALL = DEBUG3 | (DEBUG3-1),
42 WARN_PLUS = WARN | (WARN - 1),
43 INFO_PLUS = INFO | (INFO - 1),
44 DEBUG1_PLUS = DEBUG1 | (DEBUG1 - 1),
45 DEBUG2_PLUS = DEBUG2 | (DEBUG2 - 1),
46 DEBUG3_PLUS = DEBUG3 | (DEBUG3 - 1)
49 { GENERAL, ENCODE, DECODE, SIZE };
55 void to_ostream(
const std::string& msg, dccl::logger::Verbosity vrb,
56 dccl::logger::Group grp, std::ostream* os,
bool add_timestamp);
63 LogBuffer() : verbosity_(logger::INFO), group_(logger::GENERAL), buffer_(1) { }
67 template <
typename Slot>
68 void connect(
int verbosity_mask, Slot slot) {
69 enabled_verbosities_ |= verbosity_mask;
70 if(verbosity_mask & logger::WARN) warn_signal.connect(slot);
71 if(verbosity_mask & logger::INFO) info_signal.connect(slot);
72 if(verbosity_mask & logger::DEBUG1) debug1_signal.connect(slot);
73 if(verbosity_mask & logger::DEBUG2) debug2_signal.connect(slot);
74 if(verbosity_mask & logger::DEBUG3) debug3_signal.connect(slot);
77 void disconnect(
int verbosity_mask) {
78 enabled_verbosities_ &= ~verbosity_mask;
79 if(verbosity_mask & logger::WARN) warn_signal.disconnect_all_slots();
80 if(verbosity_mask & logger::INFO) info_signal.disconnect_all_slots();
81 if(verbosity_mask & logger::DEBUG1) debug1_signal.disconnect_all_slots();
82 if(verbosity_mask & logger::DEBUG2) debug2_signal.disconnect_all_slots();
83 if(verbosity_mask & logger::DEBUG3) debug3_signal.disconnect_all_slots();
88 { verbosity_ = verbosity; }
90 void set_group(logger::Group group)
94 bool contains(logger::Verbosity verbosity)
95 {
return verbosity & enabled_verbosities_; }
105 int overflow(
int c = EOF);
108 void display(
const std::string& s) {
109 if(verbosity_ & logger::WARN) warn_signal(s, logger::WARN, group_);
110 if(verbosity_ & logger::INFO) info_signal(s, logger::INFO, group_);
111 if(verbosity_ & logger::DEBUG1) debug1_signal(s, logger::DEBUG1, group_);
112 if(verbosity_ & logger::DEBUG2) debug2_signal(s, logger::DEBUG2, group_);
113 if(verbosity_ & logger::DEBUG3) debug3_signal(s, logger::DEBUG3, group_);
117 logger::Verbosity verbosity_;
118 logger::Group group_;
119 std::deque<std::string> buffer_;
120 int enabled_verbosities_;
122 typedef boost::signals2::signal<void (
const std::string& msg, logger::Verbosity vrb, logger::Group grp)>
125 LogSignal warn_signal, info_signal, debug1_signal, debug2_signal, debug3_signal;
133 Logger() : std::ostream(&buf_) { }
145 bool is(logger::Verbosity verbosity, logger::Group group = logger::GENERAL) {
146 if (!buf_.contains(verbosity)) {
150 buf_.set_group(group);
160 template<
typename Slot>
162 buf_.
connect(verbosity_mask, slot);
171 template<
typename Obj>
173 int verbosity_mask, Obj* obj,
174 void(Obj::*mem_func)(
const std::string& msg, logger::Verbosity vrb, logger::Group grp))
176 #if BOOST_VERSION >= 106000
177 using boost::placeholders::_1;
178 using boost::placeholders::_2;
179 using boost::placeholders::_3;
181 connect(verbosity_mask, boost::bind(mem_func, obj, _1, _2, _3));
189 void connect(
int verbosity_mask, std::ostream* os,
190 bool add_timestamp =
true)
192 #if BOOST_VERSION >= 106000
193 using boost::placeholders::_1;
194 using boost::placeholders::_2;
195 using boost::placeholders::_3;
197 buf_.
connect(verbosity_mask, boost::bind(to_ostream, _1, _2, _3, os, add_timestamp));
202 { buf_.disconnect(verbosity_mask); }
212 #endif // DCCLLOGGER20121009H