diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2010-11-22 14:20:42 (GMT) |
---|---|---|
committer | Olivier Goffart <olivier.goffart@nokia.com> | 2010-11-22 14:20:42 (GMT) |
commit | 360f596183969a4c690c77df08d94101428c97c0 (patch) | |
tree | 0d95e603c78e38c894fd6ea5200c74c9f75341b6 /src | |
parent | 9036fe3d2ffabde9b49ced0ba8835d8403b11ff4 (diff) | |
download | Qt-360f596183969a4c690c77df08d94101428c97c0.zip Qt-360f596183969a4c690c77df08d94101428c97c0.tar.gz Qt-360f596183969a4c690c77df08d94101428c97c0.tar.bz2 |
optimize ligatureHelper by using qBinaryFind instead of the for loop
Merge-request: 890
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/tools/qchar.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index bb777cd..43b1552 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -48,11 +48,11 @@ # undef QT_NO_CAST_TO_ASCII #endif #include "qchar.h" + #include "qdatastream.h" #include "qtextcodec.h" #include "qunicodetables_p.h" - #include "qunicodetables.cpp" QT_BEGIN_NAMESPACE @@ -1489,6 +1489,16 @@ static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion } +struct UCS2Pair { + ushort u1; + ushort u2; +}; + +static inline bool operator<(ushort u1, const UCS2Pair &ligature) +{ return u1 < ligature.u1; } +static inline bool operator<(const UCS2Pair &ligature, ushort u1) +{ return ligature.u1 < u1; } + static ushort ligatureHelper(ushort u1, ushort u2) { // hangul L-V pair @@ -1511,12 +1521,14 @@ static ushort ligatureHelper(ushort u1, ushort u2) if (index == 0xffff) return 0; const unsigned short *ligatures = uc_ligature_map+index; - ushort length = *ligatures; - ++ligatures; - // ### use bsearch - for (uint i = 0; i < length; ++i) - if (ligatures[2*i] == u1) - return ligatures[2*i+1]; + ushort length = *ligatures++; + { + const UCS2Pair *data = reinterpret_cast<const UCS2Pair *>(ligatures); + const UCS2Pair *r = qBinaryFind(data, data + length, u1); + if (r != data + length) + return r->u2; + } + return 0; } |