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-01-02 23:25:06 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:09:04 +0300
commitd9133a2d9fd2445033d1e16b5e9c625ebd80b494 (patch)
treed99ea74eb439a89197b5a6399a1ac06143459d3a /indexer/features_vector.hpp
parentb33ae08c7968744e969f9e75dcd0e8bd7a58f400 (diff)
Add files container everywere for dat, geom, trg, idx.
Diffstat (limited to 'indexer/features_vector.hpp')
-rw-r--r--indexer/features_vector.hpp67
1 files changed, 48 insertions, 19 deletions
diff --git a/indexer/features_vector.hpp b/indexer/features_vector.hpp
index 0721366a03..d1612b5fa6 100644
--- a/indexer/features_vector.hpp
+++ b/indexer/features_vector.hpp
@@ -1,12 +1,31 @@
#pragma once
-#include "../indexer/feature.hpp"
+#include "feature.hpp"
+#include "data_header_reader.hpp"
+
+#include "../storage/defines.hpp"
#include "../coding/var_record_reader.hpp"
#include "../base/base.hpp"
-#include "../std/bind.hpp"
+//#include "../std/bind.hpp"
+
+template <class ReaderT>
+struct FeatureReaders
+{
+ ReaderT m_datR, m_geomR, m_trgR;
+
+ template <class ContainerT>
+ FeatureReaders(ContainerT const & cont)
+ : m_datR(cont.GetReader(DATA_FILE_TAG)),
+ m_geomR(cont.GetReader(GEOMETRY_FILE_TAG)),
+ m_trgR(cont.GetReader(TRIANGLE_FILE_TAG))
+ {
+ uint64_t const offset = feature::GetSkipHeaderSize(m_datR);
+ m_datR = m_datR.SubReader(offset, m_datR.Size() - offset);
+ }
+};
template <typename ReaderT>
class FeaturesVector
@@ -14,8 +33,8 @@ class FeaturesVector
public:
typedef ReaderT ReaderType;
- explicit FeaturesVector(ReaderT const & reader)
- : m_RecordReader(reader, 256), m_source(reader.GetName())
+ FeaturesVector(FeatureReaders<ReaderT> const & dataR)
+ : m_RecordReader(dataR.m_datR, 256), m_source(dataR.m_geomR, dataR.m_trgR)
{
}
@@ -25,19 +44,17 @@ public:
feature.Deserialize(m_source);
}
- template <class TDo> void ForEachOffset(TDo const & toDo) const
+ template <class ToDo> void ForEachOffset(ToDo toDo) const
{
- FeatureType f;
- m_RecordReader.ForEachRecord(
- bind<void>(toDo, bind(&FeaturesVector<ReaderT>::DeserializeFeature, this, _2, _3, &f), _1));
+ m_RecordReader.ForEachRecord(feature_getter<ToDo>(toDo, m_source));
}
- template <class TDo> void ForEach(TDo const & toDo) const
- {
- FeatureType f;
- m_RecordReader.ForEachRecord(
- bind<void>(toDo, bind(&FeaturesVector<ReaderT>::DeserializeFeature, this, _2, _3, &f)));
- }
+ //template <class TDo> void ForEach(TDo const & toDo) const
+ //{
+ // FeatureType f;
+ // m_RecordReader.ForEachRecord(
+ // bind<void>(toDo, bind(&FeaturesVector<ReaderT>::DeserializeFeature, this, _2, _3, &f)));
+ //}
bool IsMyData(string const & fName) const
{
@@ -45,12 +62,24 @@ public:
}
private:
- FeatureType const & DeserializeFeature(char const * data, uint32_t size, FeatureType * pFeature) const
+ template <class ToDo> class feature_getter
{
- m_source.assign(data, size);
- pFeature->Deserialize(m_source);
- return *pFeature;
- }
+ ToDo & m_toDo;
+ FeatureType::read_source_t & m_source;
+
+ public:
+ feature_getter(ToDo & toDo, FeatureType::read_source_t & src)
+ : m_toDo(toDo), m_source(src)
+ {
+ }
+ void operator() (uint32_t pos, char const * data, uint32_t size) const
+ {
+ FeatureType f;
+ m_source.assign(data, size);
+ f.Deserialize(m_source);
+ m_toDo(f, pos);
+ }
+ };
VarRecordReader<ReaderT, &VarRecordSizeReaderVarint> m_RecordReader;
mutable FeatureType::read_source_t m_source;