diff options
author | vng <viktor.govako@gmail.com> | 2011-01-02 23:25:06 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:09:04 +0300 |
commit | d9133a2d9fd2445033d1e16b5e9c625ebd80b494 (patch) | |
tree | d99ea74eb439a89197b5a6399a1ac06143459d3a /indexer/features_vector.hpp | |
parent | b33ae08c7968744e969f9e75dcd0e8bd7a58f400 (diff) |
Add files container everywere for dat, geom, trg, idx.
Diffstat (limited to 'indexer/features_vector.hpp')
-rw-r--r-- | indexer/features_vector.hpp | 67 |
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; |