diff options
Diffstat (limited to 'search/features_filter.cpp')
-rw-r--r-- | search/features_filter.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/search/features_filter.cpp b/search/features_filter.cpp new file mode 100644 index 0000000000..0f9912ad07 --- /dev/null +++ b/search/features_filter.cpp @@ -0,0 +1,47 @@ +#include "search/features_filter.hpp" + +#include "coding/compressed_bit_vector.hpp" + +#include "std/algorithm.hpp" + +namespace search +{ +// FeaturesFilter ---------------------------------------------------------------------------------- +FeaturesFilter::FeaturesFilter(coding::CompressedBitVector const & filter, uint32_t threshold) + : m_filter(filter), m_threshold(threshold) +{ +} + +bool FeaturesFilter::NeedToFilter(coding::CompressedBitVector const & cbv) const +{ + return cbv.PopCount() > m_threshold; +} + +// LocalityFilter ---------------------------------------------------------------------------------- +LocalityFilter::LocalityFilter(coding::CompressedBitVector const & filter) + : FeaturesFilter(filter, 0 /* threshold */) +{ +} + +unique_ptr<coding::CompressedBitVector> LocalityFilter::Filter( + coding::CompressedBitVector const & cbv) const +{ + return coding::CompressedBitVector::Intersect(m_filter, cbv); +} + +// ViewportFilter ---------------------------------------------------------------------------------- +ViewportFilter::ViewportFilter(coding::CompressedBitVector const & filter, uint32_t threshold) + : FeaturesFilter(filter, threshold) +{ +} + +unique_ptr<coding::CompressedBitVector> ViewportFilter::Filter( + coding::CompressedBitVector const & cbv) const +{ + auto result = coding::CompressedBitVector::Intersect(m_filter, cbv); + if (!coding::CompressedBitVector::IsEmpty(result)) + return result; + return cbv.LeaveFirstSetNBits(m_threshold); +} + +} // namespace search |