qtconcurrentresultstore.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:7k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QTCONCURRENT_RESULTSTORE_H
  38. #define QTCONCURRENT_RESULTSTORE_H
  39. #include <QtCore/qglobal.h>
  40. #ifndef QT_NO_QFUTURE
  41. #include <QtCore/qmap.h>
  42. #include <QtCore/qdebug.h>
  43. QT_BEGIN_HEADER
  44. QT_BEGIN_NAMESPACE
  45. QT_MODULE(Core)
  46. /*
  47.     ResultStore stores indexed results. Results can be added and retrieved
  48.     either individually batched in a QVector. Retriveing results and checking
  49.     which indexes are in the store can be done either by iterating or by random
  50.     accees. In addition results kan be removed from the front of the store,
  51.     either individually or in batches.
  52. */
  53. #ifndef qdoc
  54. namespace QtConcurrent {
  55. class ResultItem
  56. {
  57. public:
  58.     ResultItem(const void *_result, int _count) : m_count(_count), result(_result) { } // contruct with vector of results
  59.     ResultItem(const void *_result) : m_count(0), result(_result) { } // construct with result
  60.     ResultItem() : m_count(0), result(0) { }
  61.     bool isValid() const { return result != 0; }
  62.     bool isVector() const { return m_count != 0; }
  63.     int count() const { return (m_count == 0) ?  1 : m_count; }
  64.     int m_count;          // result is either a pointer to a result or to a vector of results,
  65.     const void *result; // if count is 0 it's a result, otherwise it's a vector.
  66. };
  67. class Q_CORE_EXPORT ResultIteratorBase
  68. {
  69. public:
  70.     ResultIteratorBase();
  71.     ResultIteratorBase(QMap<int, ResultItem>::const_iterator _mapIterator, int _vectorIndex = 0);
  72.     int vectorIndex() const;
  73.     int resultIndex() const;
  74.     ResultIteratorBase operator++();
  75.     int batchSize() const;
  76.     void batchedAdvance();
  77.     bool operator==(const ResultIteratorBase &other) const;
  78.     bool operator!=(const ResultIteratorBase &other) const;
  79.     bool isVector() const;
  80.     bool canIncrementVectorIndex() const;
  81. protected:
  82.     QMap<int, ResultItem>::const_iterator mapIterator;
  83.     int m_vectorIndex;
  84. };
  85. template <typename T>
  86. class  ResultIterator : public ResultIteratorBase
  87. {
  88. public:
  89.     ResultIterator(const ResultIteratorBase &base)
  90.     : ResultIteratorBase(base) { }
  91.     const T &value() const
  92.     {
  93.         return *pointer();
  94.     }
  95.     const T *pointer() const
  96.     {
  97.         if (mapIterator.value().isVector())
  98.             return &(reinterpret_cast<const QVector<T> *>(mapIterator.value().result)->at(m_vectorIndex));
  99.         else
  100.             return reinterpret_cast<const T *>(mapIterator.value().result);
  101.     }
  102. };
  103. class Q_CORE_EXPORT ResultStoreBase
  104. {
  105. public:
  106.     ResultStoreBase();
  107.     void setFilterMode(bool enable);
  108.     bool filterMode() const;
  109.     int addResult(int index, const void *result);
  110.     int addResults(int index, const void *results, int vectorSize, int logicalCount);
  111.     ResultIteratorBase begin() const;
  112.     ResultIteratorBase end() const;
  113.     bool hasNextResult() const;
  114.     ResultIteratorBase resultAt(int index) const;
  115.     bool contains(int index) const;
  116.     int count() const;
  117.     virtual ~ResultStoreBase() { };
  118. protected:
  119.     int insertResultItem(int index, ResultItem &resultItem);
  120.     void insertResultItemIfValid(int index, ResultItem &resultItem);
  121.     void syncPendingResults();
  122.     void syncResultCount();
  123.     int updateInsertIndex(int index, int _count);
  124.     QMap<int, ResultItem> m_results;
  125.     int insertIndex;     // The index where the next results(s) will be inserted.
  126.     int resultCount;     // The number of consecutive results stored, starting at index 0.
  127.     bool m_filterMode;
  128.     QMap<int, ResultItem> pendingResults;
  129.     int filteredResults;
  130.     
  131. };
  132. template <typename T>
  133. class ResultStore : public ResultStoreBase
  134. {
  135. public:
  136.     ResultStore() { }
  137.     ResultStore(const ResultStoreBase &base)
  138.     : ResultStoreBase(base) { }
  139.     int addResult(int index, const T  *result)
  140.     {
  141.         if (result == 0)
  142.             return ResultStoreBase::addResult(index, result);
  143.         else
  144.             return ResultStoreBase::addResult(index, new T(*result));
  145.     }
  146.     int addResults(int index, const QVector<T> *results)
  147.     {
  148.         return ResultStoreBase::addResults(index, new QVector<T>(*results), results->count(), results->count());
  149.     }
  150.     int addResults(int index, const QVector<T> *results, int totalCount)
  151.     {
  152.         return ResultStoreBase::addResults(index, new QVector<T>(*results), results->count(), totalCount);
  153.     }
  154.     int addCanceledResult(int index)
  155.     {
  156.         return addResult(index, 0);
  157.     }
  158.     int addCanceledResults(int index, int _count)
  159.     {
  160.         QVector<T> empty;
  161.         return addResults(index, &empty, _count);
  162.     }
  163.     ResultIterator<T> begin() const
  164.     {
  165.         return static_cast<ResultIterator<T> >(ResultStoreBase::begin());
  166.     }
  167.     ResultIterator<T> end() const
  168.     {
  169.         return static_cast<ResultIterator<T> >(ResultStoreBase::end());
  170.     }
  171.     ResultIterator<T> resultAt(int index) const
  172.     {
  173.         return static_cast<ResultIterator<T> >(ResultStoreBase::resultAt(index));
  174.     }
  175.     void clear()
  176.     {
  177.         QMap<int, ResultItem>::const_iterator mapIterator = m_results.constBegin();
  178.         while (mapIterator != m_results.constEnd()) {
  179.             if (mapIterator.value().isVector())
  180.                 delete reinterpret_cast<const QVector<T> *>(mapIterator.value().result);
  181.             else
  182.                 delete reinterpret_cast<const T *>(mapIterator.value().result);
  183.             ++mapIterator;
  184.         }
  185.         resultCount = 0;
  186.         m_results.clear();
  187.     }
  188.     ~ResultStore()
  189.     {
  190.         clear();
  191.     }
  192. };
  193. } // namespace QtConcurrent
  194. #endif //qdoc
  195. QT_END_NAMESPACE
  196. QT_END_HEADER
  197. #endif // QT_NO_CONCURRENT
  198. #endif