00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef moses_WordsRange_h
00023 #define moses_WordsRange_h
00024
00025 #include <iostream>
00026 #include "TypeDef.h"
00027 #include "Util.h"
00028
00029 namespace Moses
00030 {
00031
00032
00033
00034
00035 class WordsRange
00036 {
00037 friend std::ostream& operator << (std::ostream& out, const WordsRange& range);
00038
00039 size_t m_startPos, m_endPos;
00040 public:
00041 inline WordsRange(size_t startPos, size_t endPos) : m_startPos(startPos), m_endPos(endPos) {}
00042 inline WordsRange(const WordsRange ©)
00043 : m_startPos(copy.GetStartPos())
00044 , m_endPos(copy.GetEndPos())
00045 {}
00046
00047 inline size_t GetStartPos() const {
00048 return m_startPos;
00049 }
00050 inline size_t GetEndPos() const {
00051 return m_endPos;
00052 }
00053
00055 inline size_t GetNumWordsCovered() const {
00056 return (m_startPos == NOT_FOUND) ? 0 : m_endPos - m_startPos + 1;
00057 }
00058
00060 inline bool operator<(const WordsRange& x) const {
00061 return (m_startPos<x.m_startPos
00062 || (m_startPos==x.m_startPos && m_endPos<x.m_endPos));
00063 }
00064
00065
00066 inline bool operator==(const WordsRange& x) const {
00067 return (m_startPos==x.m_startPos && m_endPos==x.m_endPos);
00068 }
00069
00070 inline bool Overlap(const WordsRange& x) const {
00071
00072 if ( x.m_endPos < m_startPos || x.m_startPos > m_endPos) return false;
00073
00074 return true;
00075 }
00076
00077 inline size_t GetNumWordsBetween(const WordsRange& x) const {
00078 CHECK(!Overlap(x));
00079
00080 if (x.m_endPos < m_startPos) {
00081 return m_startPos - x.m_endPos;
00082 }
00083
00084 return x.m_startPos - m_endPos;
00085 }
00086
00087
00088 TO_STRING();
00089 };
00090
00091
00092 }
00093 #endif