diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-06-17 00:57:24 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-06-17 00:57:24 +0200 |
commit | 4eb94786232aee936cd6371824764705c9359538 (patch) | |
tree | c5347ae86c4088676f78d59d647c9a30e636b53b /common/resultset.h | |
parent | 7819a02582fea02cd6da56aa4526492d281df07a (diff) | |
download | sink-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.h | 60 |
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 | */ |
28 | class ResultSet { | 30 | class 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 | ||