File size: 2,473 Bytes
99f07cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "OutputCollector.h"

namespace Moses2
{
OutputCollector::OutputCollector(std::ostream* outStream,
  std::ostream* debugStream) :
  m_nextOutput(0), m_outStream(outStream), m_debugStream(debugStream), m_isHoldingOutputStream(
    false), m_isHoldingDebugStream(false) {
}

OutputCollector::OutputCollector(std::string xout, std::string xerr) :
  m_nextOutput(0) {
  // TO DO open magic streams instead of regular ofstreams! [UG]

  if (xout == "/dev/stderr") {
    m_outStream = &std::cerr;
    m_isHoldingOutputStream = false;
  }
  else if (xout.size() && xout != "/dev/stdout" && xout != "-") {
    m_outStream = new std::ofstream(xout.c_str());
    UTIL_THROW_IF2(!m_outStream->good(),
      "Failed to open output file" << xout);
    m_isHoldingOutputStream = true;
  }
  else {
    m_outStream = &std::cout;
    m_isHoldingOutputStream = false;
  }

  if (xerr == "/dev/stdout") {
    m_debugStream = &std::cout;
    m_isHoldingDebugStream = false;
  }
  else if (xerr.size() && xerr != "/dev/stderr") {
    m_debugStream = new std::ofstream(xerr.c_str());
    UTIL_THROW_IF2(!m_debugStream->good(),
      "Failed to open debug stream" << xerr);
    m_isHoldingDebugStream = true;
  }
  else {
    m_debugStream = &std::cerr;
    m_isHoldingDebugStream = false;
  }
}

OutputCollector::~OutputCollector() {
if (m_isHoldingOutputStream) delete m_outStream;
if (m_isHoldingDebugStream) delete m_debugStream;
}


void OutputCollector::Write(int sourceId, const std::string& output, const std::string& debug) {
#ifdef WITH_THREADS
  boost::mutex::scoped_lock lock(m_mutex);
#endif
  if (sourceId == m_nextOutput) {
    //This is the one we were expecting
    *m_outStream << output << std::flush;
    *m_debugStream << debug << std::flush;
    ++m_nextOutput;
    //see if there's any more
    std::unordered_map<int, std::string>::iterator iter;
    while ((iter = m_outputs.find(m_nextOutput)) != m_outputs.end()) {
      *m_outStream << iter->second << std::flush;
      ++m_nextOutput;
      std::unordered_map<int, std::string>::iterator debugIter = m_debugs.find(
        iter->first);
      m_outputs.erase(iter);
      if (debugIter != m_debugs.end()) {
        *m_debugStream << debugIter->second << std::flush;
        m_debugs.erase(debugIter);
      }
    }
  }
  else {
    //save for later
    m_outputs[sourceId] = output;
    m_debugs[sourceId] = debug;
  }
}

}