|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once |
|
|
|
|
|
#include <cassert> |
|
|
#include <iostream> |
|
|
#include <boost/functional/hash.hpp> |
|
|
#include "Util2.h" |
|
|
#include "util/exception.hh" |
|
|
|
|
|
#ifdef WIN32 |
|
|
#undef max |
|
|
#endif |
|
|
|
|
|
namespace Moses2 |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Range |
|
|
{ |
|
|
friend std::ostream& operator <<(std::ostream& out, const Range& range); |
|
|
|
|
|
|
|
|
size_t m_startPos, m_endPos; |
|
|
public: |
|
|
inline explicit Range() { |
|
|
} |
|
|
inline Range(size_t startPos, size_t endPos) : |
|
|
m_startPos(startPos), m_endPos(endPos) { |
|
|
} |
|
|
inline Range(const Range ©) : |
|
|
m_startPos(copy.GetStartPos()), m_endPos(copy.GetEndPos()) { |
|
|
} |
|
|
|
|
|
inline size_t GetStartPos() const { |
|
|
return m_startPos; |
|
|
} |
|
|
inline size_t GetEndPos() const { |
|
|
return m_endPos; |
|
|
} |
|
|
|
|
|
inline void SetStartPos(size_t val) { |
|
|
m_startPos = val; |
|
|
} |
|
|
inline void SetEndPos(size_t val) { |
|
|
m_endPos = val; |
|
|
} |
|
|
|
|
|
|
|
|
inline size_t GetNumWordsCovered() const { |
|
|
assert( |
|
|
(m_startPos == NOT_FOUND && m_endPos == NOT_FOUND) || (m_startPos != NOT_FOUND && m_endPos != NOT_FOUND)); |
|
|
return (m_startPos == NOT_FOUND) ? 0 : m_endPos - m_startPos + 1; |
|
|
} |
|
|
|
|
|
|
|
|
inline bool operator<(const Range& x) const { |
|
|
return (m_startPos<x.m_startPos |
|
|
|| (m_startPos==x.m_startPos && m_endPos<x.m_endPos)); |
|
|
} |
|
|
|
|
|
|
|
|
inline bool operator==(const Range& x) const { |
|
|
return (m_startPos==x.m_startPos && m_endPos==x.m_endPos); |
|
|
} |
|
|
|
|
|
inline bool Overlap(const Range& x) const { |
|
|
|
|
|
if ( x.m_endPos < m_startPos || x.m_startPos > m_endPos) return false; |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
inline size_t GetNumWordsBetween(const Range& x) const { |
|
|
UTIL_THROW_IF2(Overlap(x), "Overlapping ranges"); |
|
|
|
|
|
if (x.m_endPos < m_startPos) { |
|
|
return m_startPos - x.m_endPos - 1; |
|
|
} |
|
|
|
|
|
return x.m_startPos - m_endPos - 1; |
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
inline size_t hash_value(const Range& range) |
|
|
{ |
|
|
size_t seed = range.GetStartPos(); |
|
|
boost::hash_combine(seed, range.GetEndPos()); |
|
|
return seed; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|