- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files
- Directories
- Examples

- File List
- File Members

# qchar.h

Go to the documentation of this file.

    00001 /****************************************************************************
    00002 **
    00003 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    00004 ** All rights reserved.
    00005 ** Contact: Nokia Corporation (qt-info@nokia.com)
    00006 **
    00007 ** This file is part of the QtCore module of the Qt Toolkit.
    00008 **
    00009 ** $QT_BEGIN_LICENSE:LGPL$
    00010 ** Commercial Usage
    00011 ** Licensees holding valid Qt Commercial licenses may use this file in
    00012 ** accordance with the Qt Commercial License Agreement provided with the
    00013 ** Software or, alternatively, in accordance with the terms contained in
    00014 ** a written agreement between you and Nokia.
    00015 **
    00016 ** GNU Lesser General Public License Usage
    00017 ** Alternatively, this file may be used under the terms of the GNU Lesser
    00018 ** General Public License version 2.1 as published by the Free Software
    00019 ** Foundation and appearing in the file LICENSE.LGPL included in the
    00020 ** packaging of this file.  Please review the following information to
    00021 ** ensure the GNU Lesser General Public License version 2.1 requirements
    00022 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    00023 **
    00024 ** In addition, as a special exception, Nokia gives you certain additional
    00025 ** rights.  These rights are described in the Nokia Qt LGPL Exception
    00026 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this module.
    00027 **
    00028 ** GNU General Public License Usage
    00029 ** Alternatively, this file may be used under the terms of the GNU
    00030 ** General Public License version 3.0 as published by the Free Software
    00031 ** Foundation and appearing in the file LICENSE.GPL included in the
    00032 ** packaging of this file.  Please review the following information to
    00033 ** ensure the GNU General Public License version 3.0 requirements will be
    00034 ** met: http://www.gnu.org/copyleft/gpl.html.
    00035 **
    00036 ** If you have questions regarding the use of this file, please contact
    00037 ** Nokia at qt-info@nokia.com.
    00038 ** $QT_END_LICENSE$
    00039 **
    00040 ****************************************************************************/
    00041
    00042 #ifndef QCHAR_H
    00043 #define QCHAR_H
    00044
    00045 #include <QtCore/qglobal.h>
    00046
    00047 QT_BEGIN_HEADER
    00048
    00049 QT_BEGIN_NAMESPACE
    00050
    00051 QT_MODULE(Core)
    00052
    00053 class QString;
    00054
    00055 struct QLatin1Char
    00056 {
    00057 public:
    00058     inline explicit QLatin1Char(char c) : ch(c) {}
    00059 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
    00060     inline const char toLatin1() const { return ch; }
    00061     inline const ushort unicode() const { return ushort(uchar(ch)); }
    00062 #else
    00063     inline char toLatin1() const { return ch; }
    00064     inline ushort unicode() const { return ushort(uchar(ch)); }
    00065 #endif
    00066
    00067 private:
    00068     char ch;
    00069 };
    00070
    00071
    00072 class Q_CORE_EXPORT QChar {
    00073 public:
    00074     QChar();
    00075 #ifndef QT_NO_CAST_FROM_ASCII
    00076     QT_ASCII_CAST_WARN_CONSTRUCTOR QChar(char c);
    00077     QT_ASCII_CAST_WARN_CONSTRUCTOR QChar(uchar c);
    00078 #endif
    00079     QChar(QLatin1Char ch);
    00080     QChar(uchar c, uchar r);
    00081     inline QChar(ushort rc) : ucs(rc){}
    00082     QChar(short rc);
    00083     QChar(uint rc);
    00084     QChar(int rc);
    00085     enum SpecialCharacter {
    00086         Null = 0x0000,
    00087         Nbsp = 0x00a0,
    00088         ReplacementCharacter = 0xfffd,
    00089         ObjectReplacementCharacter = 0xfffc,
    00090         ByteOrderMark = 0xfeff,
    00091         ByteOrderSwapped = 0xfffe,
    00092 #ifdef QT3_SUPPORT
    00093         null = Null,
    00094         replacement = ReplacementCharacter,
    00095         byteOrderMark = ByteOrderMark,
    00096         byteOrderSwapped = ByteOrderSwapped,
    00097         nbsp = Nbsp,
    00098 #endif
    00099         ParagraphSeparator = 0x2029,
    00100         LineSeparator = 0x2028
    00101     };
    00102     QChar(SpecialCharacter sc);
    00103
    00104     // Unicode information
    00105
    00106     enum Category
    00107     {
    00108         NoCategory,
    00109
    00110         Mark_NonSpacing,          //   Mn
    00111         Mark_SpacingCombining,    //   Mc
    00112         Mark_Enclosing,           //   Me
    00113
    00114         Number_DecimalDigit,      //   Nd
    00115         Number_Letter,            //   Nl
    00116         Number_Other,             //   No
    00117
    00118         Separator_Space,          //   Zs
    00119         Separator_Line,           //   Zl
    00120         Separator_Paragraph,      //   Zp
    00121
    00122         Other_Control,            //   Cc
    00123         Other_Format,             //   Cf
    00124         Other_Surrogate,          //   Cs
    00125         Other_PrivateUse,         //   Co
    00126         Other_NotAssigned,        //   Cn
    00127
    00128         Letter_Uppercase,         //   Lu
    00129         Letter_Lowercase,         //   Ll
    00130         Letter_Titlecase,         //   Lt
    00131         Letter_Modifier,          //   Lm
    00132         Letter_Other,             //   Lo
    00133
    00134         Punctuation_Connector,    //   Pc
    00135         Punctuation_Dash,         //   Pd
    00136         Punctuation_Open,         //   Ps
    00137         Punctuation_Close,        //   Pe
    00138         Punctuation_InitialQuote, //   Pi
    00139         Punctuation_FinalQuote,   //   Pf
    00140         Punctuation_Other,        //   Po
    00141
    00142         Symbol_Math,              //   Sm
    00143         Symbol_Currency,          //   Sc
    00144         Symbol_Modifier,          //   Sk
    00145         Symbol_Other,             //   So
    00146
    00147         Punctuation_Dask = Punctuation_Dash // oops
    00148     };
    00149
    00150     enum Direction
    00151     {
    00152         DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON,
    00153         DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN
    00154     };
    00155
    00156     enum Decomposition
    00157     {
    00158         NoDecomposition,
    00159         Canonical,
    00160         Font,
    00161         NoBreak,
    00162         Initial,
    00163         Medial,
    00164         Final,
    00165         Isolated,
    00166         Circle,
    00167         Super,
    00168         Sub,
    00169         Vertical,
    00170         Wide,
    00171         Narrow,
    00172         Small,
    00173         Square,
    00174         Compat,
    00175         Fraction
    00176
    00177 #ifdef QT3_SUPPORT
    00178         , Single = NoDecomposition
    00179 #endif
    00180     };
    00181
    00182     enum Joining
    00183     {
    00184         OtherJoining, Dual, Right, Center
    00185     };
    00186
    00187     enum CombiningClass
    00188     {
    00189         Combining_BelowLeftAttached       = 200,
    00190         Combining_BelowAttached           = 202,
    00191         Combining_BelowRightAttached      = 204,
    00192         Combining_LeftAttached            = 208,
    00193         Combining_RightAttached           = 210,
    00194         Combining_AboveLeftAttached       = 212,
    00195         Combining_AboveAttached           = 214,
    00196         Combining_AboveRightAttached      = 216,
    00197
    00198         Combining_BelowLeft               = 218,
    00199         Combining_Below                   = 220,
    00200         Combining_BelowRight              = 222,
    00201         Combining_Left                    = 224,
    00202         Combining_Right                   = 226,
    00203         Combining_AboveLeft               = 228,
    00204         Combining_Above                   = 230,
    00205         Combining_AboveRight              = 232,
    00206
    00207         Combining_DoubleBelow             = 233,
    00208         Combining_DoubleAbove             = 234,
    00209         Combining_IotaSubscript           = 240
    00210     };
    00211
    00212     enum UnicodeVersion {
    00213         Unicode_Unassigned,
    00214         Unicode_1_1,
    00215         Unicode_2_0,
    00216         Unicode_2_1_2,
    00217         Unicode_3_0,
    00218         Unicode_3_1,
    00219         Unicode_3_2,
    00220         Unicode_4_0,
    00221         Unicode_4_1,
    00222         Unicode_5_0
    00223     };
    00224     // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
    00225
    00226     Category category() const;
    00227     Direction direction() const;
    00228     Joining joining() const;
    00229     bool hasMirrored() const;
    00230     unsigned char combiningClass() const;
    00231
    00232     QChar mirroredChar() const;
    00233     QString decomposition() const;
    00234     Decomposition decompositionTag() const;
    00235
    00236     int digitValue() const;
    00237     QChar toLower() const;
    00238     QChar toUpper() const;
    00239     QChar toTitleCase() const;
    00240     QChar toCaseFolded() const;
    00241
    00242     UnicodeVersion unicodeVersion() const;
    00243
    00244 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
    00245     const char toAscii() const;
    00246     inline const char toLatin1() const;
    00247     inline const ushort unicode() const { return ucs; }
    00248 #else
    00249     char toAscii() const;
    00250     inline char toLatin1() const;
    00251     inline ushort unicode() const { return ucs; }
    00252 #endif
    00253 #ifdef Q_NO_PACKED_REFERENCE
    00254     inline ushort &unicode() { return const_cast<ushort&>(ucs); }
    00255 #else
    00256     inline ushort &unicode() { return ucs; }
    00257 #endif
    00258
    00259     static QChar fromAscii(char c);
    00260     static QChar fromLatin1(char c);
    00261
    00262     inline bool isNull() const { return ucs == 0; }
    00263     bool isPrint() const;
    00264     bool isPunct() const;
    00265     bool isSpace() const;
    00266     bool isMark() const;
    00267     bool isLetter() const;
    00268     bool isNumber() const;
    00269     bool isLetterOrNumber() const;
    00270     bool isDigit() const;
    00271     bool isSymbol() const;
    00272     inline bool isLower() const { return category() == Letter_Lowercase; }
    00273     inline bool isUpper() const { return category() == Letter_Uppercase; }
    00274     inline bool isTitleCase() const { return category() == Letter_Titlecase; }
    00275
    00276     inline bool isHighSurrogate() const {
    00277         return ((ucs & 0xfc00) == 0xd800);
    00278     }
    00279     inline bool isLowSurrogate() const {
    00280         return ((ucs & 0xfc00) == 0xdc00);
    00281     }
    00282
    00283     inline uchar cell() const { return uchar(ucs & 0xff); }
    00284     inline uchar row() const { return uchar((ucs>>8)&0xff); }
    00285     inline void setCell(uchar cell);
    00286     inline void setRow(uchar row);
    00287
    00288     static inline bool isHighSurrogate(uint ucs4) {
    00289         return ((ucs4 & 0xfffffc00) == 0xd800);
    00290     }
    00291     static inline bool isLowSurrogate(uint ucs4) {
    00292         return ((ucs4 & 0xfffffc00) == 0xdc00);
    00293     }
    00294     static inline bool requiresSurrogates(uint ucs4) {
    00295         return (ucs4 >= 0x10000);
    00296     }
    00297     static inline uint surrogateToUcs4(ushort high, ushort low) {
    00298         return (uint(high)<<10) + low - 0x35fdc00;
    00299     }
    00300     static inline uint surrogateToUcs4(QChar high, QChar low) {
    00301         return (uint(high.ucs)<<10) + low.ucs - 0x35fdc00;
    00302     }
    00303     static inline ushort highSurrogate(uint ucs4) {
    00304         return ushort((ucs4>>10) + 0xd7c0);
    00305     }
    00306     static inline ushort lowSurrogate(uint ucs4) {
    00307         return ushort(ucs4%0x400 + 0xdc00);
    00308     }
    00309
    00310     static Category QT_FASTCALL category(uint ucs4);
    00311     static Category QT_FASTCALL category(ushort ucs2);
    00312     static Direction QT_FASTCALL direction(uint ucs4);
    00313     static Direction QT_FASTCALL direction(ushort ucs2);
    00314     static Joining QT_FASTCALL joining(uint ucs4);
    00315     static Joining QT_FASTCALL joining(ushort ucs2);
    00316     static unsigned char QT_FASTCALL combiningClass(uint ucs4);
    00317     static unsigned char QT_FASTCALL combiningClass(ushort ucs2);
    00318
    00319     static uint QT_FASTCALL mirroredChar(uint ucs4);
    00320     static ushort QT_FASTCALL mirroredChar(ushort ucs2);
    00321     static Decomposition QT_FASTCALL decompositionTag(uint ucs4);
    00322
    00323     static int QT_FASTCALL digitValue(uint ucs4);
    00324     static int QT_FASTCALL digitValue(ushort ucs2);
    00325     static uint QT_FASTCALL toLower(uint ucs4);
    00326     static ushort QT_FASTCALL toLower(ushort ucs2);
    00327     static uint QT_FASTCALL toUpper(uint ucs4);
    00328     static ushort QT_FASTCALL toUpper(ushort ucs2);
    00329     static uint QT_FASTCALL toTitleCase(uint ucs4);
    00330     static ushort QT_FASTCALL toTitleCase(ushort ucs2);
    00331     static uint QT_FASTCALL toCaseFolded(uint ucs4);
    00332     static ushort QT_FASTCALL toCaseFolded(ushort ucs2);
    00333
    00334     static UnicodeVersion QT_FASTCALL unicodeVersion(uint ucs4);
    00335     static UnicodeVersion QT_FASTCALL unicodeVersion(ushort ucs2);
    00336
    00337     static QString QT_FASTCALL decomposition(uint ucs4);
    00338
    00339 #ifdef QT3_SUPPORT
    00340     inline QT3_SUPPORT bool mirrored() const { return hasMirrored(); }
    00341     inline QT3_SUPPORT QChar lower() const { return toLower(); }
    00342     inline QT3_SUPPORT QChar upper() const { return toUpper(); }
    00343     static inline QT3_SUPPORT bool networkOrdered() {
    00344         return QSysInfo::ByteOrder == QSysInfo::BigEndian;
    00345     }
    00346 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
    00347     inline QT3_SUPPORT const char latin1() const { return toLatin1(); }
    00348     inline QT3_SUPPORT const char ascii() const { return toAscii(); }
    00349 #else
    00350     inline QT3_SUPPORT char latin1() const { return toLatin1(); }
    00351     inline QT3_SUPPORT char ascii() const { return toAscii(); }
    00352 #endif
    00353 #endif
    00354
    00355 private:
    00356 #ifdef QT_NO_CAST_FROM_ASCII
    00357     QChar(char c);
    00358     QChar(uchar c);
    00359 #endif
    00360     ushort ucs;
    00361 };
    00362
    00363 Q_DECLARE_TYPEINFO(QChar, Q_MOVABLE_TYPE);
    00364
    00365 inline QChar::QChar() : ucs(0) {}
    00366
    00367 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
    00368 inline const char QChar::toLatin1() const { return ucs > 0xff ? '\0' : char(ucs); }
    00369 #else
    00370 inline char QChar::toLatin1() const { return ucs > 0xff ? '\0' : char(ucs); }
    00371 #endif
    00372 inline QChar QChar::fromLatin1(char c) { return QChar(ushort(uchar(c))); }
    00373
    00374 inline QChar::QChar(uchar c, uchar r) : ucs(ushort((r << 8) | c)){}
    00375 inline QChar::QChar(short rc) : ucs(ushort(rc)){}
    00376 inline QChar::QChar(uint rc) : ucs(ushort(rc & 0xffff)){}
    00377 inline QChar::QChar(int rc) : ucs(ushort(rc & 0xffff)){}
    00378 inline QChar::QChar(SpecialCharacter s) : ucs(ushort(s)) {}
    00379 inline QChar::QChar(QLatin1Char ch) : ucs(ch.unicode()) {}
    00380
    00381 inline void QChar::setCell(uchar acell)
    00382 { ucs = ushort((ucs & 0xff00) + acell); }
    00383 inline void QChar::setRow(uchar arow)
    00384 { ucs = ushort((ushort(arow)<<8) + (ucs&0xff)); }
    00385
    00386 inline bool operator==(QChar c1, QChar c2) { return c1.unicode() == c2.unicode(); }
    00387 inline bool operator!=(QChar c1, QChar c2) { return c1.unicode() != c2.unicode(); }
    00388 inline bool operator<=(QChar c1, QChar c2) { return c1.unicode() <= c2.unicode(); }
    00389 inline bool operator>=(QChar c1, QChar c2) { return c1.unicode() >= c2.unicode(); }
    00390 inline bool operator<(QChar c1, QChar c2) { return c1.unicode() < c2.unicode(); }
    00391 inline bool operator>(QChar c1, QChar c2) { return c1.unicode() > c2.unicode(); }
    00392
    00393 #ifndef QT_NO_DATASTREAM
    00394 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QChar &);
    00395 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QChar &);
    00396 #endif
    00397
    00398 QT_END_NAMESPACE
    00399
    00400 QT_END_HEADER
    00401
    00402 #endif // QCHAR_H