ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/utils/Report.hpp
Revision: 1492
Committed: Mon Aug 16 18:07:50 2010 UTC (14 years, 8 months ago) by chuckv
File size: 7846 byte(s)
Log Message:
Adding exception and reporting mechanism from ProtoMol to OpenMD.

File Contents

# User Rev Content
1 chuckv 1492 /* -*- c++ -*- */
2     #ifndef UTILS_REPORT_H
3     #define UTILS_REPORT_H
4    
5     #include <iostream>
6     #include <string>
7     using std::cerr;
8    
9     namespace OpenMD {
10     //________________________________________________________ Report
11     namespace Report {
12     class MyStreamer;
13    
14     //_________________________________________ debug
15     /**
16     Manipulator of MyStreamer, to print out debug
17     information with different report level importance, where
18     1, pretty important, 10 really unimportant.
19     */
20     class debug {
21     public:
22     debug() : myLevel(1) {}
23     debug(short l) : myLevel(l) {}
24     MyStreamer &operator()(MyStreamer &stream) const;
25     private:
26     short myLevel;
27     };
28    
29     //_________________________________________ reportlevel
30     /**
31     reportlevel sets the maximal level of report, if less
32     than 1 all debug information is suppressed.
33     */
34     class reportlevel {
35     public:
36     reportlevel() : myReportlevel(0) {}
37     reportlevel(short l) : myReportlevel(l) {}
38     MyStreamer &operator()(MyStreamer &stream) const;
39     private:
40     short myReportlevel;
41     };
42    
43     //_________________________________________ MyStreamer
44     /**
45     MyStreamer wraps the output to a given stream and provides different
46     manipulators a la std::cout and std::cerr. report is a global instance
47     of MyStreamer and acts as std::cout and std::cerr. In parallel
48     environment, by default, only output from the master is passed to the
49     actual stream. One can also pipe the putput to a file.
50     @n
51     It handles different report levels. Production code will by default
52     suppress all debug output (print if level <= 0, reportlevel=0), where as
53     debug compilation will by default print all information with level <= 1,
54     reportlevel=1.
55     @n
56     NB! Do not put debug(<int>) inside forces, ok if it is inside
57     initialization, otherwise use a type from oneAtomContraints.h to
58     debug pair wise potentials @n @n
59    
60     report << debug(1) << "This is only debug inforamtion" << endr @n
61    
62     report << quit << plain << "Well, this storys gonna end soon ... "
63     << endr @n @n
64    
65     - plain : -4
66     - error : -3
67     - recoverable : -2
68     - warning : -1
69     - hint : 0
70     - debug(1) : 1 important debug information
71     - debug(2) : 2 less important
72     - debug(10) : 10 really not important
73     - aborting : does an abort (MPI_Abort)
74     - quit : does an exit (MPI_Finalize)
75     - endr : end of report/MyStreamer output
76     - allnodesserial : output synchronized node by node including the
77     master
78     - allslavesserial : output synchronized node by node, only slaves
79     - allnodes : output unsynchronized from all nodes
80     - donthint : suppress all hint output
81     - dohint : enable hint output
82     */
83     class MyStreamer {
84     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
85     // Constructors, destructors, assignment
86     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
87     public:
88     MyStreamer(std::ostream *);
89    
90     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
91     // New methods of class MyStreamer
92     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
93     std::ostream *setStream(std::ostream *);
94     void setAbort(bool);
95     void setQuit(bool);
96     void setAllNodes(bool);
97     void setReportLevel(short level) {myReportLevel = level;}
98     void setLevel(short level) {myLevel = level;}
99     void setIAmMaster(bool master) {myIAmMaster = master;}
100    
101     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
102     // New methods of class MyStreamer
103     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104     void setf(std::ios::fmtflags flag);
105     void setf(std::ios::fmtflags flag, std::ios::fmtflags mask);
106     void precision(int prec);
107     void width(int wide);
108     void reset();
109    
110     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111     // New methods of class MyStreamer
112     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
113     MyStreamer &operator<<(bool);
114     MyStreamer &operator<<(char);
115     MyStreamer &operator<<(unsigned char);
116     MyStreamer &operator<<(signed char);
117     MyStreamer &operator<<(char *);
118     MyStreamer &operator<<(const char *);
119     MyStreamer &operator<<(unsigned char *);
120     MyStreamer &operator<<(signed char *);
121     MyStreamer &operator<<(short);
122     MyStreamer &operator<<(unsigned short);
123     MyStreamer &operator<<(int);
124     MyStreamer &operator<<(unsigned int);
125     MyStreamer &operator<<(long long);
126     MyStreamer &operator<<(unsigned long long);
127     MyStreamer &operator<<(long);
128     MyStreamer &operator<<(unsigned long);
129     MyStreamer &operator<<(float);
130     MyStreamer &operator<<(double);
131     MyStreamer &operator<<(const std::string &);
132     MyStreamer &operator<<(const std::ostream &);
133     MyStreamer &operator<<(std::ostream *);
134     MyStreamer &operator<<(std::ostream &(*f)(std::ostream &));
135     MyStreamer &operator<<(std::ios &(*f)(std::ios &));
136     MyStreamer &operator<<(MyStreamer &(*f)(MyStreamer &));
137    
138     friend MyStreamer &allnodes(MyStreamer &stream);
139     friend MyStreamer &plain(MyStreamer &stream);
140     friend MyStreamer &hint(MyStreamer &stream);
141     friend MyStreamer &quit(MyStreamer &stream);
142     friend MyStreamer &aborting(MyStreamer &stream);
143     friend MyStreamer &warning(MyStreamer &stream);
144     friend MyStreamer &recoverable(MyStreamer &stream);
145     friend MyStreamer &error(MyStreamer &stream);
146     friend MyStreamer &allnodesserial(MyStreamer &stream);
147     friend MyStreamer &allslavesserial(MyStreamer &stream);
148     friend MyStreamer &endr(MyStreamer &stream);
149     friend MyStreamer &dohint(MyStreamer &stream);
150     friend MyStreamer &donthint(MyStreamer &stream);
151    
152     private:
153     bool print() const {
154     return mySilentHint < 1 && myLevel <= myReportLevel &&
155     (myAllNodes || myIAmMaster);
156     }
157    
158     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
159     // My data members
160     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
161     private:
162     std::ostream *myStream;
163     std::ios::fmtflags myResetFlags; // Resest/default flags
164     bool myAbort;
165     bool myQuit;
166     bool myAllNodes;
167     bool myAllNodesSerial;
168     bool myAllSlavesSerial;
169     bool myIAmMaster;
170     bool myDoHint;
171     short mySilentHint;
172     short myReportLevel;
173     short myLevel;
174     };
175    
176     /// Plain output
177     MyStreamer &plain(MyStreamer &stream);
178     /// Error, abort
179     MyStreamer &error(MyStreamer &stream);
180     /// Recoverable error
181     MyStreamer &recoverable(MyStreamer &stream);
182     /// Warning
183     MyStreamer &warning(MyStreamer &stream);
184     /// Hint, can be suppressed by donthint/dohint
185     MyStreamer &hint(MyStreamer &stream);
186    
187     MyStreamer &allnodes(MyStreamer &stream);
188     MyStreamer &quit(MyStreamer &stream);
189     MyStreamer &aborting(MyStreamer &stream);
190     MyStreamer &allnodesserial(MyStreamer &stream);
191     MyStreamer &allslavesserial(MyStreamer &stream);
192     MyStreamer &endr(MyStreamer &stream);
193     MyStreamer &dohint(MyStreamer &stream);
194     MyStreamer &donthint(MyStreamer &stream);
195    
196     MyStreamer &operator<<(MyStreamer &stream, const reportlevel &rl);
197     MyStreamer &operator<<(MyStreamer &stream, const debug &d);
198    
199     // Our global streamer
200     extern MyStreamer report;
201     //static MyStreamer report = &cerr;
202     }
203     }
204     #endif /* REPORT_H */
205