[search] Fix order for PreResult1 before reading features.

This commit is contained in:
vng 2012-02-22 16:31:08 +03:00 committed by Alex Zolotarev
parent 6eaac3c0b3
commit 16e8303a4e
2 changed files with 7 additions and 14 deletions

View file

@ -45,7 +45,7 @@ public:
static bool LessDistance(PreResult1 const & r1, PreResult1 const & r2);
static bool LessViewportDistance(PreResult1 const & r1, PreResult1 const & r2);
inline pair<uint32_t, size_t> GetID() const { return make_pair(m_featureID, m_mwmID); }
inline pair<size_t, uint32_t> GetID() const { return make_pair(m_mwmID, m_featureID); }
};

View file

@ -356,29 +356,22 @@ namespace impl
Query & m_query;
LockedFeaturesVector * m_pFV;
scoped_ptr<LockedFeaturesVector> m_pFV;
public:
PreResult2Maker(Query & q) : m_query(q), m_pFV(0)
PreResult2Maker(Query & q) : m_query(q)
{
}
~PreResult2Maker()
{
delete m_pFV;
}
// For the best performance, impl::PreResult1 should be sorted by impl::PreResult1::GetID().
impl::PreResult2 * operator() (impl::PreResult1 const & r)
{
pair<uint32_t, size_t> const id = r.GetID();
if (m_pFV == 0 || m_pFV->GetID() != id.second)
{
delete m_pFV;
m_pFV = new LockedFeaturesVector(*m_query.m_pIndex, id.second);
}
pair<size_t, uint32_t> const id = r.GetID();
if (m_pFV.get() == 0 || m_pFV->GetID() != id.first)
m_pFV.reset(new LockedFeaturesVector(*m_query.m_pIndex, id.first));
FeatureType feature;
m_pFV->m_vector.Get(id.first, feature);
m_pFV->m_vector.Get(id.second, feature);
uint32_t penalty;
string name;