00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <iostream>
00020
00021 #include "util/file_piece.hh"
00022 #include "util/tokenize_piece.hh"
00023
00024 #include "ScoreArray.h"
00025 #include "ScoreDataIterator.h"
00026
00027 using namespace std;
00028 using namespace util;
00029
00030 namespace MosesTuning
00031 {
00032
00033
00034 ScoreDataIterator::ScoreDataIterator() {}
00035
00036 ScoreDataIterator::ScoreDataIterator(const string& filename)
00037 {
00038 m_in.reset(new FilePiece(filename.c_str()));
00039 readNext();
00040 }
00041
00042 ScoreDataIterator::~ScoreDataIterator() {}
00043
00044 void ScoreDataIterator::readNext()
00045 {
00046 m_next.clear();
00047 try {
00048 StringPiece marker = m_in->ReadDelimited();
00049 if (marker != StringPiece(SCORES_TXT_BEGIN)) {
00050 throw FileFormatException(m_in->FileName(), marker.as_string());
00051 }
00052
00053 m_in->ReadULong();
00054 size_t count = m_in->ReadULong();
00055 size_t length = m_in->ReadULong();
00056 m_in->ReadLine();
00057 for (size_t i = 0; i < count; ++i) {
00058 StringPiece line = m_in->ReadLine();
00059 m_next.push_back(ScoreDataItem());
00060 for (TokenIter<AnyCharacter, true> token(line,AnyCharacter(" \t")); token; ++token) {
00061 float value = ParseFloat(*token);
00062 m_next.back().push_back(value);
00063 }
00064 if (length != m_next.back().size()) {
00065 throw FileFormatException(m_in->FileName(), line.as_string());
00066 }
00067 }
00068 StringPiece line = m_in->ReadLine();
00069 if (line != StringPiece(SCORES_TXT_END)) {
00070 throw FileFormatException(m_in->FileName(), line.as_string());
00071 }
00072 } catch (EndOfFileException& e) {
00073 m_in.reset();
00074 }
00075 }
00076
00077 void ScoreDataIterator::increment()
00078 {
00079 readNext();
00080 }
00081
00082
00083 bool ScoreDataIterator::equal(const ScoreDataIterator& rhs) const
00084 {
00085 if (!m_in && !rhs.m_in) {
00086 return true;
00087 } else if (!m_in) {
00088 return false;
00089 } else if (!rhs.m_in) {
00090 return false;
00091 } else {
00092 return m_in->FileName() == rhs.m_in->FileName() &&
00093 m_in->Offset() == rhs.m_in->Offset();
00094 }
00095 }
00096
00097
00098 const vector<ScoreDataItem>& ScoreDataIterator::dereference() const
00099 {
00100 return m_next;
00101 }
00102
00103 }
00104