Root/
Source at commit 1406 created 12 years 10 months ago. By meklort, Revert drivers.c so that kexts are only loaded when OSBundleRequired is set and that value is not safe mode. Added some comments about it too. | |
---|---|
1 | /****************************************************************************␊ |
2 | ** ␊ |
3 | **␊ |
4 | ** Implementation of QGVector class␊ |
5 | **␊ |
6 | ** Created : 930907␊ |
7 | **␊ |
8 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.␊ |
9 | **␊ |
10 | ** This file is part of the tools module of the Qt GUI Toolkit.␊ |
11 | **␊ |
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.␊ |
15 | **␊ |
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.␊ |
20 | **␊ |
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.␊ |
24 | **␊ |
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.␊ |
27 | **␊ |
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.␊ |
32 | **␊ |
33 | ** Contact info@trolltech.com if any conditions of this licensing are␊ |
34 | ** not clear to you.␊ |
35 | **␊ |
36 | **********************************************************************/␊ |
37 | ␊ |
38 | #define␉ QGVECTOR_CPP␊ |
39 | #include "qgvector.h"␊ |
40 | #include "qglist.h"␊ |
41 | #include "qstring.h"␊ |
42 | #include "qdatastream.h"␊ |
43 | #include <stdlib.h>␊ |
44 | ␊ |
45 | #define USE_MALLOC␉␉␉␉// comment to use new/delete␊ |
46 | ␊ |
47 | #undef NEW␊ |
48 | #undef DELETE␊ |
49 | ␊ |
50 | #if defined(USE_MALLOC)␊ |
51 | #define NEW(type,size)␉((type*)malloc(size*sizeof(type)))␊ |
52 | #define DELETE(array)␉(free((char*)array))␊ |
53 | #else␊ |
54 | #define NEW(type,size)␉(new type[size])␊ |
55 | #define DELETE(array)␉(delete[] array)␊ |
56 | #define DONT_USE_REALLOC␉␉␉// comment to use realloc()␊ |
57 | #endif␊ |
58 | ␊ |
59 | // NOT REVISED␊ |
60 | ␊ |
61 | /*!␊ |
62 | \class QGVector qgvector.h␊ |
63 | ␊ |
64 | \brief The QGVector class is an internal class for implementing Qt␊ |
65 | collection classes.␊ |
66 | ␊ |
67 | QGVector is a strictly internal class that acts as a base class for␊ |
68 | the QVector collection class.␊ |
69 | ␊ |
70 | QGVector has some virtual functions that may be reimplemented in␊ |
71 | subclasses to to customize behavior.␊ |
72 | ␊ |
73 | <ul>␊ |
74 | <li> compareItems() compares two collection/vector items.␊ |
75 | <li> read() reads a collection/vector item from a QDataStream.␊ |
76 | <li> write() writes a collection/vector item to a QDataStream.␊ |
77 | </ul>␊ |
78 | */␊ |
79 | ␊ |
80 | /*****************************************************************************␊ |
81 | Default implementation of virtual functions␊ |
82 | *****************************************************************************/␊ |
83 | ␊ |
84 | /*!␊ |
85 | This virtual function compares two list items.␊ |
86 | ␊ |
87 | Returns:␊ |
88 | <ul>␊ |
89 | <li> 0 if \a item1 == \a item2␊ |
90 | <li> non-zero if \a item1 != \a item2␊ |
91 | </ul>␊ |
92 | ␊ |
93 | This function returns \e int rather than \e bool so that␊ |
94 | reimplementations can return one of three values and use it to sort␊ |
95 | by:␊ |
96 | ␊ |
97 | <ul>␊ |
98 | <li> 0 if \e item1 == \e item2␊ |
99 | <li> \> 0 (positive integer) if \a item1 \> \a item2␊ |
100 | <li> \< 0 (negative integer) if \a item1 \< \a item2␊ |
101 | </ul>␊ |
102 | ␊ |
103 | The QVector::sort() and QVector::bsearch() functions require that␊ |
104 | compareItems() is implemented as described here.␊ |
105 | ␊ |
106 | This function should not modify the vector because some const␊ |
107 | functions call compareItems().␊ |
108 | */␊ |
109 | ␊ |
110 | int QGVector::compareItems( Item d1, Item d2 )␊ |
111 | {␊ |
112 | return d1 != d2;␉␉␉␉// compare pointers␊ |
113 | }␊ |
114 | ␊ |
115 | #ifndef QT_NO_DATASTREAM␊ |
116 | /*!␊ |
117 | Reads a collection/vector item from the stream \a s and returns a reference␊ |
118 | to the stream.␊ |
119 | ␊ |
120 | The default implementation sets \e item to 0.␊ |
121 | ␊ |
122 | \sa write()␊ |
123 | */␊ |
124 | ␊ |
125 | QDataStream &QGVector::read( QDataStream &s, Item &d )␊ |
126 | {␉␉␉␉␉␉// read item from stream␊ |
127 | d = 0;␊ |
128 | return s;␊ |
129 | }␊ |
130 | ␊ |
131 | /*!␊ |
132 | Writes a collection/vector item to the stream \a s and returns a reference␊ |
133 | to the stream.␊ |
134 | ␊ |
135 | The default implementation does nothing.␊ |
136 | ␊ |
137 | \sa read()␊ |
138 | */␊ |
139 | ␊ |
140 | QDataStream &QGVector::write( QDataStream &s, Item ) const␊ |
141 | {␉␉␉␉␉␉// write item to stream␊ |
142 | return s;␊ |
143 | }␊ |
144 | #endif // QT_NO_DATASTREAM␊ |
145 | ␊ |
146 | /*****************************************************************************␊ |
147 | QGVector member functions␊ |
148 | *****************************************************************************/␊ |
149 | ␊ |
150 | /*!␊ |
151 | \internal␊ |
152 | */␊ |
153 | ␊ |
154 | QGVector::QGVector()␉␉␉␉// create empty vector␊ |
155 | {␊ |
156 | vec = 0;␊ |
157 | len = numItems = 0;␊ |
158 | }␊ |
159 | ␊ |
160 | /*!␊ |
161 | \internal␊ |
162 | */␊ |
163 | QGVector::QGVector( uint size )␉␉␉// create vectors with nullptrs␊ |
164 | {␊ |
165 | len = size;␊ |
166 | numItems = 0;␊ |
167 | if ( len == 0 ) {␉␉␉␉// zero length␊ |
168 | ␉vec = 0;␊ |
169 | ␉return;␊ |
170 | }␊ |
171 | vec = NEW(Item,len);␊ |
172 | CHECK_PTR( vec );␊ |
173 | memset( (void*)vec, 0, len*sizeof(Item) );␉// fill with nulls␊ |
174 | }␊ |
175 | ␊ |
176 | /*!␊ |
177 | \internal␊ |
178 | */␊ |
179 | ␊ |
180 | QGVector::QGVector( const QGVector &a )␉␉// make copy of other vector␊ |
181 | : QCollection( a )␊ |
182 | {␊ |
183 | len = a.len;␊ |
184 | numItems = a.numItems;␊ |
185 | vec = NEW(Item,len);␊ |
186 | CHECK_PTR( vec );␊ |
187 | for ( uint i=0; i<len; i++ ) {␊ |
188 | ␉vec[i] = a.vec[i] ? newItem( a.vec[i] ) : 0;␊ |
189 | ␉CHECK_PTR( vec[i] );␊ |
190 | }␊ |
191 | }␊ |
192 | ␊ |
193 | /*!␊ |
194 | \internal␊ |
195 | */␊ |
196 | ␊ |
197 | QGVector::~QGVector()␊ |
198 | {␊ |
199 | clear();␊ |
200 | }␊ |
201 | ␊ |
202 | ␊ |
203 | /*!␊ |
204 | \internal␊ |
205 | */␊ |
206 | ␊ |
207 | QGVector& QGVector::operator=( const QGVector &v )␊ |
208 | {␉␉␉␉␉␉// assign from other vector␊ |
209 | clear();␉␉␉␉␉// first delete old vector␊ |
210 | len = v.len;␊ |
211 | numItems = v.numItems;␊ |
212 | vec = NEW(Item,len);␉␉␉␉// create new vector␊ |
213 | CHECK_PTR( vec );␊ |
214 | for ( uint i=0; i<len; i++ ) {␉␉// copy elements␊ |
215 | ␉vec[i] = v.vec[i] ? newItem( v.vec[i] ) : 0;␊ |
216 | ␉CHECK_PTR( vec[i] );␊ |
217 | }␊ |
218 | return *this;␊ |
219 | }␊ |
220 | ␊ |
221 | ␊ |
222 | /*!␊ |
223 | \fn Item *QGVector::data() const␊ |
224 | \internal␊ |
225 | */␊ |
226 | ␊ |
227 | /*!␊ |
228 | \fn uint QGVector::size() const␊ |
229 | \internal␊ |
230 | */␊ |
231 | ␊ |
232 | /*!␊ |
233 | \fn uint QGVector::count() const␊ |
234 | \internal␊ |
235 | */␊ |
236 | ␊ |
237 | /*!␊ |
238 | \fn Item QGVector::at( uint index ) const␊ |
239 | \internal␊ |
240 | */␊ |
241 | ␊ |
242 | /*!␊ |
243 | \internal␊ |
244 | */␊ |
245 | ␊ |
246 | bool QGVector::insert( uint index, Item d )␉// insert item at index␊ |
247 | {␊ |
248 | #if defined(CHECK_RANGE)␊ |
249 | if ( index >= len ) {␉␉␉// range error␊ |
250 | ␉qWarning( "QGVector::insert: Index %d out of range", index );␊ |
251 | ␉return FALSE;␊ |
252 | }␊ |
253 | #endif␊ |
254 | if ( vec[index] ) {␉␉␉␉// remove old item␊ |
255 | ␉deleteItem( vec[index] );␊ |
256 | ␉numItems--;␊ |
257 | }␊ |
258 | if ( d ) {␊ |
259 | ␉vec[index] = newItem( d );␊ |
260 | ␉CHECK_PTR( vec[index] );␊ |
261 | ␉numItems++;␊ |
262 | ␉return vec[index] != 0;␊ |
263 | } else {␊ |
264 | ␉vec[index] = 0;␉␉␉␉// reset item␊ |
265 | }␊ |
266 | return TRUE;␊ |
267 | }␊ |
268 | ␊ |
269 | /*!␊ |
270 | \internal␊ |
271 | */␊ |
272 | ␊ |
273 | bool QGVector::remove( uint index )␉␉// remove item at index␊ |
274 | {␊ |
275 | #if defined(CHECK_RANGE)␊ |
276 | if ( index >= len ) {␉␉␉// range error␊ |
277 | ␉qWarning( "QGVector::remove: Index %d out of range", index );␊ |
278 | ␉return FALSE;␊ |
279 | }␊ |
280 | #endif␊ |
281 | if ( vec[index] ) {␉␉␉␉// valid item␊ |
282 | ␉deleteItem( vec[index] );␉␉// delete it␊ |
283 | ␉vec[index] = 0;␉␉␉␉// reset pointer␊ |
284 | ␉numItems--;␊ |
285 | }␊ |
286 | return TRUE;␊ |
287 | }␊ |
288 | ␊ |
289 | /*!␊ |
290 | \internal␊ |
291 | */␊ |
292 | ␊ |
293 | QCollection::Item QGVector::take( uint index )␉␉// take out item␊ |
294 | {␊ |
295 | #if defined(CHECK_RANGE)␊ |
296 | if ( index >= len ) {␉␉␉// range error␊ |
297 | ␉qWarning( "QGVector::take: Index %d out of range", index );␊ |
298 | ␉return 0;␊ |
299 | }␊ |
300 | #endif␊ |
301 | Item d = vec[index];␉␉␉␉// don't delete item␊ |
302 | if ( d )␊ |
303 | ␉numItems--;␊ |
304 | vec[index] = 0;␊ |
305 | return d;␊ |
306 | }␊ |
307 | ␊ |
308 | ␊ |
309 | /*!␊ |
310 | \internal␊ |
311 | */␊ |
312 | ␊ |
313 | void QGVector::clear()␉␉␉␉// clear vector␊ |
314 | {␊ |
315 | if ( vec ) {␊ |
316 | ␉for ( uint i=0; i<len; i++ ) {␉␉// delete each item␊ |
317 | ␉ if ( vec[i] )␊ |
318 | ␉␉deleteItem( vec[i] );␊ |
319 | ␉}␊ |
320 | ␉DELETE(vec);␊ |
321 | ␉vec = 0;␊ |
322 | ␉len = numItems = 0;␊ |
323 | }␊ |
324 | }␊ |
325 | ␊ |
326 | /*!␊ |
327 | \internal␊ |
328 | */␊ |
329 | ␊ |
330 | bool QGVector::resize( uint newsize )␉␉// resize array␊ |
331 | {␊ |
332 | if ( newsize == len )␉␉␉// nothing to do␊ |
333 | ␉return TRUE;␊ |
334 | if ( vec ) {␉␉␉␉// existing data␊ |
335 | ␉if ( newsize < len ) {␉␉␉// shrink vector␊ |
336 | ␉ uint i = newsize;␊ |
337 | ␉ while ( i < len ) {␉␉␉// delete lost items␊ |
338 | ␉␉if ( vec[i] ) {␊ |
339 | ␉␉ deleteItem( vec[i] );␊ |
340 | ␉␉ numItems--;␊ |
341 | ␉␉}␊ |
342 | ␉␉i++;␊ |
343 | ␉ }␊ |
344 | ␉}␊ |
345 | ␉if ( newsize == 0 ) {␉␉␉// vector becomes empty␊ |
346 | ␉ DELETE(vec);␊ |
347 | ␉ vec = 0;␊ |
348 | ␉ len = numItems = 0;␊ |
349 | ␉ return TRUE;␊ |
350 | ␉}␊ |
351 | #if defined(DONT_USE_REALLOC)␊ |
352 | ␉Item *newvec = NEW(Item,newsize);␉␉// manual realloc␊ |
353 | ␉memcpy( newvec, vec, (len < newsize ? len : newsize)*sizeof(Item) );␊ |
354 | ␉DELETE(vec);␊ |
355 | ␉vec = newvec;␊ |
356 | #else␊ |
357 | ␉vec = (Item*)realloc( (char *)vec, newsize*sizeof(Item) );␊ |
358 | #endif␊ |
359 | } else {␉␉␉␉␉// create new vector␊ |
360 | ␉vec = NEW(Item,newsize);␊ |
361 | ␉len = numItems = 0;␊ |
362 | }␊ |
363 | CHECK_PTR( vec );␊ |
364 | if ( !vec )␉␉␉␉␉// no memory␊ |
365 | ␉return FALSE;␊ |
366 | if ( newsize > len )␉␉␉// init extra space added␊ |
367 | ␉memset( (void*)&vec[len], 0, (newsize-len)*sizeof(Item) );␊ |
368 | len = newsize;␊ |
369 | return TRUE;␊ |
370 | }␊ |
371 | ␊ |
372 | ␊ |
373 | /*!␊ |
374 | \internal␊ |
375 | */␊ |
376 | ␊ |
377 | bool QGVector::fill( Item d, int flen )␉␉// resize and fill vector␊ |
378 | {␊ |
379 | if ( flen < 0 )␊ |
380 | ␉flen = len;␉␉␉␉// default: use vector length␊ |
381 | else if ( !resize( flen ) )␊ |
382 | ␉return FALSE;␊ |
383 | for ( uint i=0; i<(uint)flen; i++ )␉␉// insert d at every index␊ |
384 | ␉insert( i, d );␊ |
385 | return TRUE;␊ |
386 | }␊ |
387 | ␊ |
388 | ␊ |
389 | static QGVector *sort_vec=0;␉␉␉// current sort vector␊ |
390 | ␊ |
391 | ␊ |
392 | #if defined(Q_C_CALLBACKS)␊ |
393 | extern "C" {␊ |
394 | #endif␊ |
395 | ␊ |
396 | static int cmp_vec( const void *n1, const void *n2 )␊ |
397 | {␊ |
398 | return sort_vec->compareItems( *((QCollection::Item*)n1), *((QCollection::Item*)n2) );␊ |
399 | }␊ |
400 | ␊ |
401 | #if defined(Q_C_CALLBACKS)␊ |
402 | }␊ |
403 | #endif␊ |
404 | ␊ |
405 | ␊ |
406 | /*!␊ |
407 | \internal␊ |
408 | */␊ |
409 | ␊ |
410 | void QGVector::sort()␉␉␉␉// sort vector␊ |
411 | {␊ |
412 | if ( count() == 0 )␉␉␉␉// no elements␊ |
413 | ␉return;␊ |
414 | register Item *start = &vec[0];␊ |
415 | register Item *end␉= &vec[len-1];␊ |
416 | Item tmp;␊ |
417 | while ( TRUE ) {␉␉␉␉// put all zero elements behind␊ |
418 | ␉while ( start < end && *start != 0 )␊ |
419 | ␉ start++;␊ |
420 | ␉while ( end > start && *end == 0 )␊ |
421 | ␉ end--;␊ |
422 | ␉if ( start < end ) {␊ |
423 | ␉ tmp = *start;␊ |
424 | ␉ *start = *end;␊ |
425 | ␉ *end = tmp;␊ |
426 | ␉} else {␊ |
427 | ␉ break;␊ |
428 | ␉}␊ |
429 | }␊ |
430 | sort_vec = (QGVector*)this;␊ |
431 | qsort( vec, count(), sizeof(Item), cmp_vec );␊ |
432 | sort_vec = 0;␊ |
433 | }␊ |
434 | ␊ |
435 | /*!␊ |
436 | \internal␊ |
437 | */␊ |
438 | ␊ |
439 | int QGVector::bsearch( Item d ) const␉␉// binary search; when sorted␊ |
440 | {␊ |
441 | if ( !len )␊ |
442 | ␉return -1;␊ |
443 | if ( !d ) {␊ |
444 | #if defined(CHECK_NULL)␊ |
445 | ␉qWarning( "QGVector::bsearch: Cannot search for null object" );␊ |
446 | #endif␊ |
447 | ␉return -1;␊ |
448 | }␊ |
449 | int n1 = 0;␊ |
450 | int n2 = len - 1;␊ |
451 | int mid = 0;␊ |
452 | bool found = FALSE;␊ |
453 | while ( n1 <= n2 ) {␊ |
454 | ␉int res;␊ |
455 | ␉mid = (n1 + n2)/2;␊ |
456 | ␉if ( vec[mid] == 0 )␉␉␉// null item greater␊ |
457 | ␉ res = -1;␊ |
458 | ␉else␊ |
459 | ␉ res = ((QGVector*)this)->compareItems( d, vec[mid] );␊ |
460 | ␉if ( res < 0 )␊ |
461 | ␉ n2 = mid - 1;␊ |
462 | ␉else if ( res > 0 )␊ |
463 | ␉ n1 = mid + 1;␊ |
464 | ␉else {␉␉␉␉␉// found it␊ |
465 | ␉ found = TRUE;␊ |
466 | ␉ break;␊ |
467 | ␉}␊ |
468 | }␊ |
469 | if ( !found )␊ |
470 | ␉return -1;␊ |
471 | // search to first of equal items␊ |
472 | while ( (mid - 1 >= 0) && !((QGVector*)this)->compareItems(d, vec[mid-1]) )␊ |
473 | ␉mid--;␊ |
474 | return mid;␊ |
475 | }␊ |
476 | ␊ |
477 | ␊ |
478 | /*!␊ |
479 | \internal␊ |
480 | */␊ |
481 | ␊ |
482 | int QGVector::findRef( Item d, uint index) const // find exact item in vector␊ |
483 | {␊ |
484 | #if defined(CHECK_RANGE)␊ |
485 | if ( index >= len ) {␉␉␉// range error␊ |
486 | ␉qWarning( "QGVector::findRef: Index %d out of range", index );␊ |
487 | ␉return -1;␊ |
488 | }␊ |
489 | #endif␊ |
490 | for ( uint i=index; i<len; i++ ) {␊ |
491 | ␉if ( vec[i] == d )␊ |
492 | ␉ return i;␊ |
493 | }␊ |
494 | return -1;␊ |
495 | }␊ |
496 | ␊ |
497 | /*!␊ |
498 | \internal␊ |
499 | */␊ |
500 | ␊ |
501 | int QGVector::find( Item d, uint index ) const␉// find equal item in vector␊ |
502 | {␊ |
503 | #if defined(CHECK_RANGE)␊ |
504 | if ( index >= len ) {␉␉␉// range error␊ |
505 | ␉qWarning( "QGVector::find: Index %d out of range", index );␊ |
506 | ␉return -1;␊ |
507 | }␊ |
508 | #endif␊ |
509 | for ( uint i=index; i<len; i++ ) {␊ |
510 | ␉if ( vec[i] == 0 && d == 0 )␉␉// found null item␊ |
511 | ␉ return i;␊ |
512 | ␉if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )␊ |
513 | ␉ return i;␊ |
514 | }␊ |
515 | return -1;␊ |
516 | }␊ |
517 | ␊ |
518 | /*!␊ |
519 | \internal␊ |
520 | */␊ |
521 | ␊ |
522 | uint QGVector::containsRef( Item d ) const␉// get number of exact matches␊ |
523 | {␊ |
524 | uint count = 0;␊ |
525 | for ( uint i=0; i<len; i++ ) {␊ |
526 | ␉if ( vec[i] == d )␊ |
527 | ␉ count++;␊ |
528 | }␊ |
529 | return count;␊ |
530 | }␊ |
531 | ␊ |
532 | /*!␊ |
533 | \internal␊ |
534 | */␊ |
535 | ␊ |
536 | uint QGVector::contains( Item d ) const␉␉// get number of equal matches␊ |
537 | {␊ |
538 | uint count = 0;␊ |
539 | for ( uint i=0; i<len; i++ ) {␊ |
540 | ␉if ( vec[i] == 0 && d == 0 )␉␉// count null items␊ |
541 | ␉ count++;␊ |
542 | ␉if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )␊ |
543 | ␉ count++;␊ |
544 | }␊ |
545 | return count;␊ |
546 | }␊ |
547 | ␊ |
548 | ␊ |
549 | /*!␊ |
550 | \internal␊ |
551 | */␊ |
552 | ␊ |
553 | bool QGVector::insertExpand( uint index, Item d )// insert and grow if necessary␊ |
554 | {␊ |
555 | if ( index >= len ) {␊ |
556 | ␉if ( !resize( index+1 ) )␉␉// no memory␊ |
557 | ␉ return FALSE;␊ |
558 | }␊ |
559 | insert( index, d );␊ |
560 | return TRUE;␊ |
561 | }␊ |
562 | ␊ |
563 | ␊ |
564 | /*!␊ |
565 | \internal␊ |
566 | */␊ |
567 | ␊ |
568 | void QGVector::toList( QGList *list ) const␉// store items in list␊ |
569 | {␊ |
570 | list->clear();␊ |
571 | for ( uint i=0; i<len; i++ ) {␊ |
572 | ␉if ( vec[i] )␊ |
573 | ␉ list->append( vec[i] );␊ |
574 | }␊ |
575 | }␊ |
576 | ␊ |
577 | ␊ |
578 | void QGVector::warningIndexRange( uint i )␊ |
579 | {␊ |
580 | #if defined(CHECK_RANGE)␊ |
581 | qWarning( "QGVector::operator[]: Index %d out of range", i );␊ |
582 | #else␊ |
583 | Q_UNUSED( i )␊ |
584 | #endif␊ |
585 | }␊ |
586 | ␊ |
587 | ␊ |
588 | /*****************************************************************************␊ |
589 | QGVector stream functions␊ |
590 | *****************************************************************************/␊ |
591 | #ifndef QT_NO_DATASTREAM␊ |
592 | QDataStream &operator>>( QDataStream &s, QGVector &vec )␊ |
593 | {␉␉␉␉␉␉// read vector␊ |
594 | return vec.read( s );␊ |
595 | }␊ |
596 | ␊ |
597 | QDataStream &operator<<( QDataStream &s, const QGVector &vec )␊ |
598 | {␉␉␉␉␉␉// write vector␊ |
599 | return vec.write( s );␊ |
600 | }␊ |
601 | ␊ |
602 | /*!␊ |
603 | \internal␊ |
604 | */␊ |
605 | ␊ |
606 | QDataStream &QGVector::read( QDataStream &s )␉// read vector from stream␊ |
607 | {␊ |
608 | uint num;␊ |
609 | s >> num;␉␉␉␉␉// read number of items␊ |
610 | clear();␉␉␉␉␉// clear vector␊ |
611 | resize( num );␊ |
612 | for (uint i=0; i<num; i++) {␉␉// read all items␊ |
613 | ␉Item d;␊ |
614 | ␉read( s, d );␊ |
615 | ␉CHECK_PTR( d );␊ |
616 | ␉if ( !d )␉␉␉␉// no memory␊ |
617 | ␉ break;␊ |
618 | ␉vec[i] = d;␊ |
619 | }␊ |
620 | return s;␊ |
621 | }␊ |
622 | ␊ |
623 | /*!␊ |
624 | \internal␊ |
625 | */␊ |
626 | ␊ |
627 | QDataStream &QGVector::write( QDataStream &s ) const␊ |
628 | {␉␉␉␉␉␉// write vector to stream␊ |
629 | uint num = count();␊ |
630 | s << num;␉␉␉␉␉// number of items to write␊ |
631 | num = size();␊ |
632 | for (uint i=0; i<num; i++) {␉␉// write non-null items␊ |
633 | ␉if ( vec[i] )␊ |
634 | ␉ write( s, vec[i] );␊ |
635 | }␊ |
636 | return s;␊ |
637 | }␊ |
638 | #endif // QT_NO_DATASTREAM␊ |
639 |