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 <boost/functional/hash.hpp>
00027 #include "TypeDef.h"
00028 #include "Util.h"
00029 #include "util/exception.hh"
00030
00031 #ifdef WIN32
00032 #undef max
00033 #endif
00034
00035 namespace Moses
00036 {
00037
00038
00039
00040
00041 class WordsRange
00042 {
00043 friend std::ostream& operator << (std::ostream& out, const WordsRange& range);
00044
00045
00046 size_t m_startPos, m_endPos;
00047 public:
00048 inline WordsRange(size_t startPos, size_t endPos) : m_startPos(startPos), m_endPos(endPos) {}
00049 inline WordsRange(const WordsRange ©)
00050 : m_startPos(copy.GetStartPos())
00051 , m_endPos(copy.GetEndPos()) {
00052 }
00053
00054 inline size_t GetStartPos() const {
00055 return m_startPos;
00056 }
00057 inline size_t GetEndPos() const {
00058 return m_endPos;
00059 }
00060
00062 inline size_t GetNumWordsCovered() const {
00063 return (m_startPos == NOT_FOUND) ? 0 : m_endPos - m_startPos + 1;
00064 }
00065
00067 inline bool operator<(const WordsRange& x) const {
00068 return (m_startPos<x.m_startPos
00069 || (m_startPos==x.m_startPos && m_endPos<x.m_endPos));
00070 }
00071
00072
00073 inline bool operator==(const WordsRange& x) const {
00074 return (m_startPos==x.m_startPos && m_endPos==x.m_endPos);
00075 }
00076
00077 inline bool Overlap(const WordsRange& x) const {
00078
00079 if ( x.m_endPos < m_startPos || x.m_startPos > m_endPos) return false;
00080
00081 return true;
00082 }
00083
00084 inline size_t GetNumWordsBetween(const WordsRange& x) const {
00085 UTIL_THROW_IF2(Overlap(x), "Overlapping ranges");
00086
00087 if (x.m_endPos < m_startPos) {
00088 return m_startPos - x.m_endPos - 1;
00089 }
00090
00091 return x.m_startPos - m_endPos - 1;
00092 }
00093
00094
00095 TO_STRING();
00096 };
00097
00098 inline size_t hash_value(const WordsRange& range)
00099 {
00100 size_t seed = range.GetStartPos();
00101 boost::hash_combine(seed, range.GetEndPos());
00102 return seed;
00103 }
00104
00105 }
00106 #endif