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