qchar.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:12k
源码类别:

系统编程

开发平台:

Unix_Linux

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