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