|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <boost/functional/hash.hpp> |
|
|
#include "Bitmap.h" |
|
|
|
|
|
namespace Moses2 |
|
|
{ |
|
|
|
|
|
Bitmap::Bitmap(MemPool &pool, size_t size) : |
|
|
m_bitmap(pool, size) |
|
|
{ |
|
|
} |
|
|
|
|
|
void Bitmap::Init(const std::vector<bool>& initializer) |
|
|
{ |
|
|
|
|
|
for (size_t i = 0; i < initializer.size(); ++i) { |
|
|
m_bitmap[i] = initializer[i]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = initializer.size(); i < m_bitmap.size(); ++i) { |
|
|
m_bitmap[i] = false; |
|
|
} |
|
|
|
|
|
m_numWordsCovered = std::count(m_bitmap.begin(), m_bitmap.end(), true); |
|
|
|
|
|
|
|
|
Array<char>::const_iterator first_gap = std::find(m_bitmap.begin(), |
|
|
m_bitmap.end(), false); |
|
|
m_firstGap = ((first_gap == m_bitmap.end()) ? |
|
|
NOT_FOUND: first_gap - m_bitmap.begin()); |
|
|
} |
|
|
|
|
|
void Bitmap::Init(const Bitmap ©, const Range &range) |
|
|
{ |
|
|
m_firstGap = copy.m_firstGap; |
|
|
m_numWordsCovered = copy.m_numWordsCovered; |
|
|
for (size_t i = 0; i < m_bitmap.size(); ++i) { |
|
|
m_bitmap[i] = copy.m_bitmap[i]; |
|
|
} |
|
|
SetValueNonOverlap(range); |
|
|
} |
|
|
|
|
|
|
|
|
size_t Bitmap::hash() const |
|
|
{ |
|
|
size_t ret = m_bitmap.hash(); |
|
|
return ret; |
|
|
} |
|
|
|
|
|
bool Bitmap::operator==(const Bitmap& other) const |
|
|
{ |
|
|
return m_bitmap == other.m_bitmap; |
|
|
} |
|
|
|
|
|
|
|
|
std::ostream& operator<<(std::ostream& out, const Bitmap& bitmap) |
|
|
{ |
|
|
for (size_t i = 0; i < bitmap.m_bitmap.size(); i++) { |
|
|
out << int(bitmap.GetValue(i)); |
|
|
} |
|
|
return out; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|