iterator simplifications
Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/767ef4a7 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/767ef4a7 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/767ef4a7 Branch: refs/heads/MARMOTTA-584 Commit: 767ef4a75969d3fd3da73598466450ce6a8b7c3e Parents: 185c41a Author: Sebastian Schaffert <[email protected]> Authored: Sat Dec 19 19:03:28 2015 +0100 Committer: Sebastian Schaffert <[email protected]> Committed: Sat Dec 19 19:03:28 2015 +0100 ---------------------------------------------------------------------- .../backend/persistence/leveldb_sparql.cc | 28 ++++----------- libraries/ostrich/backend/util/iterator.h | 37 ++++++++++++++++++++ 2 files changed, 43 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/767ef4a7/libraries/ostrich/backend/persistence/leveldb_sparql.cc ---------------------------------------------------------------------- diff --git a/libraries/ostrich/backend/persistence/leveldb_sparql.cc b/libraries/ostrich/backend/persistence/leveldb_sparql.cc index 274c247..a71dc46 100644 --- a/libraries/ostrich/backend/persistence/leveldb_sparql.cc +++ b/libraries/ostrich/backend/persistence/leveldb_sparql.cc @@ -23,29 +23,14 @@ namespace sparql { using ::marmotta::sparql::StatementIterator; -class WrapProtoStatementIterator : public StatementIterator { - +class WrapProtoStatementIterator : public util::ConvertingIterator<rdf::proto::Statement, rdf::Statement> { public: - WrapProtoStatementIterator(std::unique_ptr<persistence::LevelDBPersistence::StatementIterator> it) - : it(std::move(it)) { } - - const rdf::Statement& next() override { - current_ = std::move(it->next()); - return current_; - }; + WrapProtoStatementIterator(util::CloseableIterator<rdf::proto::Statement> *it) : ConvertingIterator(it) { } - const rdf::Statement& current() const override { - return current_; + protected: + rdf::Statement convert(const rdf::proto::Statement &from) override { + return std::move(rdf::Statement(std::move(from))); }; - - bool hasNext() override { - return it->hasNext(); - } - - private: - std::unique_ptr<persistence::LevelDBPersistence::StatementIterator> it; - rdf::Statement current_; - bool parsed; }; @@ -93,9 +78,8 @@ std::unique_ptr<sparql::StatementIterator> LevelDBTripleSource::GetStatements( } return std::unique_ptr<sparql::StatementIterator>( - new WrapProtoStatementIterator(persistence->GetStatements(pattern))); + new WrapProtoStatementIterator(persistence->GetStatements(pattern).release())); } - } // namespace sparql } // namespace persistence } // namespace marmotta \ No newline at end of file http://git-wip-us.apache.org/repos/asf/marmotta/blob/767ef4a7/libraries/ostrich/backend/util/iterator.h ---------------------------------------------------------------------- diff --git a/libraries/ostrich/backend/util/iterator.h b/libraries/ostrich/backend/util/iterator.h index 8ba1497..fd29cc4 100644 --- a/libraries/ostrich/backend/util/iterator.h +++ b/libraries/ostrich/backend/util/iterator.h @@ -208,6 +208,43 @@ class FilteringIterator : public CloseableIterator<T> { }; /** + * An abstract iterator implementation supporting to convert values + * from one type to another. Subclasses must implement the convert() method. + */ +template<typename F, typename T> +class ConvertingIterator : public CloseableIterator<T> { + public: + ConvertingIterator(CloseableIterator<F>* it) : it(it) { } + + /** + * Increment iterator to next element. + */ + const T& next() override { + current_ = std::move(convert(it->next())); + return current_; + }; + + const T& current() const override { + return current_; + }; + + /** + * Return true in case the iterator has more elements. + */ + bool hasNext() override { + return it->hasNext(); + }; + + protected: + virtual T convert(const F& from) = 0; + + private: + std::unique_ptr<CloseableIterator<F>> it; + T current_; +}; + + +/** * A multi-threaded iterator supporting iteration over the results * successively added by a producer. Blocks while the internal queue * is empty and the producer is not yet finished reporting. The
