Joshua Moerman
13 years ago
7 changed files with 247 additions and 92 deletions
@ -0,0 +1,139 @@ |
|||||
|
//
|
||||
|
// Logging.hpp
|
||||
|
// AwesomeAttractorND
|
||||
|
//
|
||||
|
// Created by Joshua Moerman on 11/2/11.
|
||||
|
// Copyright 2011 Vadovas. All rights reserved.
|
||||
|
//
|
||||
|
|
||||
|
#ifndef AwesomeAttractorND_Logging_hpp |
||||
|
#define AwesomeAttractorND_Logging_hpp |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <iostream> |
||||
|
|
||||
|
#define INFORMATION __FILE__ << ":" << __LINE__ << "(" << __FUNCTION__ << ")" |
||||
|
#define COUT std::cout << INFORMATION << "\n" |
||||
|
#define CERR std::cerr << INFORMATION << "\n" |
||||
|
|
||||
|
#define VCOUT if(verbose) COUT |
||||
|
#define VCERR if(verbose) CERR |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <iostream> |
||||
|
#include <string> |
||||
|
#include <stack> |
||||
|
#include <map> |
||||
|
|
||||
|
#include <cassert> |
||||
|
|
||||
|
#include <boost/date_time/posix_time/posix_time.hpp> |
||||
|
|
||||
|
/* Usage:
|
||||
|
When timing anything: |
||||
|
Before starting the task: start("with a string"); |
||||
|
When the task is done: stop(); |
||||
|
|
||||
|
The shorthand for that is |
||||
|
{ |
||||
|
start("foo"); |
||||
|
foo(); |
||||
|
stop(); |
||||
|
} |
||||
|
|
||||
|
Note that a call to stop without parameters, stops the last started event. This works like a stack: |
||||
|
{ |
||||
|
start("Task of several small tasks"); |
||||
|
start("Small task 1"); |
||||
|
small_task_1(); |
||||
|
stop(); |
||||
|
|
||||
|
start("Small task 2"); |
||||
|
small_task_2(); |
||||
|
stop(); |
||||
|
stop(); // Stops "Task of several small tasks"
|
||||
|
} |
||||
|
The indenting is, of course, only to help you understand what's going on. |
||||
|
|
||||
|
Questions/Suggestions mail nick@astrant.net |
||||
|
*/ |
||||
|
|
||||
|
struct Logger { |
||||
|
Logger(std::ostream& logging_stream_, std::string prefix_ = std::string("")) |
||||
|
: logging_stream(&logging_stream_) |
||||
|
, prefix(prefix_) |
||||
|
{} |
||||
|
|
||||
|
void log(std::string what){ |
||||
|
*logging_stream << get_prefix() << "(" << what << ") took place at (" << boost::posix_time::microsec_clock::local_time() << std::endl; |
||||
|
} |
||||
|
|
||||
|
void start(std::string what){ |
||||
|
Event e; |
||||
|
e.start = boost::posix_time::microsec_clock::local_time(); |
||||
|
e.name = what; |
||||
|
|
||||
|
EventMap::iterator it = event_map.find(what); |
||||
|
if(it != event_map.end()){ |
||||
|
*logging_stream << get_prefix() << "WARNING: Overwriting event(" << e.name << "), did you forget to call stop()?"; |
||||
|
} else { |
||||
|
event_name_stack.push(what); |
||||
|
} |
||||
|
|
||||
|
event_map.insert(it, std::make_pair(what, e)); |
||||
|
} |
||||
|
|
||||
|
void stop() { |
||||
|
assert(!event_name_stack.empty()); |
||||
|
stop(event_name_stack.top()); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
void stop(std::string what){ |
||||
|
EventMap::iterator it = event_map.find(what); |
||||
|
if(it == event_map.end()){ |
||||
|
*logging_stream << get_prefix() << "WARNING: No such, or already stopped, event(" << what << "), did you forget to call start()?"; |
||||
|
} else { |
||||
|
it->second.end = boost::posix_time::microsec_clock::local_time(); |
||||
|
log_event(it->second); |
||||
|
event_map.erase(it); |
||||
|
} |
||||
|
|
||||
|
event_name_stack.pop(); |
||||
|
} |
||||
|
|
||||
|
struct Event { |
||||
|
boost::posix_time::ptime start; |
||||
|
boost::posix_time::ptime end; |
||||
|
std::string name; |
||||
|
}; |
||||
|
|
||||
|
// A map containing strings -> Event, used by start() and stop()
|
||||
|
typedef std::map<std::string, Event> EventMap; |
||||
|
EventMap event_map; |
||||
|
|
||||
|
// A stack used by 0-parameter stop() to stop the last start()ed event.
|
||||
|
std::stack<std::string> event_name_stack; |
||||
|
|
||||
|
std::ostream* logging_stream; |
||||
|
|
||||
|
std::string prefix; |
||||
|
|
||||
|
void log_event(Event const& e){ |
||||
|
*logging_stream << get_prefix() << "Event(" << e.name << ") started at (" << e.start << ") ended at (" << e.end << ") duration (" << e.end - e.start << " ms) " << std::endl; |
||||
|
} |
||||
|
|
||||
|
std::string get_prefix() const { |
||||
|
if(prefix == std::string("")){ |
||||
|
return prefix; |
||||
|
} else { |
||||
|
return prefix + ": "; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
#endif |
Reference in new issue