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