summaryrefslogtreecommitdiffstats
path: root/common/resultset.h
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-06-17 00:57:24 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-06-17 00:57:24 +0200
commit4eb94786232aee936cd6371824764705c9359538 (patch)
treec5347ae86c4088676f78d59d647c9a30e636b53b /common/resultset.h
parent7819a02582fea02cd6da56aa4526492d281df07a (diff)
downloadsink-4eb94786232aee936cd6371824764705c9359538.tar.gz
sink-4eb94786232aee936cd6371824764705c9359538.zip
An almost generic query implementation.
With equality filter on arbitrary properties as a bonus.
Diffstat (limited to 'common/resultset.h')
-rw-r--r--common/resultset.h60
1 files changed, 55 insertions, 5 deletions
diff --git a/common/resultset.h b/common/resultset.h
index f9b6cea..33f3c68 100644
--- a/common/resultset.h
+++ b/common/resultset.h
@@ -19,6 +19,8 @@
19#pragma once 19#pragma once
20 20
21#include <QVector> 21#include <QVector>
22#include <functional>
23#include "domain/applicationdomaintype.h"
22 24
23/* 25/*
24 * An iterator to a result set. 26 * An iterator to a result set.
@@ -27,6 +29,22 @@
27 */ 29 */
28class ResultSet { 30class ResultSet {
29 public: 31 public:
32
33
34 ResultSet(const std::function<bool(std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &)>)> &generator)
35 : mValueGenerator(generator),
36 mIt(nullptr)
37 {
38
39 }
40
41 ResultSet(const std::function<QByteArray()> &generator)
42 : mGenerator(generator),
43 mIt(nullptr)
44 {
45
46 }
47
30 ResultSet(const QVector<QByteArray> &resultSet) 48 ResultSet(const QVector<QByteArray> &resultSet)
31 : mResultSet(resultSet), 49 : mResultSet(resultSet),
32 mIt(nullptr) 50 mIt(nullptr)
@@ -36,17 +54,46 @@ class ResultSet {
36 54
37 bool next() 55 bool next()
38 { 56 {
39 if (!mIt) { 57 if (mGenerator) {
40 mIt = mResultSet.constBegin(); 58 mCurrentValue = mGenerator();
41 } else { 59 } else {
42 mIt++; 60 if (!mIt) {
61 mIt = mResultSet.constBegin();
62 } else {
63 mIt++;
64 }
65 return mIt != mResultSet.constEnd();
43 } 66 }
44 return mIt != mResultSet.constEnd(); 67 }
68
69 bool next(std::function<bool(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value)> callback)
70 {
71 Q_ASSERT(mValueGenerator);
72 return mValueGenerator(callback);
73 }
74
75 bool next(std::function<void(const QByteArray &key)> callback)
76 {
77 if (mGenerator) {
78 mCurrentValue = mGenerator();
79 } else {
80 if (!mIt) {
81 mIt = mResultSet.constBegin();
82 } else {
83 mIt++;
84 }
85 return mIt != mResultSet.constEnd();
86 }
87
45 } 88 }
46 89
47 QByteArray id() 90 QByteArray id()
48 { 91 {
49 return *mIt; 92 if (mIt) {
93 return *mIt;
94 } else {
95 return mCurrentValue;
96 }
50 } 97 }
51 98
52 bool isEmpty() 99 bool isEmpty()
@@ -57,5 +104,8 @@ class ResultSet {
57 private: 104 private:
58 QVector<QByteArray> mResultSet; 105 QVector<QByteArray> mResultSet;
59 QVector<QByteArray>::ConstIterator mIt; 106 QVector<QByteArray>::ConstIterator mIt;
107 QByteArray mCurrentValue;
108 std::function<QByteArray()> mGenerator;
109 std::function<bool(std::function<void(const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &)>)> mValueGenerator;
60}; 110};
61 111