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

系统编程

开发平台:

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 QITERATOR_H
  38. #define QITERATOR_H
  39. #include <QtCore/qglobal.h>
  40. QT_BEGIN_HEADER
  41. namespace std {
  42.     struct bidirectional_iterator_tag;
  43.     struct random_access_iterator_tag;
  44. }
  45. QT_BEGIN_NAMESPACE
  46. QT_MODULE(Core)
  47. #define Q_DECLARE_SEQUENTIAL_ITERATOR(C) 
  48. template <class T> 
  49. class Q##C##Iterator 
  50.     typedef typename Q##C<T>::const_iterator const_iterator; 
  51.     Q##C<T> c; 
  52.     const_iterator i; 
  53. public: 
  54.     inline Q##C##Iterator(const Q##C<T> &container) 
  55.         : c(container), i(c.constBegin()) {} 
  56.     inline Q##C##Iterator &operator=(const Q##C<T> &container) 
  57.     { c = container; i = c.constBegin(); return *this; } 
  58.     inline void toFront() { i = c.constBegin(); } 
  59.     inline void toBack() { i = c.constEnd(); } 
  60.     inline bool hasNext() const { return i != c.constEnd(); } 
  61.     inline const T &next() { return *i++; } 
  62.     inline const T &peekNext() const { return *i; } 
  63.     inline bool hasPrevious() const { return i != c.constBegin(); } 
  64.     inline const T &previous() { return *--i; } 
  65.     inline const T &peekPrevious() const { const_iterator p = i; return *--p; } 
  66.     inline bool findNext(const T &t) 
  67.     { while (i != c.constEnd()) if (*i++ == t) return true; return false; } 
  68.     inline bool findPrevious(const T &t) 
  69.     { while (i != c.constBegin()) if (*(--i) == t) return true; 
  70.       return false;  } 
  71. };
  72. #define Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C) 
  73. template <class T> 
  74. class QMutable##C##Iterator 
  75.     typedef typename Q##C<T>::iterator iterator; 
  76.     typedef typename Q##C<T>::const_iterator const_iterator; 
  77.     Q##C<T> *c; 
  78.     iterator i, n; 
  79.     inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } 
  80. public: 
  81.     inline QMutable##C##Iterator(Q##C<T> &container) 
  82.         : c(&container) 
  83.     { c->setSharable(false); i = c->begin(); n = c->end(); } 
  84.     inline ~QMutable##C##Iterator() 
  85.     { c->setSharable(true); } 
  86.     inline QMutable##C##Iterator &operator=(Q##C<T> &container) 
  87.     { c->setSharable(true); c = &container; c->setSharable(false); 
  88.       i = c->begin(); n = c->end(); return *this; } 
  89.     inline void toFront() { i = c->begin(); n = c->end(); } 
  90.     inline void toBack() { i = c->end(); n = i; } 
  91.     inline bool hasNext() const { return c->constEnd() != const_iterator(i); } 
  92.     inline T &next() { n = i++; return *n; } 
  93.     inline T &peekNext() const { return *i; } 
  94.     inline bool hasPrevious() const { return c->constBegin() != const_iterator(i); } 
  95.     inline T &previous() { n = --i; return *n; } 
  96.     inline T &peekPrevious() const { iterator p = i; return *--p; } 
  97.     inline void remove() 
  98.     { if (c->constEnd() != const_iterator(n)) { i = c->erase(n); n = c->end(); } } 
  99.     inline void setValue(const T &t) const { if (c->constEnd() != const_iterator(n)) *n = t; } 
  100.     inline T &value() { Q_ASSERT(item_exists()); return *n; } 
  101.     inline const T &value() const { Q_ASSERT(item_exists()); return *n; } 
  102.     inline void insert(const T &t) { n = i = c->insert(i, t); ++i; } 
  103.     inline bool findNext(const T &t) 
  104.     { while (c->constEnd() != const_iterator(n = i)) if (*i++ == t) return true; return false; } 
  105.     inline bool findPrevious(const T &t) 
  106.     { while (c->constBegin() != const_iterator(i)) if (*(n = --i) == t) return true; 
  107.       n = c->end(); return false;  } 
  108. };
  109. #define Q_DECLARE_ASSOCIATIVE_ITERATOR(C) 
  110. template <class Key, class T> 
  111. class Q##C##Iterator 
  112.     typedef typename Q##C<Key,T>::const_iterator const_iterator; 
  113.     typedef const_iterator Item; 
  114.     Q##C<Key,T> c; 
  115.     const_iterator i, n; 
  116.     inline bool item_exists() const { return n != c.constEnd(); } 
  117. public: 
  118.     inline Q##C##Iterator(const Q##C<Key,T> &container) 
  119.         : c(container), i(c.constBegin()), n(c.constEnd()) {} 
  120.     inline Q##C##Iterator &operator=(const Q##C<Key,T> &container) 
  121.     { c = container; i = c.constBegin(); n = c.constEnd(); return *this; } 
  122.     inline void toFront() { i = c.constBegin(); n = c.constEnd(); } 
  123.     inline void toBack() { i = c.constEnd(); n = c.constEnd(); } 
  124.     inline bool hasNext() const { return i != c.constEnd(); } 
  125.     inline Item next() { n = i++; return n; } 
  126.     inline Item peekNext() const { return i; } 
  127.     inline bool hasPrevious() const { return i != c.constBegin(); } 
  128.     inline Item previous() { n = --i; return n; } 
  129.     inline Item peekPrevious() const { const_iterator p = i; return --p; } 
  130.     inline const T &value() const { Q_ASSERT(item_exists()); return *n; } 
  131.     inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); } 
  132.     inline bool findNext(const T &t) 
  133.     { while ((n = i) != c.constEnd()) if (*i++ == t) return true; return false; } 
  134.     inline bool findPrevious(const T &t) 
  135.     { while (i != c.constBegin()) if (*(n = --i) == t) return true; 
  136.       n = c.constEnd(); return false; } 
  137. };
  138. #define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C) 
  139. template <class Key, class T> 
  140. class QMutable##C##Iterator 
  141.     typedef typename Q##C<Key,T>::iterator iterator; 
  142.     typedef typename Q##C<Key,T>::const_iterator const_iterator; 
  143.     typedef iterator Item; 
  144.     Q##C<Key,T> *c; 
  145.     iterator i, n; 
  146.     inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } 
  147. public: 
  148.     inline QMutable##C##Iterator(Q##C<Key,T> &container) 
  149.         : c(&container) 
  150.     { c->setSharable(false); i = c->begin(); n = c->end(); } 
  151.     inline ~QMutable##C##Iterator() 
  152.     { c->setSharable(true); } 
  153.     inline QMutable##C##Iterator &operator=(Q##C<Key,T> &container) 
  154.     { c->setSharable(true); c = &container; c->setSharable(false); i = c->begin(); n = c->end(); return *this; } 
  155.     inline void toFront() { i = c->begin(); n = c->end(); } 
  156.     inline void toBack() { i = c->end(); n = c->end(); } 
  157.     inline bool hasNext() const { return const_iterator(i) != c->constEnd(); } 
  158.     inline Item next() { n = i++; return n; } 
  159.     inline Item peekNext() const { return i; } 
  160.     inline bool hasPrevious() const { return const_iterator(i) != c->constBegin(); } 
  161.     inline Item previous() { n = --i; return n; } 
  162.     inline Item peekPrevious() const { iterator p = i; return --p; } 
  163.     inline void remove() 
  164.     { if (const_iterator(n) != c->constEnd()) { i = c->erase(n); n = c->end(); } } 
  165.     inline void setValue(const T &t) { if (const_iterator(n) != c->constEnd()) *n = t; } 
  166.     inline T &value() { Q_ASSERT(item_exists()); return *n; } 
  167.     inline const T &value() const { Q_ASSERT(item_exists()); return *n; } 
  168.     inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); } 
  169.     inline bool findNext(const T &t) 
  170.     { while (const_iterator(n = i) != c->constEnd()) if (*i++ == t) return true; return false; } 
  171.     inline bool findPrevious(const T &t) 
  172.     { while (const_iterator(i) != c->constBegin()) if (*(n = --i) == t) return true; 
  173.       n = c->end(); return false; } 
  174. };
  175. QT_END_NAMESPACE
  176. QT_END_HEADER
  177. #endif // QITERATOR_H