From 0fe193a38d80351d5e0e0525edfecb1e6789d5f8 Mon Sep 17 00:00:00 2001 From: Yury Melnichek Date: Tue, 7 Feb 2012 11:35:28 +0100 Subject: [PATCH] [search] Fix interjector logic. --- search/feature_offset_match.hpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/search/feature_offset_match.hpp b/search/feature_offset_match.hpp index cbac86c0de..60487330df 100644 --- a/search/feature_offset_match.hpp +++ b/search/feature_offset_match.hpp @@ -124,25 +124,31 @@ template struct OffsetIntersecter typedef unordered_set SetType; FilterT const & m_filter; - SetType m_prevSet; - SetType m_set; + scoped_ptr m_prevSet; + scoped_ptr m_set; bool m_bFirstStep; explicit OffsetIntersecter(FilterT const & filter) - : m_filter(filter), m_bFirstStep(true) {} + : m_filter(filter), m_bFirstStep(true), m_set(new SetType()) {} void operator() (uint32_t offset) { + if (m_prevSet && !m_prevSet->count(offset)) + return; + if (!m_filter(offset)) return; - m_set.insert(offset); + m_set->insert(offset); } void NextStep() { + if (!m_prevSet) + m_prevSet.reset(new SetType()); + m_prevSet.swap(m_set); - m_set.clear(); + m_set->clear(); m_bFirstStep = false; } }; @@ -178,7 +184,7 @@ void MatchFeaturesInTrie(vector > const & tokens, } typedef typename impl::OffsetIntersecter::SetType::const_iterator IT; - for (IT it = intersecter.m_prevSet.begin(); it != intersecter.m_prevSet.end(); ++it) + for (IT it = intersecter.m_prevSet->begin(); it != intersecter.m_prevSet->end(); ++it) toDo(*it); }