1 /****************************************************************************
4 ** Definition of QGList and QGListIterator classes
8 ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
10 ** This file is part of the tools module of the Qt GUI Toolkit.
12 ** This file may be distributed under the terms of the Q Public License
13 ** as defined by Trolltech AS of Norway and appearing in the file
14 ** LICENSE.QPL included in the packaging of this file.
16 ** This file may be distributed and/or modified under the terms of the
17 ** GNU General Public License version 2 as published by the Free Software
18 ** Foundation and appearing in the file LICENSE.GPL included in the
19 ** packaging of this file.
21 ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
22 ** licenses may use this file in accordance with the Qt Commercial License
23 ** Agreement provided with the Software.
25 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
29 ** information about Qt Commercial License Agreements.
30 ** See http://www.trolltech.com/qpl/ for QPL licensing information.
31 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
33 ** Contact info@trolltech.com if any conditions of this licensing are
36 **********************************************************************/
42 #include "qcollection.h"
46 /*****************************************************************************
47 QLNode class (internal doubly linked list node)
48 *****************************************************************************/
53 friend class QGListIterator;
55 QCollection::Item getData() { return data; }
57 QCollection::Item data;
60 QLNode( QCollection::Item d ) { data = d; }
64 /*****************************************************************************
66 *****************************************************************************/
68 class Q_EXPORT QGList : public QCollection // doubly linked generic list
70 friend class QGListIterator;
71 friend class QGVector; // needed by QGVector::toList
73 uint count() const; // return number of nodes
75 #ifndef QT_NO_DATASTREAM
76 QDataStream &read( QDataStream & ); // read list from stream
77 QDataStream &write( QDataStream & ) const; // write list to stream
80 QGList(); // create empty list
81 QGList( const QGList & ); // make copy of other list
84 QGList &operator=( const QGList & ); // assign from other list
85 bool operator==( const QGList& ) const;
87 void inSort( QCollection::Item ); // add item sorted in list
88 void append( QCollection::Item ); // add item at end of list
89 bool insertAt( uint index, QCollection::Item ); // add item at i'th position
90 void relinkNode( QLNode * ); // relink as first item
91 bool removeNode( QLNode * ); // remove node
92 bool remove( QCollection::Item = 0 ); // remove item (0=current)
93 bool removeRef( QCollection::Item = 0 ); // remove item (0=current)
94 bool removeFirst(); // remove first item
95 bool removeLast(); // remove last item
96 bool removeAt( uint index ); // remove item at i'th position
97 QCollection::Item takeNode( QLNode * ); // take out node
98 QCollection::Item take(); // take out current item
99 QCollection::Item takeAt( uint index ); // take out item at i'th pos
100 QCollection::Item takeFirst(); // take out first item
101 QCollection::Item takeLast(); // take out last item
103 void sort(); // sort all items;
104 void clear(); // remove all items
106 int findRef( QCollection::Item, bool = TRUE ); // find exact item in list
107 int find( QCollection::Item, bool = TRUE ); // find equal item in list
109 uint containsRef( QCollection::Item ) const; // get number of exact matches
110 uint contains( QCollection::Item ) const; // get number of equal matches
112 QCollection::Item at( uint index ); // access item at i'th pos
113 int at() const; // get current index
114 QLNode *currentNode() const; // get current node
116 QCollection::Item get() const; // get current item
118 QCollection::Item cfirst() const; // get ptr to first list item
119 QCollection::Item clast() const; // get ptr to last list item
120 QCollection::Item first(); // set first item in list curr
121 QCollection::Item last(); // set last item in list curr
122 QCollection::Item next(); // set next item in list curr
123 QCollection::Item prev(); // set prev item in list curr
125 void toVector( QGVector * ) const; // put items in vector
127 virtual int compareItems( QCollection::Item, QCollection::Item );
129 #ifndef QT_NO_DATASTREAM
130 virtual QDataStream &read( QDataStream &, QCollection::Item & );
131 virtual QDataStream &write( QDataStream &, QCollection::Item ) const;
134 void prepend( QCollection::Item ); // add item at start of list
136 void heapSortPushDown( QCollection::Item* heap, int first, int last );
138 QLNode *firstNode; // first node
139 QLNode *lastNode; // last node
140 QLNode *curNode; // current node
141 int curIndex; // current index
142 uint numNodes; // number of nodes
143 QGList *iterators; // list of iterators
145 QLNode *locate( uint ); // get node at i'th pos
146 QLNode *unlink(); // unlink node
150 inline uint QGList::count() const
155 inline bool QGList::removeFirst()
161 inline bool QGList::removeLast()
167 inline int QGList::at() const
172 inline QCollection::Item QGList::at( uint index )
174 QLNode *n = locate( index );
175 return n ? n->data : 0;
178 inline QLNode *QGList::currentNode() const
183 inline QCollection::Item QGList::get() const
185 return curNode ? curNode->data : 0;
188 inline QCollection::Item QGList::cfirst() const
190 return firstNode ? firstNode->data : 0;
193 inline QCollection::Item QGList::clast() const
195 return lastNode ? lastNode->data : 0;
199 /*****************************************************************************
200 QGList stream functions
201 *****************************************************************************/
203 #ifndef QT_NO_DATASTREAM
204 Q_EXPORT QDataStream &operator>>( QDataStream &, QGList & );
205 Q_EXPORT QDataStream &operator<<( QDataStream &, const QGList & );
208 /*****************************************************************************
210 *****************************************************************************/
212 class Q_EXPORT QGListIterator // QGList iterator
216 QGListIterator( const QGList & );
217 QGListIterator( const QGListIterator & );
218 QGListIterator &operator=( const QGListIterator & );
221 bool atFirst() const; // test if at first item
222 bool atLast() const; // test if at last item
223 QCollection::Item toFirst(); // move to first item
224 QCollection::Item toLast(); // move to last item
226 QCollection::Item get() const; // get current item
227 QCollection::Item operator()(); // get current and move to next
228 QCollection::Item operator++(); // move to next item (prefix)
229 QCollection::Item operator+=(uint); // move n positions forward
230 QCollection::Item operator--(); // move to prev item (prefix)
231 QCollection::Item operator-=(uint); // move n positions backward
234 QGList *list; // reference to list
237 QLNode *curNode; // current node in list
241 inline bool QGListIterator::atFirst() const
243 return curNode == list->firstNode;
246 inline bool QGListIterator::atLast() const
248 return curNode == list->lastNode;
251 inline QCollection::Item QGListIterator::get() const
253 return curNode ? curNode->data : 0;