src/corelib/tools/qchar.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtCore module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #ifndef QCHAR_H
       
    43 #define QCHAR_H
       
    44 
       
    45 #include <QtCore/qglobal.h>
       
    46 
       
    47 QT_BEGIN_HEADER
       
    48 
       
    49 QT_BEGIN_NAMESPACE
       
    50 
       
    51 QT_MODULE(Core)
       
    52 
       
    53 class QString;
       
    54 
       
    55 struct QLatin1Char
       
    56 {
       
    57 public:
       
    58     inline explicit QLatin1Char(char c) : ch(c) {}
       
    59 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
       
    60     inline const char toLatin1() const { return ch; }
       
    61     inline const ushort unicode() const { return ushort(uchar(ch)); }
       
    62 #else
       
    63     inline char toLatin1() const { return ch; }
       
    64     inline ushort unicode() const { return ushort(uchar(ch)); }
       
    65 #endif
       
    66 
       
    67 private:
       
    68     char ch;
       
    69 };
       
    70 
       
    71 
       
    72 class Q_CORE_EXPORT QChar {
       
    73 public:
       
    74     QChar();
       
    75 #ifndef QT_NO_CAST_FROM_ASCII
       
    76     QT_ASCII_CAST_WARN_CONSTRUCTOR QChar(char c);
       
    77     QT_ASCII_CAST_WARN_CONSTRUCTOR QChar(uchar c);
       
    78 #endif
       
    79     QChar(QLatin1Char ch);
       
    80     QChar(uchar c, uchar r);
       
    81     inline QChar(ushort rc) : ucs(rc){}
       
    82     QChar(short rc);
       
    83     QChar(uint rc);
       
    84     QChar(int rc);
       
    85     enum SpecialCharacter {
       
    86         Null = 0x0000,
       
    87         Nbsp = 0x00a0,
       
    88         ReplacementCharacter = 0xfffd,
       
    89         ObjectReplacementCharacter = 0xfffc,
       
    90         ByteOrderMark = 0xfeff,
       
    91         ByteOrderSwapped = 0xfffe,
       
    92 #ifdef QT3_SUPPORT
       
    93         null = Null,
       
    94         replacement = ReplacementCharacter,
       
    95         byteOrderMark = ByteOrderMark,
       
    96         byteOrderSwapped = ByteOrderSwapped,
       
    97         nbsp = Nbsp,
       
    98 #endif
       
    99         ParagraphSeparator = 0x2029,
       
   100         LineSeparator = 0x2028
       
   101     };
       
   102     QChar(SpecialCharacter sc);
       
   103 
       
   104     // Unicode information
       
   105 
       
   106     enum Category
       
   107     {
       
   108         NoCategory,
       
   109 
       
   110         Mark_NonSpacing,          //   Mn
       
   111         Mark_SpacingCombining,    //   Mc
       
   112         Mark_Enclosing,           //   Me
       
   113 
       
   114         Number_DecimalDigit,      //   Nd
       
   115         Number_Letter,            //   Nl
       
   116         Number_Other,             //   No
       
   117 
       
   118         Separator_Space,          //   Zs
       
   119         Separator_Line,           //   Zl
       
   120         Separator_Paragraph,      //   Zp
       
   121 
       
   122         Other_Control,            //   Cc
       
   123         Other_Format,             //   Cf
       
   124         Other_Surrogate,          //   Cs
       
   125         Other_PrivateUse,         //   Co
       
   126         Other_NotAssigned,        //   Cn
       
   127 
       
   128         Letter_Uppercase,         //   Lu
       
   129         Letter_Lowercase,         //   Ll
       
   130         Letter_Titlecase,         //   Lt
       
   131         Letter_Modifier,          //   Lm
       
   132         Letter_Other,             //   Lo
       
   133 
       
   134         Punctuation_Connector,    //   Pc
       
   135         Punctuation_Dash,         //   Pd
       
   136         Punctuation_Open,         //   Ps
       
   137         Punctuation_Close,        //   Pe
       
   138         Punctuation_InitialQuote, //   Pi
       
   139         Punctuation_FinalQuote,   //   Pf
       
   140         Punctuation_Other,        //   Po
       
   141 
       
   142         Symbol_Math,              //   Sm
       
   143         Symbol_Currency,          //   Sc
       
   144         Symbol_Modifier,          //   Sk
       
   145         Symbol_Other,             //   So
       
   146 
       
   147         Punctuation_Dask = Punctuation_Dash // oops
       
   148     };
       
   149 
       
   150     enum Direction
       
   151     {
       
   152         DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON,
       
   153         DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN
       
   154     };
       
   155 
       
   156     enum Decomposition
       
   157     {
       
   158         NoDecomposition,
       
   159         Canonical,
       
   160         Font,
       
   161         NoBreak,
       
   162         Initial,
       
   163         Medial,
       
   164         Final,
       
   165         Isolated,
       
   166         Circle,
       
   167         Super,
       
   168         Sub,
       
   169         Vertical,
       
   170         Wide,
       
   171         Narrow,
       
   172         Small,
       
   173         Square,
       
   174         Compat,
       
   175         Fraction
       
   176 
       
   177 #ifdef QT3_SUPPORT
       
   178         , Single = NoDecomposition
       
   179 #endif
       
   180     };
       
   181 
       
   182     enum Joining
       
   183     {
       
   184         OtherJoining, Dual, Right, Center
       
   185     };
       
   186 
       
   187     enum CombiningClass
       
   188     {
       
   189         Combining_BelowLeftAttached       = 200,
       
   190         Combining_BelowAttached           = 202,
       
   191         Combining_BelowRightAttached      = 204,
       
   192         Combining_LeftAttached            = 208,
       
   193         Combining_RightAttached           = 210,
       
   194         Combining_AboveLeftAttached       = 212,
       
   195         Combining_AboveAttached           = 214,
       
   196         Combining_AboveRightAttached      = 216,
       
   197 
       
   198         Combining_BelowLeft               = 218,
       
   199         Combining_Below                   = 220,
       
   200         Combining_BelowRight              = 222,
       
   201         Combining_Left                    = 224,
       
   202         Combining_Right                   = 226,
       
   203         Combining_AboveLeft               = 228,
       
   204         Combining_Above                   = 230,
       
   205         Combining_AboveRight              = 232,
       
   206 
       
   207         Combining_DoubleBelow             = 233,
       
   208         Combining_DoubleAbove             = 234,
       
   209         Combining_IotaSubscript           = 240
       
   210     };
       
   211 
       
   212     enum UnicodeVersion {
       
   213         Unicode_Unassigned,
       
   214         Unicode_1_1,
       
   215         Unicode_2_0,
       
   216         Unicode_2_1_2,
       
   217         Unicode_3_0,
       
   218         Unicode_3_1,
       
   219         Unicode_3_2,
       
   220         Unicode_4_0,
       
   221         Unicode_4_1,
       
   222         Unicode_5_0
       
   223     };
       
   224     // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
       
   225 
       
   226     Category category() const;
       
   227     Direction direction() const;
       
   228     Joining joining() const;
       
   229     bool hasMirrored() const;
       
   230     unsigned char combiningClass() const;
       
   231 
       
   232     QChar mirroredChar() const;
       
   233     QString decomposition() const;
       
   234     Decomposition decompositionTag() const;
       
   235 
       
   236     int digitValue() const;
       
   237     QChar toLower() const;
       
   238     QChar toUpper() const;
       
   239     QChar toTitleCase() const;
       
   240     QChar toCaseFolded() const;
       
   241 
       
   242     UnicodeVersion unicodeVersion() const;
       
   243 
       
   244 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
       
   245     const char toAscii() const;
       
   246     inline const char toLatin1() const;
       
   247     inline const ushort unicode() const { return ucs; }
       
   248 #else
       
   249     char toAscii() const;
       
   250     inline char toLatin1() const;
       
   251     inline ushort unicode() const { return ucs; }
       
   252 #endif
       
   253 #ifdef Q_NO_PACKED_REFERENCE
       
   254     inline ushort &unicode() { return const_cast<ushort&>(ucs); }
       
   255 #else
       
   256     inline ushort &unicode() { return ucs; }
       
   257 #endif
       
   258 
       
   259     static QChar fromAscii(char c);
       
   260     static QChar fromLatin1(char c);
       
   261 
       
   262     inline bool isNull() const { return ucs == 0; }
       
   263     bool isPrint() const;
       
   264     bool isPunct() const;
       
   265     bool isSpace() const;
       
   266     bool isMark() const;
       
   267     bool isLetter() const;
       
   268     bool isNumber() const;
       
   269     bool isLetterOrNumber() const;
       
   270     bool isDigit() const;
       
   271     bool isSymbol() const;
       
   272     inline bool isLower() const { return category() == Letter_Lowercase; }
       
   273     inline bool isUpper() const { return category() == Letter_Uppercase; }
       
   274     inline bool isTitleCase() const { return category() == Letter_Titlecase; }
       
   275 
       
   276     inline bool isHighSurrogate() const {
       
   277         return ((ucs & 0xfc00) == 0xd800);
       
   278     }
       
   279     inline bool isLowSurrogate() const {
       
   280         return ((ucs & 0xfc00) == 0xdc00);
       
   281     }
       
   282 
       
   283     inline uchar cell() const { return uchar(ucs & 0xff); }
       
   284     inline uchar row() const { return uchar((ucs>>8)&0xff); }
       
   285     inline void setCell(uchar cell);
       
   286     inline void setRow(uchar row);
       
   287 
       
   288     static inline uint surrogateToUcs4(ushort high, ushort low) {
       
   289         return (uint(high)<<10) + low - 0x35fdc00;
       
   290     }
       
   291     static inline uint surrogateToUcs4(QChar high, QChar low) {
       
   292         return (uint(high.ucs)<<10) + low.ucs - 0x35fdc00;
       
   293     }
       
   294     static inline ushort highSurrogate(uint ucs4) {
       
   295         return ushort((ucs4>>10) + 0xd7c0);
       
   296     }
       
   297     static inline ushort lowSurrogate(uint ucs4) {
       
   298         return ushort(ucs4%0x400 + 0xdc00);
       
   299     }
       
   300 
       
   301     static Category QT_FASTCALL category(uint ucs4);
       
   302     static Category QT_FASTCALL category(ushort ucs2);
       
   303     static Direction QT_FASTCALL direction(uint ucs4);
       
   304     static Direction QT_FASTCALL direction(ushort ucs2);
       
   305     static Joining QT_FASTCALL joining(uint ucs4);
       
   306     static Joining QT_FASTCALL joining(ushort ucs2);
       
   307     static unsigned char QT_FASTCALL combiningClass(uint ucs4);
       
   308     static unsigned char QT_FASTCALL combiningClass(ushort ucs2);
       
   309 
       
   310     static uint QT_FASTCALL mirroredChar(uint ucs4);
       
   311     static ushort QT_FASTCALL mirroredChar(ushort ucs2);
       
   312     static Decomposition QT_FASTCALL decompositionTag(uint ucs4);
       
   313 
       
   314     static int QT_FASTCALL digitValue(uint ucs4);
       
   315     static int QT_FASTCALL digitValue(ushort ucs2);
       
   316     static uint QT_FASTCALL toLower(uint ucs4);
       
   317     static ushort QT_FASTCALL toLower(ushort ucs2);
       
   318     static uint QT_FASTCALL toUpper(uint ucs4);
       
   319     static ushort QT_FASTCALL toUpper(ushort ucs2);
       
   320     static uint QT_FASTCALL toTitleCase(uint ucs4);
       
   321     static ushort QT_FASTCALL toTitleCase(ushort ucs2);
       
   322     static uint QT_FASTCALL toCaseFolded(uint ucs4);
       
   323     static ushort QT_FASTCALL toCaseFolded(ushort ucs2);
       
   324 
       
   325     static UnicodeVersion QT_FASTCALL unicodeVersion(uint ucs4);
       
   326     static UnicodeVersion QT_FASTCALL unicodeVersion(ushort ucs2);
       
   327 
       
   328     static QString QT_FASTCALL decomposition(uint ucs4);
       
   329 
       
   330 #ifdef QT3_SUPPORT
       
   331     inline QT3_SUPPORT bool mirrored() const { return hasMirrored(); }
       
   332     inline QT3_SUPPORT QChar lower() const { return toLower(); }
       
   333     inline QT3_SUPPORT QChar upper() const { return toUpper(); }
       
   334     static inline QT3_SUPPORT bool networkOrdered() {
       
   335         return QSysInfo::ByteOrder == QSysInfo::BigEndian;
       
   336     }
       
   337 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
       
   338     inline QT3_SUPPORT const char latin1() const { return toLatin1(); }
       
   339     inline QT3_SUPPORT const char ascii() const { return toAscii(); }
       
   340 #else
       
   341     inline QT3_SUPPORT char latin1() const { return toLatin1(); }
       
   342     inline QT3_SUPPORT char ascii() const { return toAscii(); }
       
   343 #endif
       
   344 #endif
       
   345 
       
   346 private:
       
   347 #ifdef QT_NO_CAST_FROM_ASCII
       
   348     QChar(char c);
       
   349     QChar(uchar c);
       
   350 #endif
       
   351     ushort ucs;
       
   352 }
       
   353 #if (defined(__arm__) || defined(__ARMEL__))
       
   354     Q_PACKED
       
   355 #endif
       
   356     ;
       
   357 
       
   358 Q_DECLARE_TYPEINFO(QChar, Q_MOVABLE_TYPE);
       
   359 
       
   360 inline QChar::QChar() : ucs(0) {}
       
   361 
       
   362 #ifdef Q_COMPILER_MANGLES_RETURN_TYPE
       
   363 inline const char QChar::toLatin1() const { return ucs > 0xff ? '\0' : char(ucs); }
       
   364 #else
       
   365 inline char QChar::toLatin1() const { return ucs > 0xff ? '\0' : char(ucs); }
       
   366 #endif
       
   367 inline QChar QChar::fromLatin1(char c) { return QChar(ushort(uchar(c))); }
       
   368 
       
   369 inline QChar::QChar(uchar c, uchar r) : ucs(ushort((r << 8) | c)){}
       
   370 inline QChar::QChar(short rc) : ucs(ushort(rc)){}
       
   371 inline QChar::QChar(uint rc) : ucs(ushort(rc & 0xffff)){}
       
   372 inline QChar::QChar(int rc) : ucs(ushort(rc & 0xffff)){}
       
   373 inline QChar::QChar(SpecialCharacter s) : ucs(ushort(s)) {}
       
   374 inline QChar::QChar(QLatin1Char ch) : ucs(ch.unicode()) {}
       
   375 
       
   376 inline void QChar::setCell(uchar acell)
       
   377 { ucs = ushort((ucs & 0xff00) + acell); }
       
   378 inline void QChar::setRow(uchar arow)
       
   379 { ucs = ushort((ushort(arow)<<8) + (ucs&0xff)); }
       
   380 
       
   381 inline bool operator==(QChar c1, QChar c2) { return c1.unicode() == c2.unicode(); }
       
   382 inline bool operator!=(QChar c1, QChar c2) { return c1.unicode() != c2.unicode(); }
       
   383 inline bool operator<=(QChar c1, QChar c2) { return c1.unicode() <= c2.unicode(); }
       
   384 inline bool operator>=(QChar c1, QChar c2) { return c1.unicode() >= c2.unicode(); }
       
   385 inline bool operator<(QChar c1, QChar c2) { return c1.unicode() < c2.unicode(); }
       
   386 inline bool operator>(QChar c1, QChar c2) { return c1.unicode() > c2.unicode(); }
       
   387 
       
   388 #ifndef QT_NO_DATASTREAM
       
   389 Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QChar &);
       
   390 Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QChar &);
       
   391 #endif
       
   392 
       
   393 QT_END_NAMESPACE
       
   394 
       
   395 QT_END_HEADER
       
   396 
       
   397 #endif // QCHAR_H