Bridge++  Version 1.4.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bridgeIO.cpp
Go to the documentation of this file.
1 
14 #include "bridgeIO.h"
17 
18 //====================================================================
19 // verbose output for c style
20 // default verbose level, node 0
21 
22 namespace Bridge {
23  //====================================================================
24  const std::string BridgeIO::class_name = "BridgeIO";
25 
26  //====================================================================
27  BridgeIO::BridgeIO(const std::string& filename)
28  {
29  os_ = NULL;
30 
31 #ifdef ENABLE_ILDG_TAG
32  ildg_os_ = NULL;
33 #endif
34 
35  init(filename);
36 
37 #ifdef ENABLE_ILDG_TAG
38  ildg_init(filename);
39 #endif
40  }
41 
42 
43  //====================================================================
45  {
46  tidyup_();
47  }
48 
49 
50  //====================================================================
51  void BridgeIO::init(const std::string& filename)
52  {
53  if (os_) {
54  stack_.push(os_);
55  }
56 
57  if (filename == "stdout") {
58  os_ = new std::ostream(std::cout.rdbuf());
59  } else {
60  os_ = new std::ofstream(filename.c_str());
61  }
62 
63  if (!os_) {
64  fprintf(stderr, "%s: init: unable to open log file \"%s\".\n", class_name.c_str(), filename.c_str());
65  exit(EXIT_FAILURE);
66 
67  rewind_();
68  }
69  }
70 
71 
72  //====================================================================
73  void BridgeIO::init(const std::ostream& ost)
74  {
75  if (os_) {
76  stack_.push(os_);
77  }
78 
79  os_ = new std::ostream(ost.rdbuf());
80 
81  if (!os_) {
82  fprintf(stderr, "%s: init: unable to open stream.\n", class_name.c_str());
83  exit(EXIT_FAILURE);
84 
85  rewind_();
86  }
87  }
88 
89 
90  //====================================================================
92  {
93  if (os_) delete os_;
94 
95  rewind_();
96  }
97 
98 
99  //====================================================================
101  {
102  if (stack_.size() > 0) {
103  os_ = stack_.top();
104  stack_.pop();
105  } else {
106  os_ = NULL;
107  }
108  }
109 
110 
111  //====================================================================
113  {
114  if (os_) delete os_;
115 
116  while (stack_.size() > 0)
117  {
118  std::ostream *otmp = stack_.top();
119  if (otmp) delete otmp;
120  stack_.pop();
121  }
122 
123 #ifdef ENABLE_ILDG_TAG
124  if (ildg_os_) delete ildg_os_;
125 #endif
126  }
127 
128 
129  //====================================================================
131  BridgeIO::set_verbose_level(const std::string& str)
132  {
134 
135  if ((str == "Crucial") || (str == "crucial") || (str == "CRUCIAL")) return Bridge::CRUCIAL;
136 
137  if ((str == "General") || (str == "general") || (str == "GENERAL")) return Bridge::GENERAL;
138 
139  if ((str == "Detailed") || (str == "detailed") || (str == "DETAILED")) return Bridge::DETAILED;
140 
141  if ((str == "Paranoiac") || (str == "paranoiac") || (str == "PARANOIAC")) return Bridge::PARANOIAC;
142 
143  if ((str == "NULL") || (str == "null")) return CommonParameters::Vlevel();
144 
145  // safe default
146  return Bridge::GENERAL;
147  }
148 
149 
150  //====================================================================
151  std::string
153  {
155 
156  switch (vl)
157  {
158  case Bridge::CRUCIAL:
159  return "Crucial";
160 
161  case Bridge::GENERAL:
162  return "General";
163 
164  case Bridge::DETAILED:
165  return "Detailed";
166 
167  case Bridge::PARANOIAC:
168  return "Paranoiac";
169 
170  default:
171  return "NULL";
172  }
173  }
174 
175 
176  //====================================================================
177  void
178  BridgeIO::crucial(const char *format, ...)
179  {
180  va_list arg;
181 
182 #pragma omp barrier
183 #pragma omp master
184  {
185  va_start(arg, format);
186  print(CommonParameters::Vlevel(), Bridge::CRUCIAL, 0, format, arg);
187  va_end(arg);
188  }
189 #pragma omp barrier
190  }
191 
192 
193  //====================================================================
194  void
195  BridgeIO::general(const char *format, ...)
196  {
197  va_list arg;
198 
199 #pragma omp barrier
200 #pragma omp master
201  {
202  va_start(arg, format);
203  print(CommonParameters::Vlevel(), Bridge::GENERAL, 0, format, arg);
204  va_end(arg);
205  }
206 #pragma omp barrier
207  }
208 
209 
210  //====================================================================
211  void
212  BridgeIO::detailed(const char *format, ...)
213  {
214  va_list arg;
215 
216 #pragma omp barrier
217 #pragma omp master
218  {
219  va_start(arg, format);
220  print(CommonParameters::Vlevel(), Bridge::DETAILED, 0, format, arg);
221  va_end(arg);
222  }
223 #pragma omp barrier
224  }
225 
226 
227  //====================================================================
228  void
229  BridgeIO::paranoiac(const char *format, ...)
230  {
231  va_list arg;
232 
233 #pragma omp barrier
234 #pragma omp master
235  {
236  va_start(arg, format);
238  va_end(arg);
239  }
240 #pragma omp barrier
241  }
242 
243 
244  //====================================================================
245  // input verbose level, node 0
246  void
247  BridgeIO::crucial(VerboseLevel vl, const char *format, ...)
248  {
249  va_list arg;
250 
251 #pragma omp barrier
252 #pragma omp master
253  {
254  va_start(arg, format);
255  print(vl, Bridge::CRUCIAL, 0, format, arg);
256  va_end(arg);
257  }
258 #pragma omp barrier
259  }
260 
261 
262  //====================================================================
263  void
264  BridgeIO::general(VerboseLevel vl, const char *format, ...)
265  {
266  va_list arg;
267 
268 #pragma omp barrier
269 #pragma omp master
270  {
271  va_start(arg, format);
272  print(vl, Bridge::GENERAL, 0, format, arg);
273  va_end(arg);
274  }
275 #pragma omp barrier
276  }
277 
278 
279  //====================================================================
280  void
281  BridgeIO::detailed(VerboseLevel vl, const char *format, ...)
282  {
283 #pragma omp barrier
284 #pragma omp master
285  {
286  va_list arg;
287 
288  va_start(arg, format);
289  print(vl, Bridge::DETAILED, 0, format, arg);
290  va_end(arg);
291  }
292 #pragma omp barrier
293  }
294 
295 
296  //====================================================================
297  void
298  BridgeIO::paranoiac(VerboseLevel vl, const char *format, ...)
299  {
300  va_list arg;
301 
302 #pragma omp barrier
303 #pragma omp master
304  {
305  va_start(arg, format);
306  print(vl, Bridge::PARANOIAC, 0, format, arg);
307  va_end(arg);
308  }
309 #pragma omp barrier
310  }
311 
312 
313  //====================================================================
314  // input verbose level, input node
315  void
316  BridgeIO::crucial(VerboseLevel vl, int node, const char *format, ...)
317  {
318  va_list arg;
319 
320 #pragma omp barrier
321 #pragma omp master
322  {
323  va_start(arg, format);
324  print(vl, Bridge::CRUCIAL, node, format, arg);
325  va_end(arg);
326  }
327 #pragma omp barrier
328  }
329 
330 
331  //====================================================================
332  void
333  BridgeIO::general(VerboseLevel vl, int node, const char *format, ...)
334  {
335  va_list arg;
336 
337 #pragma omp barrier
338 #pragma omp master
339  {
340  va_start(arg, format);
341  print(vl, Bridge::GENERAL, node, format, arg);
342  va_end(arg);
343  }
344 #pragma omp barrier
345  }
346 
347 
348  //====================================================================
349  void
350  BridgeIO::detailed(VerboseLevel vl, int node, const char *format, ...)
351  {
352  va_list arg;
353 
354 #pragma omp barrier
355 #pragma omp master
356  {
357  va_start(arg, format);
358  print(vl, Bridge::DETAILED, node, format, arg);
359  va_end(arg);
360  }
361 #pragma omp barrier
362  }
363 
364 
365  //====================================================================
366  void
367  BridgeIO::paranoiac(VerboseLevel vl, int node, const char *format, ...)
368  {
369  va_list arg;
370 
371 #pragma omp barrier
372 #pragma omp master
373  {
374  va_start(arg, format);
375  print(vl, Bridge::PARANOIAC, node, format, arg);
376  va_end(arg);
377  }
378 #pragma omp barrier
379  }
380 
381 
382  //====================================================================
383  std::ostream& BridgeIO::getStream()
384  {
385  return *os_;
386  }
387 
388 
389  //====================================================================
391  {
392  return os_ && *os_;
393  }
394 
395 
396  //====================================================================
397  inline
398  void
400  int node, const char *format, va_list& arg)
401  {
402  if ((write_level <= level) && (Communicator::nodeid() == node)) {
403  if (!os_) {
404  std::cerr << "ERROR: BridgeIO: no output stream." << std::endl;
405  exit(EXIT_FAILURE);
406  }
407 
408  vsprintf(buff_, format, arg);
409 
410  *os_ << buff_;
411 #ifdef DEBUG
412  *os_ << std::flush;
413 #endif
414 
415  if (!os_->good()) {
416  std::cerr << "ERROR: BridgeIO: output failed." << std::endl;
417  exit(EXIT_FAILURE);
418  }
419  }
420  }
421 
422 
423 #ifdef ENABLE_ILDG_TAG
424  //====================================================================
425  void
426  BridgeIO::ildg_init(const std::ostream& ost)
427  {
428  if (ildg_os_) delete ildg_os_;
429  ildg_os_ = new std::ostream(ost.rdbuf());
430 
431  if (!ildg_os_) {
432  fprintf(stderr, "%s: init: unable to ildg open stream.\n", class_name.c_str());
433  exit(EXIT_FAILURE);
434  }
435  }
436 
437 
438  //====================================================================
439  void
440  BridgeIO::ildg_init(const std::string& filename)
441  {
442  if (ildg_os_) delete ildg_os_;
443 
444  if (filename == "stdout") {
445  ildg_os_ = new std::ostream(std::cout.rdbuf());
446  } else {
447  ildg_os_ = new std::ofstream(filename.c_str());
448  }
449 
450  if (!ildg_os_) {
451  fprintf(stderr, "%s: init: unable to open ildg log file \"%s\".\n", class_name.c_str(), filename.c_str());
452  exit(EXIT_FAILURE);
453  }
454  }
455 
456 
457  //====================================================================
458  void
459  BridgeIO::ildg(const char *format, ...)
460  {
461  if (!ildg_os_) {
462  std::cerr << "ERROR: BridgeIO: no ildg output stream." << std::endl;
463  exit(EXIT_FAILURE);
464  }
465 
466  va_list arg;
467 
468  va_start(arg, format);
469  vsprintf(buff_, format, arg);
470  va_end(arg);
471 
472  *ildg_os_ << "@ILDG:" << buff_;
473 #ifdef DEBUG
474  *ildg_os_ << std::flush;
475 #endif
476 
477  if (!ildg_os_->good()) {
478  std::cerr << "ERROR: BridgeIO: ildg output failed." << std::endl;
479  exit(EXIT_FAILURE);
480  }
481  }
482 
483 
484  //====================================================================
485  std::ostream&
487  {
488  return *ildg_os_;
489  }
490 #endif
491  //====================================================================
492 
493 
494  //====================================================================
496 }
497 
498 //====================================================================
499 //====================================================================
BridgeIO vout
Definition: bridgeIO.cpp:495
void detailed(const char *format,...)
Definition: bridgeIO.cpp:212
void general(const char *format,...)
Definition: bridgeIO.cpp:195
virtual ~BridgeIO()
Definition: bridgeIO.cpp:44
static Bridge::VerboseLevel Vlevel()
std::ostream * ildg_os_
Definition: bridgeIO.h:129
void ildg_init(const std::ostream &os)
Definition: bridgeIO.cpp:426
void init(const std::string &filename)
Definition: bridgeIO.cpp:51
std::stack< std::ostream * > stack_
Definition: bridgeIO.h:123
void ildg(const char *format,...)
Definition: bridgeIO.cpp:459
BridgeIO(const std::string &filename="stdout")
Definition: bridgeIO.cpp:27
void paranoiac(const char *format,...)
Definition: bridgeIO.cpp:229
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
Bridge::VerboseLevel vl
Definition: checker.cpp:18
VerboseLevel
Definition: bridgeIO.h:42
std::ostream & getStream()
Definition: bridgeIO.cpp:383
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:152
void print(VerboseLevel level, VerboseLevel write_level, int node, const char *format, va_list &arg)
Definition: bridgeIO.cpp:399
static const std::string class_name
Definition: bridgeIO.h:52
char buff_[1024]
Definition: bridgeIO.h:126
static int nodeid()
alternative name for self().
Definition: communicator.h:92
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
std::ostream * os_
Definition: bridgeIO.h:120
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131
std::ostream & getILDGStream()
Definition: bridgeIO.cpp:486