Changeset 2c11c1 for src/Patterns


Ignore:
Timestamp:
Dec 13, 2011, 10:45:00 AM (14 years ago)
Author:
Frederik Heber <heber@…>
Children:
d85532
Parents:
40f2e6
git-author:
Frederik Heber <heber@…> (12/02/11 13:05:49)
git-committer:
Frederik Heber <heber@…> (12/13/11 10:45:00)
Message:

Modified ObserverLog: Singleton and both output to screen and internal Log.

  • ObserverLog can now either be printed concurrently or later requested as string (e.g. on exit as has been done before). This should ease debugging Observer code.
  • enable/disableLogging() (dis)activate printing to screen.
  • ObserverLog is now a true singleton.

Details:

  • Implemented helper class ObserverLog::Log which is returned as boost::shared_ptr on addMessage() and can be streamed to.
  • On dstor the logged message is appended with endl, placed into ObserverLog's internal log and printed on screen if enableLogging().
  • NOTE: streaming std::endl is not working, and not necessary.
Location:
src/Patterns
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/Patterns/Cacheable.hpp

    r40f2e6 r2c11c1  
    227227#ifdef LOG_OBSERVER
    228228    observerLog().addMessage() << "## Cacheable " << observerLog().getName(this) << " changed state (" << state->getName()
    229                                << "->" << newState->getName() << ")" << std::endl;
     229                               << "->" << newState->getName() << ")";
    230230#endif
    231231    state = newState;
  • src/Patterns/Observer/Observable.cpp

    r40f2e6 r2c11c1  
    7777  // by the STL and initialized to 0 (see STL documentation)
    7878#ifdef LOG_OBSERVER
    79   observerLog().addMessage(depth[publisher]) << ">> Locking " << observerLog().getName(publisher) << std::endl;
     79  observerLog().addMessage(depth[publisher]) << ">> Locking " << observerLog().getName(publisher);
    8080#endif
    8181  depth[publisher]++;
     
    9898  --depth[publisher];
    9999#ifdef LOG_OBSERVER
    100   observerLog().addMessage(depth[publisher]) << "<< Unlocking " << observerLog().getName(publisher) << std::endl;
     100  observerLog().addMessage(depth[publisher]) << "<< Unlocking " << observerLog().getName(publisher);
    101101#endif
    102102  if(depth[publisher]){}
     
    165165        observerLog().addMessage() << "-> Sending update from " << observerLog().getName(this)
    166166                                   << " to " << observerLog().getName((*iter).second)
    167                                    << " (priority=" << (*iter).first << ")"<< std::endl;
     167                                   << " (priority=" << (*iter).first << ")";
    168168#endif
    169169        (*iter).second->update(this);
     
    211211#ifdef LOG_OBSERVER
    212212      observerLog().addMessage() << "-* Update from " << observerLog().getName(publisher)
    213                                  << " propagated by " << observerLog().getName(this) << std::endl;
     213                                 << " propagated by " << observerLog().getName(this);
    214214#endif
    215215      notifyAll();
     
    218218#ifdef LOG_OBSERVER
    219219      observerLog().addMessage() << "-| Update from " <<  observerLog().getName(publisher)
    220                                  << " not propagated by " << observerLog().getName(this) << std::endl;
     220                                 << " not propagated by " << observerLog().getName(this);
    221221#endif
    222222    }
     
    232232{
    233233#ifdef LOG_OBSERVER
    234   observerLog().addMessage() << "@@ Signing on " << observerLog().getName(target) << " to " << observerLog().getName(const_cast<Observable *>(this)) << std::endl;
     234  observerLog().addMessage() << "@@ Signing on " << observerLog().getName(target) << " to " << observerLog().getName(const_cast<Observable *>(this));
    235235#endif
    236236  bool res = false;
     
    254254      "SignOff called for an Observable without Observers.");
    255255#ifdef LOG_OBSERVER
    256   observerLog().addMessage() << "** Signing off " << observerLog().getName(target) << " from " << observerLog().getName(const_cast<Observable *>(this)) << std::endl;
     256  observerLog().addMessage() << "** Signing off " << observerLog().getName(target) << " from " << observerLog().getName(const_cast<Observable *>(this));
    257257#endif
    258258  callees_t &callees = callTable[const_cast<Observable *>(this)];
     
    315315#ifdef LOG_OBSERVER
    316316  observerLog().addName(this,name);
    317   observerLog().addMessage() << "++ Creating Observable " << observerLog().getName(this) << std::endl;
     317  observerLog().addMessage() << "++ Creating Observable " << observerLog().getName(this);
    318318#endif
    319319}
     
    325325{
    326326#ifdef LOG_OBSERVER
    327   observerLog().addMessage() << "-- Destroying Observable " << observerLog().getName(this) << std::endl;
     327  observerLog().addMessage() << "-- Destroying Observable " << observerLog().getName(this);
    328328#endif
    329329  if(callTable.count(this)) {
  • src/Patterns/Observer/Observer.cpp

    r40f2e6 r2c11c1  
    2929#endif
    3030
    31 using namespace std;
    32 
    3331
    3432/** Constructor for class Observer.
    3533 */
    36 Observer::Observer(string name)
     34Observer::Observer(std::string name)
    3735{
    3836#ifdef LOG_OBSERVER
    3937  observerLog().addName(this,name);
    40   observerLog().addMessage() << "++ Creating Observer " << observerLog().getName(this) << endl;
     38  observerLog().addMessage() << "++ Creating Observer " << observerLog().getName(this);
    4139#endif
    4240}
     
    5957#ifdef LOG_OBSERVER
    6058  if(!observerLog().isObservable(this)){
    61     observerLog().addMessage() << "-- Destroying Observer " << observerLog().getName(this) << endl;
     59    observerLog().addMessage() << "-- Destroying Observer " << observerLog().getName(this);
    6260  }
    6361#endif
  • src/Patterns/Observer/ObserverLog.cpp

    r40f2e6 r2c11c1  
    2020#include "MemDebug.hpp"
    2121
     22#include <fstream>
     23#include <iostream>
     24#include <sstream>
     25
    2226#include "ObserverLog.hpp"
     27#include "Singleton_impl.hpp"
    2328
     29std::ostream* ObserverLog::nullstream = NULL;
     30std::ostream* ObserverLog::outstream = NULL;
    2431
    25 ObserverLog::ObserverLog() :
    26   count (0)
     32ObserverLog::ObserverLog()
     33{
     34  nullstream = new std::ofstream("/dev/null");
     35  outstream = nullstream;
     36}
     37
     38ObserverLog::~ObserverLog()
     39{
     40  outstream = NULL;
     41  delete nullstream;
     42}
     43
     44/** Constructor of class Log.
     45 *
     46 * Log is just a tiny helper to bring the log message to screen and to the
     47 * ObserverLog's log.
     48 *
     49 * @param _callback_ref
     50 */
     51ObserverLog::Log::Log(ObserverLog *_callback_ref) :
     52    callback_ref(_callback_ref)
    2753{}
    2854
    29 ObserverLog::~ObserverLog(){}
     55/** Destructor of class Log.
     56 *
     57 * Prints to both ObserverLog::log and to ObserverLog::outstream.
     58 *
     59 */
     60ObserverLog::Log::~Log()
     61{
     62  callback_ref->log << log.str() << std::endl;
     63  *callback_ref->outstream << log.str() << std::endl;
    3064
    31 std::string ObserverLog::getLog(){return log.str();}
     65  callback_ref = NULL;
     66}
     67
     68void ObserverLog::disableLogging()
     69{
     70  outstream = nullstream;
     71}
     72
     73void ObserverLog::enableLogging()
     74{
     75  outstream = &std::cout;
     76}
     77
     78std::string ObserverLog::getLog() { return log.str(); }
    3279
    3380std::string ObserverLog::getName(void* obj){
     
    57104}
    58105
    59 std::stringstream &ObserverLog::addMessage(int depth){
     106/** Obtain Log reference to place another message (line) in log.
     107 *
     108 * \warning Don't append std::endl to the message, won't work and is done
     109 * automatically.
     110 *
     111 * @param depth depth (indenting) of the message
     112 * @return ref to Log class which can be ostreamed to
     113 */
     114boost::shared_ptr<ObserverLog::Log> ObserverLog::addMessage(int depth){
     115  boost::shared_ptr<ObserverLog::Log> L(new Log(this));
    60116  for(int i=depth;i--;)
    61     log << "  ";
    62   return log;
     117    L->log << "  ";
     118  return L;
    63119}
    64120
    65 // The log needs to exist fairly early, so we make it construct on first use,
    66 // and never destroy it
    67 ObserverLog &observerLog(){
    68   // yes, this memory is never freed... we need it around for the whole programm,
    69   // so no freeing is possible
    70   static ObserverLog *theLog = Memory::ignore(new ObserverLog());
    71   return *theLog;
     121ObserverLog &observerLog()
     122{
     123  return ObserverLog::getInstance();
    72124}
    73125
     126CONSTRUCT_SINGLETON(ObserverLog)
  • src/Patterns/Observer/ObserverLog.hpp

    r40f2e6 r2c11c1  
    1414#endif
    1515
     16#include <boost/shared_ptr.hpp>
    1617#include <map>
    1718#include <set>
     19#include <iosfwd>
     20#include <string>
    1821#include <sstream>
    19 #include <string>
    2022
    2123#include "Observable.hpp"
    2224#include "Observer.hpp"
    23 
     25#include "Singleton.hpp"
    2426
    2527/**
     
    2830 * TODO: make this conditional dependent on compiler Flag.
    2931 */
    30 class ObserverLog{
     32class ObserverLog : public Singleton<ObserverLog> {
    3133  friend class Observable;
    3234  friend class Observer;
     35  friend class Relay;
    3336  template <typename> friend class Cacheable;
     37  friend class Singleton<ObserverLog>;
    3438public:
    35   ObserverLog();
    36   ~ObserverLog();
    3739  std::string getLog();                        // get everything that has been logged
    3840  std::string getName(void*);                  // get the name of an actor
    3941  bool isObservable(void*);
     42  void disableLogging();
     43  void enableLogging();
     44
     45  /** tiny helper class to allow for both capturing and printing of messages.
     46   *
     47   */
     48  class Log {
     49  public:
     50    Log(ObserverLog *_callback_ref);
     51    ~Log();
     52
     53    std::stringstream log;                      // the internal stream that later gets appended
     54    ObserverLog *callback_ref;                  // internal stringstream to capture messages
     55  };
     56
    4057private:
     58  ObserverLog();
     59  ~ObserverLog();
    4160  int count;                                   // number to reference each actor in this framework
    4261  std::map<void*,std::string> names;           // List of names assigned to actors
     
    4665  void deleteName(void*);                      // delete the name of an Actor
    4766  void deleteObservable(void*);
    48   std::stringstream &addMessage(int depth=0);  // Add a Message to the logging
    49   std::stringstream log;                       // The internal log object
     67  boost::shared_ptr<ObserverLog::Log> addMessage(int depth=0);       // Add a Message to the logging
     68  std::stringstream log;
     69  static std::ostream *nullstream;             // stream that is not displayed
     70  static std::ostream *outstream;              // stream that is currently used
    5071};
    5172
    5273ObserverLog &observerLog();
    5374
    54 
     75template <class T>
     76boost::shared_ptr<ObserverLog::Log> operator<<(boost::shared_ptr<ObserverLog::Log> L, const T msg)
     77{
     78  L->log << msg;
     79  return L;
     80}
    5581
    5682#endif /* OBSERVERLOG_HPP_ */
  • src/Patterns/Observer/Relay.cpp

    r40f2e6 r2c11c1  
    3030#ifdef LOG_OBSERVER
    3131  observerLog().addName(this,name);
    32   observerLog().addMessage() << "++ Creating Relay " << observerLog().getName(this) << endl;
     32  observerLog().addMessage() << "++ Creating Relay " << observerLog().getName(this);
    3333#endif
    3434}
     
    4040{
    4141#ifdef LOG_OBSERVER
    42   observerLog().addMessage() << "-- Destroying Relay " << observerLog().getName(this) << endl;
     42  observerLog().addMessage() << "-- Destroying Relay " << observerLog().getName(this);
    4343#endif
    4444  if(callTable.count(this)) {
     
    7676                                   << " is relaying update from " << observerLog().getName(Updater)
    7777                                   << " to " << observerLog().getName((*iter).second)
    78                                    << " (priority=" << (*iter).first << ")"<< endl;
     78                                   << " (priority=" << (*iter).first << ")";
    7979#endif
    8080        (*iter).second->update(Updater);
  • src/Patterns/Observer/unittests/ObserverUnitTest.cpp

    r40f2e6 r2c11c1  
    3131#include "Observer/ObservedContainer.hpp"
    3232#include "Observer/ObservedContainer_impl.hpp"
     33#include "Observer/ObserverLog.hpp"
    3334
    3435#include "ObserverUnitTest.hpp"
     
    4849void ObserverTest::setUp() {
    4950  ASSERT_DO(Assert::Throw);
     51
    5052  simpleObservable1 = new SimpleObservable();
    5153  simpleObservable2 = new SimpleObservable();
     
    8486  delete notificationObserver1;
    8587  delete notificationObserver2;
     88#ifdef LOG_OBSERVER
     89  ObserverLog::purgeInstance();
     90#endif
    8691}
    8792
Note: See TracChangeset for help on using the changeset viewer.