Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2011-08-25 12:53:47 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:22:22 +0300
commit91909c81267e3b38e95005923a7b7a98d72a0d79 (patch)
treee35dd1f440700ac307d6f89286f26915d24224bf /indexer/scale_index.hpp
parentcd7d41afd362028fb1d29a5f6e35a8365096370c (diff)
[Support Old Format] Add polymorphic index usage.
Diffstat (limited to 'indexer/scale_index.hpp')
-rw-r--r--indexer/scale_index.hpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/indexer/scale_index.hpp b/indexer/scale_index.hpp
index b51c844836..ecbc4f0df5 100644
--- a/indexer/scale_index.hpp
+++ b/indexer/scale_index.hpp
@@ -1,11 +1,18 @@
#pragma once
-#include "interval_index.hpp"
+#include "data_factory.hpp"
+#include "interval_index_iface.hpp"
+
#include "../coding/var_serial_vector.hpp"
+
#include "../base/assert.hpp"
#include "../base/base.hpp"
#include "../base/macros.hpp"
+#include "../base/stl_add.hpp"
+
#include "../std/algorithm.hpp"
+#include "../std/bind.hpp"
+
class ScaleIndexBase
{
@@ -55,20 +62,32 @@ class ScaleIndex : public ScaleIndexBase
{
public:
typedef ReaderT ReaderType;
- typedef IntervalIndex<ReaderT> IntervalIndexType;
- typedef typename IntervalIndexType::Query Query;
+ typedef typename IntervalIndexIFace::QueryIFace Query;
ScaleIndex() {}
- explicit ScaleIndex(ReaderT const & reader) { Attach(reader); }
+ explicit ScaleIndex(ReaderT const & reader, IndexFactory & factory)
+ {
+ Attach(reader, factory);
+ }
+ ~ScaleIndex()
+ {
+ Clear();
+ }
- void Attach(ReaderT const & reader)
+ void Clear()
{
+ for_each(m_IndexForScale.begin(), m_IndexForScale.end(), DeleteFunctor());
m_IndexForScale.clear();
+ }
+
+ void Attach(ReaderT const & reader, IndexFactory & factory)
+ {
+ Clear();
ReaderSource<ReaderT> source(reader);
VarSerialVectorReader<ReaderT> treesReader(source);
for (size_t i = 0; i < treesReader.Size(); ++i)
- m_IndexForScale.push_back(IntervalIndexType(treesReader.SubReader(i)));
+ m_IndexForScale.push_back(factory.CreateIndex(treesReader.SubReader(i)));
}
template <typename F>
@@ -78,9 +97,9 @@ public:
size_t const scaleBucket = BucketByScale(scale);
if (scaleBucket < m_IndexForScale.size())
for (size_t i = 0; i <= scaleBucket; ++i)
- m_IndexForScale[i].ForEach(f, beg, end, query);
+ m_IndexForScale[i]->DoForEach(bind<void>(ref(f), _1), beg, end, query);
}
private:
- vector<IntervalIndexType> m_IndexForScale;
+ vector<IntervalIndexIFace *> m_IndexForScale;
};