1 |
/* -*- 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 |
|