diff options
author | Hieu Hoang <hieuhoang@gmail.com> | 2015-10-25 16:37:59 +0300 |
---|---|---|
committer | Hieu Hoang <hieuhoang@gmail.com> | 2015-10-25 16:37:59 +0300 |
commit | 97b2aa5663e97079145fb494bf97e1b2997b4161 (patch) | |
tree | f8a68fa4ea40bb99c21cd26e7f02a27ddcc48187 /moses/Range.h | |
parent | 84b1c4b4c0c02362cdb35b55e08196d03b993baf (diff) |
WordsRange -> Range
Diffstat (limited to 'moses/Range.h')
-rw-r--r-- | moses/Range.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/moses/Range.h b/moses/Range.h new file mode 100644 index 000000000..52a201005 --- /dev/null +++ b/moses/Range.h @@ -0,0 +1,106 @@ +// $Id$ + +/*********************************************************************** +Moses - factored phrase-based language decoder +Copyright (C) 2006 University of Edinburgh + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +***********************************************************************/ + +#ifndef moses_WordsRange_h +#define moses_WordsRange_h + +#include <iostream> +#include <boost/functional/hash.hpp> +#include "TypeDef.h" +#include "Util.h" +#include "util/exception.hh" + +#ifdef WIN32 +#undef max +#endif + +namespace Moses +{ + +/*** + * Efficient version of Bitmap for contiguous ranges + */ +class Range +{ + friend std::ostream& operator << (std::ostream& out, const Range& range); + + // m_endPos is inclusive + size_t m_startPos, m_endPos; +public: + 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; + } + + //! count of words translated + inline size_t GetNumWordsCovered() const { + return (m_startPos == NOT_FOUND) ? 0 : m_endPos - m_startPos + 1; + } + + //! transitive comparison + inline bool operator<(const Range& x) const { + return (m_startPos<x.m_startPos + || (m_startPos==x.m_startPos && m_endPos<x.m_endPos)); + } + + // equality operator + inline bool operator==(const Range& x) const { + return (m_startPos==x.m_startPos && m_endPos==x.m_endPos); + } + // Whether two word ranges overlap or not + 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; + } + + + TO_STRING(); +}; + +inline size_t hash_value(const Range& range) +{ + size_t seed = range.GetStartPos(); + boost::hash_combine(seed, range.GetEndPos()); + return seed; +} + +} +#endif |