18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file cverb.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * verbose output stream
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002, 2004 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef CVERB_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define CVERB_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iosfwd>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <vector>
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct cverb_object { };
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * verbose object, all output through this stream are made only
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * if a verbose object with a true state is injected in the stream.
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern cverb_object cverb;
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * typical use:
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * declare some verbose global object:
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * verbose debug("debug");
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * verbose stats("stats");
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * verbose level2("level2");
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * setup from command line the state of these objects
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * verbose::setup(command_line_args_to'--verbose=');
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * cverb << stats << "stats\n";
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * cverb << (stats&level2) << "very verbose stats\n"
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * cverb << (stats|debug) << "bar\n";
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * these will give a compile time error
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * cverb << stats << "foo" << debug << "bar";
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * cout << stats << "foo";
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * In critical code path cverb can be used in the more efficient way:
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * if (cverb << vdebug)
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *    cverb << vdebug << "foo" << "bar";
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * the condition test the fails bit for the returned stream while the later
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * build a sentry object for each << (more efficient even with one level of <<)
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass verbose {
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// The returned stream is either a null stream or cout.
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	friend std::ostream & operator<<(cverb_object &, verbose const &);
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * create a verbose object named name, the ctor auto-register name
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * as a verbose object, the set state can be intialized through
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * verbose::setup(name)
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	verbose(char const * name);
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	verbose operator|(verbose const &);
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	verbose operator&(verbose const &);
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// Return false if this named verbose object has not be registred.
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	static bool setup(std::string const &);
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// convenient interface calling the above for string in args
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	static bool setup(std::vector<std::string> const & args);
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool set;
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * predefined general purpose verbose object, comment give their names
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern verbose vlevel1; /**< named "level1" */
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern verbose vdebug;  /**< named "debug"  */
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern verbose vstats;  /**< named "stats"  */
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd// all sample filename manipulation.
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern verbose vsfile;  /**< named "sfile" */
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddextern verbose vxml;  /**< named "xml" */
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !CVERB_H */
84