Root/
Source at commit 1322 created 12 years 8 months ago. By meklort, Add doxygen to utils folder | |
---|---|
1 | /****************************************************************************␊ |
2 | ** ␊ |
3 | **␊ |
4 | ** Definition of the QString class, and related Unicode␊ |
5 | ** functions.␊ |
6 | **␊ |
7 | ** Created : 920609␊ |
8 | **␊ |
9 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.␊ |
10 | **␊ |
11 | ** This file is part of the tools module of the Qt GUI Toolkit.␊ |
12 | **␊ |
13 | ** This file may be distributed under the terms of the Q Public License␊ |
14 | ** as defined by Trolltech AS of Norway and appearing in the file␊ |
15 | ** LICENSE.QPL included in the packaging of this file.␊ |
16 | **␊ |
17 | ** This file may be distributed and/or modified under the terms of the␊ |
18 | ** GNU General Public License version 2 as published by the Free Software␊ |
19 | ** Foundation and appearing in the file LICENSE.GPL included in the␊ |
20 | ** packaging of this file.␊ |
21 | **␊ |
22 | ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition␊ |
23 | ** licenses may use this file in accordance with the Qt Commercial License␊ |
24 | ** Agreement provided with the Software.␊ |
25 | **␊ |
26 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE␊ |
27 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.␊ |
28 | **␊ |
29 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for␊ |
30 | ** information about Qt Commercial License Agreements.␊ |
31 | ** See http://www.trolltech.com/qpl/ for QPL licensing information.␊ |
32 | ** See http://www.trolltech.com/gpl/ for GPL licensing information.␊ |
33 | **␊ |
34 | ** Contact info@trolltech.com if any conditions of this licensing are␊ |
35 | ** not clear to you.␊ |
36 | **␊ |
37 | **********************************************************************/␊ |
38 | ␊ |
39 | #ifndef QSTRING_H␊ |
40 | #define QSTRING_H␊ |
41 | ␊ |
42 | #ifndef QT_H␊ |
43 | #include "qcstring.h"␊ |
44 | #endif // QT_H␊ |
45 | ␊ |
46 | ␊ |
47 | /*****************************************************************************␊ |
48 | QString class␊ |
49 | *****************************************************************************/␊ |
50 | ␊ |
51 | class QRegExp;␊ |
52 | class QString;␊ |
53 | class QCharRef;␊ |
54 | ␊ |
55 | class Q_EXPORT Q_PACKED QChar {␊ |
56 | public:␊ |
57 | QChar();␊ |
58 | QChar( char c );␊ |
59 | QChar( uchar c );␊ |
60 | QChar( uchar c, uchar r );␊ |
61 | QChar( const QChar& c );␊ |
62 | QChar( ushort rc );␊ |
63 | QChar( short rc );␊ |
64 | QChar( uint rc );␊ |
65 | QChar( int rc );␊ |
66 | ␊ |
67 | QT_STATIC_CONST QChar null; // 0000␊ |
68 | QT_STATIC_CONST QChar replacement; // FFFD␊ |
69 | QT_STATIC_CONST QChar byteOrderMark; // FEFF␊ |
70 | QT_STATIC_CONST QChar byteOrderSwapped; // FFFE␊ |
71 | QT_STATIC_CONST QChar nbsp; // 00A0␊ |
72 | ␊ |
73 | // Unicode information␊ |
74 | ␊ |
75 | enum Category␊ |
76 | {␊ |
77 | ␉NoCategory,␊ |
78 | ␊ |
79 | ␉Mark_NonSpacing,␉ // Mn␊ |
80 | ␉Mark_SpacingCombining,␉ // Mc␊ |
81 | ␉Mark_Enclosing,␉␉ // Me␊ |
82 | ␊ |
83 | ␉Number_DecimalDigit,␉ // Nd␊ |
84 | ␉Number_Letter,␉␉ // Nl␊ |
85 | ␉Number_Other,␉␉ // No␊ |
86 | ␊ |
87 | ␉Separator_Space,␉ // Zs␊ |
88 | ␉Separator_Line,␉␉ // Zl␊ |
89 | ␉Separator_Paragraph,␉ // Zp␊ |
90 | ␊ |
91 | ␉Other_Control,␉␉ // Cc␊ |
92 | ␉Other_Format,␉␉ // Cf␊ |
93 | ␉Other_Surrogate,␉ // Cs␊ |
94 | ␉Other_PrivateUse,␉ // Co␊ |
95 | ␉Other_NotAssigned,␉ // Cn␊ |
96 | ␊ |
97 | ␉Letter_Uppercase,␉ // Lu␊ |
98 | ␉Letter_Lowercase,␉ // Ll␊ |
99 | ␉Letter_Titlecase,␉ // Lt␊ |
100 | ␉Letter_Modifier,␉ // Lm␊ |
101 | ␉Letter_Other,␉␉ // Lo␊ |
102 | ␊ |
103 | ␉Punctuation_Connector,␉ // Pc␊ |
104 | ␉Punctuation_Dask,␉ // Pd␊ |
105 | ␉Punctuation_Open,␉ // Ps␊ |
106 | ␉Punctuation_Close,␉ // Pe␊ |
107 | ␉Punctuation_InitialQuote, // Pi␊ |
108 | ␉Punctuation_FinalQuote,␉ // Pf␊ |
109 | ␉Punctuation_Other,␉ // Po␊ |
110 | ␊ |
111 | ␉Symbol_Math,␉␉ // Sm␊ |
112 | ␉Symbol_Currency,␉ // Sc␊ |
113 | ␉Symbol_Modifier,␉ // Sk␊ |
114 | ␉Symbol_Other␉␉ // So␊ |
115 | };␊ |
116 | ␊ |
117 | enum Direction␊ |
118 | {␊ |
119 | ␉DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON,␊ |
120 | ␉DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN␊ |
121 | };␊ |
122 | ␊ |
123 | enum Decomposition␊ |
124 | {␊ |
125 | Single, Canonical, Font, NoBreak, Initial, Medial,␊ |
126 | Final, Isolated, Circle, Super, Sub, Vertical,␊ |
127 | Wide, Narrow, Small, Square, Compat, Fraction␊ |
128 | };␊ |
129 | ␊ |
130 | enum Joining␊ |
131 | {␊ |
132 | ␉OtherJoining, Dual, Right, Center␊ |
133 | };␊ |
134 | ␊ |
135 | // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO␊ |
136 | ␊ |
137 | int digitValue() const;␊ |
138 | QChar lower() const;␊ |
139 | QChar upper() const;␊ |
140 | ␊ |
141 | Category category() const;␊ |
142 | Direction direction() const;␊ |
143 | Joining joining() const;␊ |
144 | bool mirrored() const;␊ |
145 | QChar mirroredChar() const;␊ |
146 | QString decomposition() const;␊ |
147 | Decomposition decompositionTag() const;␊ |
148 | ␊ |
149 | char latin1() const { return rw ? 0 : cl; }␊ |
150 | ushort unicode() const { return (rw << 8) | cl; }␊ |
151 | #ifndef QT_NO_CAST_ASCII␊ |
152 | // like all ifdef'd code this is undocumented␊ |
153 | operator char() const { return latin1(); }␊ |
154 | #endif␊ |
155 | ␊ |
156 | bool isNull() const { return unicode()==0; }␊ |
157 | bool isPrint() const;␊ |
158 | bool isPunct() const;␊ |
159 | bool isSpace() const;␊ |
160 | bool isMark() const;␊ |
161 | bool isLetter() const;␊ |
162 | bool isNumber() const;␊ |
163 | bool isLetterOrNumber() const;␊ |
164 | bool isDigit() const;␊ |
165 | ␊ |
166 | uchar& cell() { return cl; }␊ |
167 | uchar& row() { return rw; }␊ |
168 | uchar cell() const { return cl; }␊ |
169 | uchar row() const { return rw; }␊ |
170 | ␊ |
171 | static bool networkOrdered() { return (int)net_ordered == 1; }␊ |
172 | ␊ |
173 | friend inline int operator==( char ch, QChar c );␊ |
174 | friend inline int operator==( QChar c, char ch );␊ |
175 | friend inline int operator==( QChar c1, QChar c2 );␊ |
176 | friend inline int operator!=( QChar c1, QChar c2 );␊ |
177 | friend inline int operator!=( char ch, QChar c );␊ |
178 | friend inline int operator!=( QChar c, char ch );␊ |
179 | friend inline int operator<=( QChar c, char ch );␊ |
180 | friend inline int operator<=( char ch, QChar c );␊ |
181 | friend inline int operator<=( QChar c1, QChar c2 );␊ |
182 | ␊ |
183 | private:␊ |
184 | #if defined(_WS_X11_) || defined(_OS_WIN32_BYTESWAP_) || defined( _WS_QWS_ )␊ |
185 | // XChar2b on X11, ushort on _OS_WIN32_BYTESWAP_␊ |
186 | //### QWS must be defined on a platform by platform basis␊ |
187 | uchar rw;␊ |
188 | uchar cl;␊ |
189 | #if defined(QT_QSTRING_UCS_4)␊ |
190 | ushort grp;␊ |
191 | #endif␊ |
192 | enum { net_ordered = 1 };␊ |
193 | #else␊ |
194 | // ushort on _OS_WIN32_␊ |
195 | uchar cl;␊ |
196 | uchar rw;␊ |
197 | #if defined(QT_QSTRING_UCS_4)␊ |
198 | ushort grp;␊ |
199 | #endif␊ |
200 | enum { net_ordered = 0 };␊ |
201 | #endif␊ |
202 | };␊ |
203 | ␊ |
204 | inline QChar::QChar()␊ |
205 | {␊ |
206 | rw = 0; cl = 0;␊ |
207 | #ifdef QT_QSTRING_UCS_4␊ |
208 | grp = 0;␊ |
209 | #endif␊ |
210 | }␊ |
211 | inline QChar::QChar( char c )␊ |
212 | {␊ |
213 | rw = 0; cl = (uchar)c;␊ |
214 | #ifdef QT_QSTRING_UCS_4␊ |
215 | grp = 0;␊ |
216 | #endif␊ |
217 | }␊ |
218 | inline QChar::QChar( uchar c )␊ |
219 | {␊ |
220 | rw = 0; cl = c;␊ |
221 | #ifdef QT_QSTRING_UCS_4␊ |
222 | grp = 0;␊ |
223 | #endif␊ |
224 | }␊ |
225 | inline QChar::QChar( uchar c, uchar r )␊ |
226 | {␊ |
227 | rw = r; cl = c;␊ |
228 | #ifdef QT_QSTRING_UCS_4␊ |
229 | grp = 0;␊ |
230 | #endif␊ |
231 | }␊ |
232 | inline QChar::QChar( const QChar& c )␊ |
233 | {␊ |
234 | rw = c.rw; cl = c.cl;␊ |
235 | #ifdef QT_QSTRING_UCS_4␊ |
236 | grp = 0;␊ |
237 | #endif␊ |
238 | }␊ |
239 | inline QChar::QChar( ushort rc )␊ |
240 | {␊ |
241 | rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);␊ |
242 | #ifdef QT_QSTRING_UCS_4␊ |
243 | grp = 0;␊ |
244 | #endif␊ |
245 | }␊ |
246 | inline QChar::QChar( short rc )␊ |
247 | {␊ |
248 | rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);␊ |
249 | #ifdef QT_QSTRING_UCS_4␊ |
250 | grp = 0;␊ |
251 | #endif␊ |
252 | }␊ |
253 | inline QChar::QChar( uint rc )␊ |
254 | {␊ |
255 | rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);␊ |
256 | #ifdef QT_QSTRING_UCS_4␊ |
257 | grp = 0;␊ |
258 | #endif␊ |
259 | }␊ |
260 | inline QChar::QChar( int rc )␊ |
261 | {␊ |
262 | rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);␊ |
263 | #ifdef QT_QSTRING_UCS_4␊ |
264 | grp = 0;␊ |
265 | #endif␊ |
266 | }␊ |
267 | ␊ |
268 | ␊ |
269 | inline int operator==( char ch, QChar c )␊ |
270 | {␊ |
271 | return ch == c.cl && !c.rw;␊ |
272 | }␊ |
273 | ␊ |
274 | inline int operator==( QChar c, char ch )␊ |
275 | {␊ |
276 | return ch == c.cl && !c.rw;␊ |
277 | }␊ |
278 | ␊ |
279 | inline int operator==( QChar c1, QChar c2 )␊ |
280 | {␊ |
281 | return c1.cl == c2.cl␊ |
282 | ␉&& c1.rw == c2.rw;␊ |
283 | }␊ |
284 | ␊ |
285 | inline int operator!=( QChar c1, QChar c2 )␊ |
286 | {␊ |
287 | return c1.cl != c2.cl␊ |
288 | ␉|| c1.rw != c2.rw;␊ |
289 | }␊ |
290 | ␊ |
291 | inline int operator!=( char ch, QChar c )␊ |
292 | {␊ |
293 | return ch != c.cl || c.rw;␊ |
294 | }␊ |
295 | ␊ |
296 | inline int operator!=( QChar c, char ch )␊ |
297 | {␊ |
298 | return ch != c.cl || c.rw;␊ |
299 | }␊ |
300 | ␊ |
301 | inline int operator<=( QChar c, char ch )␊ |
302 | {␊ |
303 | return !(ch < c.cl || c.rw);␊ |
304 | }␊ |
305 | ␊ |
306 | inline int operator<=( char ch, QChar c )␊ |
307 | {␊ |
308 | return ch <= c.cl || c.rw;␊ |
309 | }␊ |
310 | ␊ |
311 | inline int operator<=( QChar c1, QChar c2 )␊ |
312 | {␊ |
313 | return c1.rw > c2.rw␊ |
314 | ␉? FALSE␊ |
315 | ␉: c1.rw < c2.rw␊ |
316 | ␉ ? TRUE␊ |
317 | ␉ : c1.cl <= c2.cl;␊ |
318 | }␊ |
319 | ␊ |
320 | inline int operator>=( QChar c, char ch ) { return ch <= c; }␊ |
321 | inline int operator>=( char ch, QChar c ) { return c <= ch; }␊ |
322 | inline int operator>=( QChar c1, QChar c2 ) { return c2 <= c1; }␊ |
323 | inline int operator<( QChar c, char ch ) { return !(ch<=c); }␊ |
324 | inline int operator<( char ch, QChar c ) { return !(c<=ch); }␊ |
325 | inline int operator<( QChar c1, QChar c2 ) { return !(c2<=c1); }␊ |
326 | inline int operator>( QChar c, char ch ) { return !(ch>=c); }␊ |
327 | inline int operator>( char ch, QChar c ) { return !(c>=ch); }␊ |
328 | inline int operator>( QChar c1, QChar c2 ) { return !(c2>=c1); }␊ |
329 | ␊ |
330 | // internal␊ |
331 | struct Q_EXPORT QStringData : public QShared {␊ |
332 | QStringData() :␊ |
333 | ␉unicode(0), ascii(0), len(0), maxl(0), dirtyascii(0) { ref(); }␊ |
334 | QStringData(QChar *u, uint l, uint m) :␊ |
335 | ␉unicode(u), ascii(0), len(l), maxl(m), dirtyascii(0) { }␊ |
336 | ␊ |
337 | ~QStringData() { if ( unicode ) delete[] ((char*)unicode);␊ |
338 | if ( ascii ) delete[] ascii; }␊ |
339 | ␊ |
340 | void deleteSelf();␊ |
341 | QChar *unicode;␊ |
342 | char *ascii;␊ |
343 | uint len;␊ |
344 | uint maxl:30;␊ |
345 | uint dirtyascii:1;␊ |
346 | };␊ |
347 | ␊ |
348 | ␊ |
349 | class Q_EXPORT QString␊ |
350 | {␊ |
351 | public:␊ |
352 | QString();␉␉␉␉␉// make null string␊ |
353 | QString( QChar );␉␉␉␉// one-char string␊ |
354 | QString( const QString & );␉␉␉// impl-shared copy␊ |
355 | QString( const QByteArray& );␉␉// deep copy␊ |
356 | QString( const QCString& );␉␉ // deep copy␊ |
357 | QString( const QChar* unicode, uint length ); // deep copy␊ |
358 | #ifndef QT_NO_CAST_ASCII␊ |
359 | QString( const char *str );␉␉␉// deep copy␊ |
360 | #endif␊ |
361 | ~QString();␊ |
362 | ␊ |
363 | QString &operator=( const QString & );␉// impl-shared copy␊ |
364 | #ifndef QT_NO_CAST_ASCII␊ |
365 | QString &operator=( const char * );␉// deep copy␊ |
366 | #endif␊ |
367 | QString &operator=( const QCString& );␉// deep copy␊ |
368 | QString &operator=( QChar c );␊ |
369 | QString &operator=( char c );␊ |
370 | ␊ |
371 | //QT_STATIC_CONST QString null;␊ |
372 | //bool␉isNull()␉const;␊ |
373 | ␊ |
374 | struct Null { };␊ |
375 | static const Null null;␊ |
376 | inline QString(const Null &): d(shared_null) { d->ref(); }␊ |
377 | inline QString &operator=(const Null &) { *this = QString(); return *this; }␊ |
378 | inline bool isNull() const { return d == shared_null; }␊ |
379 | ␊ |
380 | bool␉isEmpty()␉const;␊ |
381 | uint␉length()␉const;␊ |
382 | void␉truncate( uint pos );␊ |
383 | ␊ |
384 | #if QT_VERSION >= 300␊ |
385 | #error "fill() Should return *this, or QChar constructor should take count=1"␊ |
386 | #endif␊ |
387 | void␉fill( QChar c, int len = -1 );␊ |
388 | ␊ |
389 | QString␉copy()␉const;␊ |
390 | ␊ |
391 | QString arg(long a, int fieldwidth=0, int base=10) const;␊ |
392 | QString arg(ulong a, int fieldwidth=0, int base=10) const;␊ |
393 | QString arg(int a, int fieldwidth=0, int base=10) const;␊ |
394 | QString arg(uint a, int fieldwidth=0, int base=10) const;␊ |
395 | QString arg(short a, int fieldwidth=0, int base=10) const;␊ |
396 | QString arg(ushort a, int fieldwidth=0, int base=10) const;␊ |
397 | QString arg(char a, int fieldwidth=0) const;␊ |
398 | QString arg(QChar a, int fieldwidth=0) const;␊ |
399 | QString arg(const QString& a, int fieldwidth=0) const;␊ |
400 | QString arg(double a, int fieldwidth=0, char fmt='g', int prec=-1) const;␊ |
401 | ␊ |
402 | QString &sprintf( const char* format, ... )␊ |
403 | #if defined(_CC_GNU_) && !defined(__INSURE__)␊ |
404 | ␉__attribute__ ((format (printf, 2, 3)))␊ |
405 | #endif␊ |
406 | ␉;␊ |
407 | ␊ |
408 | int␉␉find( QChar c, int index=0, bool cs=TRUE ) const;␊ |
409 | int␉␉find( char c, int index=0, bool cs=TRUE ) const;␊ |
410 | int␉␉find( const QString &str, int index=0, bool cs=TRUE ) const;␊ |
411 | int␉␉find( const QRegExp &, int index=0 ) const;␊ |
412 | #ifndef QT_NO_CAST_ASCII␊ |
413 | int␉␉find( const char* str, int index=0 ) const;␊ |
414 | #endif␊ |
415 | int␉␉findRev( QChar c, int index=-1, bool cs=TRUE) const;␊ |
416 | int␉␉findRev( char c, int index=-1, bool cs=TRUE) const;␊ |
417 | int␉␉findRev( const QString &str, int index=-1, bool cs=TRUE) const;␊ |
418 | int␉␉findRev( const QRegExp &, int index=-1 ) const;␊ |
419 | #ifndef QT_NO_CAST_ASCII␊ |
420 | int␉␉findRev( const char* str, int index=-1 ) const;␊ |
421 | #endif␊ |
422 | int␉␉contains( QChar c, bool cs=TRUE ) const;␊ |
423 | int␉␉contains( char c, bool cs=TRUE ) const␊ |
424 | ␉␉ { return contains(QChar(c), cs); }␊ |
425 | #ifndef QT_NO_CAST_ASCII␊ |
426 | int␉␉contains( const char* str, bool cs=TRUE ) const;␊ |
427 | #endif␊ |
428 | int␉␉contains( const QString &str, bool cs=TRUE ) const;␊ |
429 | int␉␉contains( const QRegExp & ) const;␊ |
430 | ␊ |
431 | QString␉left( uint len ) const;␊ |
432 | QString␉right( uint len ) const;␊ |
433 | QString␉mid( uint index, uint len=0xffffffff) const;␊ |
434 | ␊ |
435 | QString␉leftJustify( uint width, QChar fill=' ', bool trunc=FALSE)const;␊ |
436 | QString␉rightJustify( uint width, QChar fill=' ',bool trunc=FALSE)const;␊ |
437 | ␊ |
438 | QString␉lower() const;␊ |
439 | QString␉upper() const;␊ |
440 | ␊ |
441 | QString␉stripWhiteSpace()␉const;␊ |
442 | QString␉simplifyWhiteSpace()␉const;␊ |
443 | ␊ |
444 | QString &insert( uint index, const QString & );␊ |
445 | QString &insert( uint index, const QChar*, uint len );␊ |
446 | QString &insert( uint index, QChar );␊ |
447 | QString &insert( uint index, char c ) { return insert(index,QChar(c)); }␊ |
448 | QString &append( char );␊ |
449 | QString &append( QChar );␊ |
450 | QString &append( const QString & );␊ |
451 | QString &prepend( char );␊ |
452 | QString &prepend( QChar );␊ |
453 | QString &prepend( const QString & );␊ |
454 | QString &remove( uint index, uint len );␊ |
455 | QString &replace( uint index, uint len, const QString & );␊ |
456 | QString &replace( uint index, uint len, const QChar*, uint clen );␊ |
457 | QString &replace( const QRegExp &, const QString & );␊ |
458 | ␊ |
459 | short␉toShort( bool *ok=0, int base=10 )␉const;␊ |
460 | ushort␉toUShort( bool *ok=0, int base=10 )␉const;␊ |
461 | int␉␉toInt( bool *ok=0, int base=10 )␉const;␊ |
462 | uint␉toUInt( bool *ok=0, int base=10 )␉const;␊ |
463 | long␉toLong( bool *ok=0, int base=10 )␉const;␊ |
464 | ulong␉toULong( bool *ok=0, int base=10 )␉const;␊ |
465 | float␉toFloat( bool *ok=0 )␉const;␊ |
466 | double␉toDouble( bool *ok=0 )␉const;␊ |
467 | ␊ |
468 | QString &setNum( short, int base=10 );␊ |
469 | QString &setNum( ushort, int base=10 );␊ |
470 | QString &setNum( int, int base=10 );␊ |
471 | QString &setNum( uint, int base=10 );␊ |
472 | QString &setNum( long, int base=10 );␊ |
473 | QString &setNum( ulong, int base=10 );␊ |
474 | QString &setNum( float, char f='g', int prec=6 );␊ |
475 | QString &setNum( double, char f='g', int prec=6 );␊ |
476 | ␊ |
477 | static QString number( long, int base=10 );␊ |
478 | static QString number( ulong, int base=10);␊ |
479 | static QString number( int, int base=10 );␊ |
480 | static QString number( uint, int base=10);␊ |
481 | static QString number( double, char f='g', int prec=6 );␊ |
482 | ␊ |
483 | void␉setExpand( uint index, QChar c );␊ |
484 | ␊ |
485 | QString &operator+=( const QString &str );␊ |
486 | QString &operator+=( QChar c );␊ |
487 | QString &operator+=( char c );␊ |
488 | ␊ |
489 | // Your compiler is smart enough to use the const one if it can.␊ |
490 | QChar at( uint i ) const␊ |
491 | ␉{ return i<d->len ? d->unicode[i] : QChar::null; }␊ |
492 | QChar operator[]( int i ) const { return at((uint)i); }␊ |
493 | QCharRef at( uint i );␊ |
494 | QCharRef operator[]( int i );␊ |
495 | ␊ |
496 | QChar constref(uint i) const␊ |
497 | ␉{ return at(i); }␊ |
498 | QChar& ref(uint i)␊ |
499 | ␉{ // Optimized for easy-inlining by simple compilers.␊ |
500 | ␉ if (d->count!=1 || i>=d->len)␊ |
501 | ␉␉subat(i);␊ |
502 | ␉ d->dirtyascii=1;␊ |
503 | ␉ return d->unicode[i];␊ |
504 | ␉}␊ |
505 | ␊ |
506 | const QChar* unicode() const { return d->unicode; }␊ |
507 | const char* ascii() const;␊ |
508 | const char* latin1() const;␊ |
509 | static QString fromLatin1(const char*, int len=-1);␊ |
510 | const unsigned short *ucs2() const;␊ |
511 | static QString fromUcs2( const unsigned short *ucs2 );␊ |
512 | #ifndef QT_NO_TEXTCODEC␊ |
513 | QCString utf8() const;␊ |
514 | static QString fromUtf8(const char*, int len=-1);␊ |
515 | #endif␊ |
516 | QCString local8Bit() const;␊ |
517 | static QString fromLocal8Bit(const char*, int len=-1);␊ |
518 | bool operator!() const;␊ |
519 | #ifndef QT_NO_ASCII_CAST␊ |
520 | operator const char *() const { return latin1(); }␊ |
521 | #endif␊ |
522 | ␊ |
523 | QString &setUnicode( const QChar* unicode, uint len );␊ |
524 | QString &setUnicodeCodes( const ushort* unicode_as_ushorts, uint len );␊ |
525 | QString &setLatin1( const char*, int len=-1 );␊ |
526 | ␊ |
527 | int compare( const QString& s ) const;␊ |
528 | static int compare( const QString& s1, const QString& s2 )␊ |
529 | ␉{ return s1.compare(s2); }␊ |
530 | ␊ |
531 | #ifndef QT_NO_DATASTREAM␊ |
532 | friend Q_EXPORT QDataStream &operator>>( QDataStream &, QString & );␊ |
533 | #endif␊ |
534 | // new functions for BiDi␊ |
535 | void compose();␊ |
536 | QChar::Direction basicDirection();␊ |
537 | QString visual(int index = 0, int len = -1);␊ |
538 | ␊ |
539 | #ifndef QT_NO_COMPAT␊ |
540 | const char* data() const { return latin1(); }␊ |
541 | #endif␊ |
542 | ␊ |
543 | bool startsWith( const QString& ) const;␊ |
544 | ␊ |
545 | private:␊ |
546 | QString( int size, bool dummy );␉␉// allocate size incl. \0␊ |
547 | ␊ |
548 | void deref();␊ |
549 | void real_detach();␊ |
550 | void setLength( uint pos );␊ |
551 | void subat( uint );␊ |
552 | bool findArg(int& pos, int& len) const;␊ |
553 | ␊ |
554 | static QChar* asciiToUnicode( const char*, uint * len, uint maxlen=(uint)-1 );␊ |
555 | static QChar* asciiToUnicode( const QByteArray&, uint * len );␊ |
556 | static char* unicodeToAscii( const QChar*, uint len );␊ |
557 | ␊ |
558 | QStringData *d;␊ |
559 | static QStringData* shared_null;␊ |
560 | static QStringData* makeSharedNull();␊ |
561 | ␊ |
562 | friend class QConstString;␊ |
563 | QString(QStringData* dd, bool /*dummy*/) : d(dd) { }␊ |
564 | };␊ |
565 | ␊ |
566 | class Q_EXPORT QCharRef {␊ |
567 | friend class QString;␊ |
568 | QString& s;␊ |
569 | uint p;␊ |
570 | QCharRef(QString* str, uint pos) : s(*str), p(pos) { }␊ |
571 | ␊ |
572 | public:␊ |
573 | // Most QChar operations repeated here...␊ |
574 | ␊ |
575 | // all this is not documented: We just say "like QChar" and let it be.␊ |
576 | #if 1␊ |
577 | ushort unicode() const { return s.constref(p).unicode(); }␊ |
578 | char latin1() const { return s.constref(p).latin1(); }␊ |
579 | ␊ |
580 | // An operator= for each QChar cast constructor...␊ |
581 | QCharRef operator=(char c ) { s.ref(p)=c; return *this; }␊ |
582 | QCharRef operator=(uchar c ) { s.ref(p)=c; return *this; }␊ |
583 | QCharRef operator=(QChar c ) { s.ref(p)=c; return *this; }␊ |
584 | QCharRef operator=(const QCharRef& c ) { s.ref(p)=c.unicode(); return *this; }␊ |
585 | QCharRef operator=(ushort rc ) { s.ref(p)=rc; return *this; }␊ |
586 | QCharRef operator=(short rc ) { s.ref(p)=rc; return *this; }␊ |
587 | QCharRef operator=(uint rc ) { s.ref(p)=rc; return *this; }␊ |
588 | QCharRef operator=(int rc ) { s.ref(p)=rc; return *this; }␊ |
589 | ␊ |
590 | operator QChar () const { return s.constref(p); }␊ |
591 | ␊ |
592 | // each function...␊ |
593 | bool isNull() const { return unicode()==0; }␊ |
594 | bool isPrint() const { return s.constref(p).isPrint(); }␊ |
595 | bool isPunct() const { return s.constref(p).isPunct(); }␊ |
596 | bool isSpace() const { return s.constref(p).isSpace(); }␊ |
597 | bool isMark() const { return s.constref(p).isMark(); }␊ |
598 | bool isLetter() const { return s.constref(p).isLetter(); }␊ |
599 | bool isNumber() const { return s.constref(p).isNumber(); }␊ |
600 | bool isLetterOrNumber() { return s.constref(p).isLetterOrNumber(); }␊ |
601 | bool isDigit() const { return s.constref(p).isDigit(); }␊ |
602 | ␊ |
603 | int digitValue() const { return s.constref(p).digitValue(); }␊ |
604 | QChar lower() { return s.constref(p).lower(); }␊ |
605 | QChar upper() { return s.constref(p).upper(); }␊ |
606 | ␊ |
607 | QChar::Category category() const { return s.constref(p).category(); }␊ |
608 | QChar::Direction direction() const { return s.constref(p).direction(); }␊ |
609 | QChar::Joining joining() const { return s.constref(p).joining(); }␊ |
610 | bool mirrored() const { return s.constref(p).mirrored(); }␊ |
611 | QChar mirroredChar() const { return s.constref(p).mirroredChar(); }␊ |
612 | QString decomposition() const { return s.constref(p).decomposition(); }␊ |
613 | QChar::Decomposition decompositionTag() const { return s.constref(p).decompositionTag(); }␊ |
614 | ␊ |
615 | // Not the non-const ones of these.␊ |
616 | uchar cell() const { return s.constref(p).cell(); }␊ |
617 | uchar row() const { return s.constref(p).row(); }␊ |
618 | #endif␊ |
619 | };␊ |
620 | ␊ |
621 | inline QCharRef QString::at( uint i ) { return QCharRef(this,i); }␊ |
622 | inline QCharRef QString::operator[]( int i ) { return at((uint)i); }␊ |
623 | ␊ |
624 | ␊ |
625 | class Q_EXPORT QConstString : private QString {␊ |
626 | public:␊ |
627 | QConstString( QChar* unicode, uint length );␊ |
628 | ~QConstString();␊ |
629 | const QString& string() const { return *this; }␊ |
630 | };␊ |
631 | ␊ |
632 | ␊ |
633 | /*****************************************************************************␊ |
634 | QString stream functions␊ |
635 | *****************************************************************************/␊ |
636 | #ifndef QT_NO_DATASTREAM␊ |
637 | Q_EXPORT QDataStream &operator<<( QDataStream &, const QString & );␊ |
638 | Q_EXPORT QDataStream &operator>>( QDataStream &, QString & );␊ |
639 | #endif␊ |
640 | ␊ |
641 | /*****************************************************************************␊ |
642 | QString inline functions␊ |
643 | *****************************************************************************/␊ |
644 | ␊ |
645 | // These two move code into makeSharedNull() and deletesData()␊ |
646 | // to improve cache-coherence (and reduce code bloat), while␊ |
647 | // keeping the common cases fast.␊ |
648 | //␊ |
649 | // No safe way to pre-init shared_null on ALL compilers/linkers.␊ |
650 | inline QString::QString() :␊ |
651 | d(shared_null ? shared_null : makeSharedNull())␊ |
652 | {␊ |
653 | d->ref();␊ |
654 | }␊ |
655 | //␊ |
656 | inline QString::~QString()␊ |
657 | {␊ |
658 | if ( d->deref() ) {␊ |
659 | ␉if ( d == shared_null )␊ |
660 | ␉ shared_null = 0;␊ |
661 | ␉d->deleteSelf();␊ |
662 | }␊ |
663 | }␊ |
664 | ␊ |
665 | inline QString &QString::operator=( QChar c )␊ |
666 | { return *this = QString(c); }␊ |
667 | ␊ |
668 | inline QString &QString::operator=( char c )␊ |
669 | { return *this = QString(QChar(c)); }␊ |
670 | ␊ |
671 | //inline bool QString::isNull() const␊ |
672 | //{ return unicode() == 0; }␊ |
673 | ␊ |
674 | inline bool QString::operator!() const␊ |
675 | { return isNull(); }␊ |
676 | ␊ |
677 | inline uint QString::length() const␊ |
678 | { return d->len; }␊ |
679 | ␊ |
680 | inline bool QString::isEmpty() const␊ |
681 | { return length() == 0; }␊ |
682 | ␊ |
683 | inline QString QString::copy() const␊ |
684 | { return QString( *this ); }␊ |
685 | ␊ |
686 | inline QString &QString::prepend( const QString & s )␊ |
687 | { return insert(0,s); }␊ |
688 | ␊ |
689 | inline QString &QString::prepend( QChar c )␊ |
690 | { return insert(0,c); }␊ |
691 | ␊ |
692 | inline QString &QString::prepend( char c )␊ |
693 | { return insert(0,c); }␊ |
694 | ␊ |
695 | inline QString &QString::append( const QString & s )␊ |
696 | { return operator+=(s); }␊ |
697 | ␊ |
698 | inline QString &QString::append( QChar c )␊ |
699 | { return operator+=(c); }␊ |
700 | ␊ |
701 | inline QString &QString::append( char c )␊ |
702 | { return operator+=(c); }␊ |
703 | ␊ |
704 | inline QString &QString::setNum( short n, int base )␊ |
705 | { return setNum((long)n, base); }␊ |
706 | ␊ |
707 | inline QString &QString::setNum( ushort n, int base )␊ |
708 | { return setNum((ulong)n, base); }␊ |
709 | ␊ |
710 | inline QString &QString::setNum( int n, int base )␊ |
711 | { return setNum((long)n, base); }␊ |
712 | ␊ |
713 | inline QString &QString::setNum( uint n, int base )␊ |
714 | { return setNum((ulong)n, base); }␊ |
715 | ␊ |
716 | inline QString &QString::setNum( float n, char f, int prec )␊ |
717 | { return setNum((double)n,f,prec); }␊ |
718 | ␊ |
719 | inline QString QString::arg(int a, int fieldwidth, int base) const␊ |
720 | { return arg((long)a, fieldwidth, base); }␊ |
721 | ␊ |
722 | inline QString QString::arg(uint a, int fieldwidth, int base) const␊ |
723 | { return arg((ulong)a, fieldwidth, base); }␊ |
724 | ␊ |
725 | inline QString QString::arg(short a, int fieldwidth, int base) const␊ |
726 | { return arg((long)a, fieldwidth, base); }␊ |
727 | ␊ |
728 | inline QString QString::arg(ushort a, int fieldwidth, int base) const␊ |
729 | { return arg((ulong)a, fieldwidth, base); }␊ |
730 | ␊ |
731 | inline int QString::find( char c, int index, bool cs ) const␊ |
732 | { return find(QChar(c), index, cs); }␊ |
733 | ␊ |
734 | inline int QString::findRev( char c, int index, bool cs) const␊ |
735 | { return findRev( QChar(c), index, cs ); }␊ |
736 | ␊ |
737 | ␊ |
738 | #ifndef QT_NO_CAST_ASCII␊ |
739 | inline int QString::find( const char* str, int index ) const␊ |
740 | { return find(QString::fromLatin1(str), index); }␊ |
741 | ␊ |
742 | inline int QString::findRev( const char* str, int index ) const␊ |
743 | { return findRev(QString::fromLatin1(str), index); }␊ |
744 | #endif␊ |
745 | ␊ |
746 | ␊ |
747 | /*****************************************************************************␊ |
748 | QString non-member operators␊ |
749 | *****************************************************************************/␊ |
750 | ␊ |
751 | Q_EXPORT bool operator!=( const QString &s1, const QString &s2 );␊ |
752 | Q_EXPORT bool operator<( const QString &s1, const QString &s2 );␊ |
753 | Q_EXPORT bool operator<=( const QString &s1, const QString &s2 );␊ |
754 | Q_EXPORT bool operator==( const QString &s1, const QString &s2 );␊ |
755 | Q_EXPORT bool operator>( const QString &s1, const QString &s2 );␊ |
756 | Q_EXPORT bool operator>=( const QString &s1, const QString &s2 );␊ |
757 | #ifndef QT_NO_CAST_ASCII␊ |
758 | Q_EXPORT bool operator!=( const QString &s1, const char *s2 );␊ |
759 | Q_EXPORT bool operator<( const QString &s1, const char *s2 );␊ |
760 | Q_EXPORT bool operator<=( const QString &s1, const char *s2 );␊ |
761 | Q_EXPORT bool operator==( const QString &s1, const char *s2 );␊ |
762 | Q_EXPORT bool operator>( const QString &s1, const char *s2 );␊ |
763 | Q_EXPORT bool operator>=( const QString &s1, const char *s2 );␊ |
764 | Q_EXPORT bool operator!=( const char *s1, const QString &s2 );␊ |
765 | Q_EXPORT bool operator<( const char *s1, const QString &s2 );␊ |
766 | Q_EXPORT bool operator<=( const char *s1, const QString &s2 );␊ |
767 | Q_EXPORT bool operator==( const char *s1, const QString &s2 );␊ |
768 | //Q_EXPORT bool operator>( const char *s1, const QString &s2 ); // MSVC++␊ |
769 | Q_EXPORT bool operator>=( const char *s1, const QString &s2 );␊ |
770 | #endif␊ |
771 | ␊ |
772 | Q_EXPORT inline QString operator+( const QString &s1, const QString &s2 )␊ |
773 | {␊ |
774 | QString tmp( s1 );␊ |
775 | tmp += s2;␊ |
776 | return tmp;␊ |
777 | }␊ |
778 | ␊ |
779 | #ifndef QT_NO_CAST_ASCII␊ |
780 | Q_EXPORT inline QString operator+( const QString &s1, const char *s2 )␊ |
781 | {␊ |
782 | QString tmp( s1 );␊ |
783 | tmp += QString::fromLatin1(s2);␊ |
784 | return tmp;␊ |
785 | }␊ |
786 | ␊ |
787 | Q_EXPORT inline QString operator+( const char *s1, const QString &s2 )␊ |
788 | {␊ |
789 | QString tmp = QString::fromLatin1( s1 );␊ |
790 | tmp += s2;␊ |
791 | return tmp;␊ |
792 | }␊ |
793 | #endif␊ |
794 | ␊ |
795 | Q_EXPORT inline QString operator+( const QString &s1, QChar c2 )␊ |
796 | {␊ |
797 | QString tmp( s1 );␊ |
798 | tmp += c2;␊ |
799 | return tmp;␊ |
800 | }␊ |
801 | ␊ |
802 | Q_EXPORT inline QString operator+( const QString &s1, char c2 )␊ |
803 | {␊ |
804 | QString tmp( s1 );␊ |
805 | tmp += c2;␊ |
806 | return tmp;␊ |
807 | }␊ |
808 | ␊ |
809 | Q_EXPORT inline QString operator+( QChar c1, const QString &s2 )␊ |
810 | {␊ |
811 | QString tmp;␊ |
812 | tmp += c1;␊ |
813 | tmp += s2;␊ |
814 | return tmp;␊ |
815 | }␊ |
816 | ␊ |
817 | Q_EXPORT inline QString operator+( char c1, const QString &s2 )␊ |
818 | {␊ |
819 | QString tmp;␊ |
820 | tmp += c1;␊ |
821 | tmp += s2;␊ |
822 | return tmp;␊ |
823 | }␊ |
824 | ␊ |
825 | #if defined(_OS_WIN32_)␊ |
826 | extern Q_EXPORT QString qt_winQString(void*);␊ |
827 | extern Q_EXPORT const void* qt_winTchar(const QString& str, bool addnul);␊ |
828 | extern Q_EXPORT void* qt_winTchar_new(const QString& str);␊ |
829 | extern Q_EXPORT QCString qt_winQString2MB( const QString& s, int len=-1 );␊ |
830 | extern Q_EXPORT QString qt_winMB2QString( const char* mb, int len=-1 );␊ |
831 | #endif␊ |
832 | ␊ |
833 | #endif // QSTRING_H␊ |
834 |