Go
to the documentation of this file.
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef QTCONCURRENT_RESULTSTORE_H
00043 #define QTCONCURRENT_RESULTSTORE_H
00044
00045 #include <QtCore/qglobal.h>
00046
00047 #ifndef QT_NO_QFUTURE
00048
00049 #include <QtCore/qmap.h>
00050 #include <QtCore/qdebug.h>
00051
00052 QT_BEGIN_HEADER
00053 QT_BEGIN_NAMESPACE
00054
00055 QT_MODULE(Core)
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #ifndef qdoc
00066
00067 namespace QtConcurrent {
00068
00069 class ResultItem
00070 {
00071 public:
00072 ResultItem(const void *_result, int _count) : m_count(_count), result(_result) { }
00073 ResultItem(const void *_result) : m_count(0), result(_result) { }
00074 ResultItem() : m_count(0), result(0) { }
00075 bool isValid() const { return result != 0; }
00076 bool isVector() const { return m_count != 0; }
00077 int count() const { return (m_count == 0) ? 1 : m_count; }
00078 int m_count;
00079 const void *result;
00080 };
00081
00082 class Q_CORE_EXPORT ResultIteratorBase
00083 {
00084 public:
00085 ResultIteratorBase();
00086 ResultIteratorBase(QMap<int, ResultItem>::const_iterator _mapIterator, int _vectorIndex = 0);
00087 int vectorIndex() const;
00088 int resultIndex() const;
00089
00090 ResultIteratorBase operator++();
00091 int batchSize() const;
00092 void batchedAdvance();
00093 bool operator==(const ResultIteratorBase &other) const;
00094 bool operator!=(const ResultIteratorBase &other) const;
00095 bool isVector() const;
00096 bool canIncrementVectorIndex() const;
00097 protected:
00098 QMap<int, ResultItem>::const_iterator mapIterator;
00099 int m_vectorIndex;
00100 };
00101
00102 template <typename T>
00103 class ResultIterator : public ResultIteratorBase
00104 {
00105 public:
00106 ResultIterator(const ResultIteratorBase &base)
00107 : ResultIteratorBase(base) { }
00108
00109 const T &value() const
00110 {
00111 return *pointer();
00112 }
00113
00114 const T *pointer() const
00115 {
00116 if (mapIterator.value().isVector())
00117 return &(reinterpret_cast<const QVector<T> *>(mapIterator.value().result)->at(m_vectorIndex));
00118 else
00119 return reinterpret_cast<const T *>(mapIterator.value().result);
00120 }
00121 };
00122
00123 class Q_CORE_EXPORT ResultStoreBase
00124 {
00125 public:
00126 ResultStoreBase();
00127 void setFilterMode(bool enable);
00128 bool filterMode() const;
00129 int addResult(int index, const void *result);
00130 int addResults(int index, const void *results, int vectorSize, int logicalCount);
00131 ResultIteratorBase begin() const;
00132 ResultIteratorBase end() const;
00133 bool hasNextResult() const;
00134 ResultIteratorBase resultAt(int index) const;
00135 bool contains(int index) const;
00136 int count() const;
00137 virtual ~ResultStoreBase() { };
00138
00139 protected:
00140 int insertResultItem(int index, ResultItem &resultItem);
00141 void insertResultItemIfValid(int index, ResultItem &resultItem);
00142 void syncPendingResults();
00143 void syncResultCount();
00144 int updateInsertIndex(int index, int _count);
00145
00146 QMap<int, ResultItem> m_results;
00147 int insertIndex;
00148 int resultCount;
00149
00150 bool m_filterMode;
00151 QMap<int, ResultItem> pendingResults;
00152 int filteredResults;
00153
00154 };
00155
00156 template <typename T>
00157 class ResultStore : public ResultStoreBase
00158 {
00159 public:
00160 ResultStore() { }
00161
00162 ResultStore(const ResultStoreBase &base)
00163 : ResultStoreBase(base) { }
00164
00165 int addResult(int index, const T *result)
00166 {
00167 if (result == 0)
00168 return ResultStoreBase::addResult(index, result);
00169 else
00170 return ResultStoreBase::addResult(index, new T(*result));
00171 }
00172
00173 int addResults(int index, const QVector<T> *results)
00174 {
00175 return ResultStoreBase::addResults(index, new QVector<T>(*results), results->count(), results->count());
00176 }
00177
00178 int addResults(int index, const QVector<T> *results, int totalCount)
00179 {
00180 return ResultStoreBase::addResults(index, new QVector<T>(*results), results->count(), totalCount);
00181 }
00182
00183 int addCanceledResult(int index)
00184 {
00185 return addResult(index, 0);
00186 }
00187
00188 int addCanceledResults(int index, int _count)
00189 {
00190 QVector<T> empty;
00191 return addResults(index, &empty, _count);
00192 }
00193
00194 ResultIterator<T> begin() const
00195 {
00196 return static_cast<ResultIterator<T> >(ResultStoreBase::begin());
00197 }
00198
00199 ResultIterator<T> end() const
00200 {
00201 return static_cast<ResultIterator<T> >(ResultStoreBase::end());
00202 }
00203
00204 ResultIterator<T> resultAt(int index) const
00205 {
00206 return static_cast<ResultIterator<T> >(ResultStoreBase::resultAt(index));
00207 }
00208
00209 void clear()
00210 {
00211 QMap<int, ResultItem>::const_iterator mapIterator = m_results.constBegin();
00212 while (mapIterator != m_results.constEnd()) {
00213 if (mapIterator.value().isVector())
00214 delete reinterpret_cast<const QVector<T> *>(mapIterator.value().result);
00215 else
00216 delete reinterpret_cast<const T *>(mapIterator.value().result);
00217 ++mapIterator;
00218 }
00219 resultCount = 0;
00220 m_results.clear();
00221 }
00222
00223 ~ResultStore()
00224 {
00225 clear();
00226 }
00227
00228 };
00229
00230 }
00231
00232 #endif //qdoc
00233
00234 QT_END_NAMESPACE
00235 QT_END_HEADER
00236
00237 #endif // QT_NO_CONCURRENT
00238
00239 #endif