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

Reply via email to