
On Sun, Mar 02, 2008 at 04:17:46AM +0200, John Torjo wrote:
Hi Roland,
Surprisingly I was not able to find on the net code that would give me a smart way to indent a stream. So I wrote a little filter based on the boost iostreams library.
This looks pretty cool. One question : do you intend to use this for more than logging?
I'm asking because Boost Logging v3 will certainly include such a feature.
I used with a Boost.Logging v1 wrapper: namespace { static int logIndentLevel = 0; void prepend_spaces(const boost::logging::logging_types::string &/*log_name*/, boost::logging::logging_types::string & msg) { msg = " " + msg; } } void logging::addLogIndention() { std::ostringstream str; ++logIndentLevel; str << "indentation" << logIndentLevel; using namespace boost::logging; // flush all old messages with previous modifier flush_log_cache(); add_modifier("*", &prepend_spaces, str.str(), DEFAULT_INDEX+5); } void logging::restoreLogIndention() { std::ostringstream str; str << "indentation" << logIndentLevel; --logIndentLevel; ASSERT(logIndentLevel>=0); using namespace boost::logging; // the modifier will be changed soon, sync! flush_log_cache(); del_modifier("*", str.str()); } Both addLogIndention() and restoreLogIndention() are also called in the constructor/destructor of a helper class to ensure a proper reset. Very simple ... Jens