summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qtextboundaryfinder.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-08-27 09:52:26 +0200
committerLars Knoll <lars.knoll@qt.io>2020-09-07 09:09:55 +0200
commit0ae5b8af9c2af514f316211b71a03defc0f1b65a (patch)
treeaad4383be07eb65617fbe9fb99098164b7e2560f /src/corelib/text/qtextboundaryfinder.cpp
parentfae4f80ecc0974257c96c64221f245bdae6178f5 (diff)
Clean up QTextBoundaryFinder and qunicodetools
Make QTBF ready for Qt6 by using qsizetype in the API and use QStringView where it makes sense. Change the exported API of qunicodetools to use QStringView as well and use char16_t internally. Change-Id: I853537bcabf40546a8e60fdf2ee7d751bc371761 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/corelib/text/qtextboundaryfinder.cpp')
-rw-r--r--src/corelib/text/qtextboundaryfinder.cpp174
1 files changed, 81 insertions, 93 deletions
diff --git a/src/corelib/text/qtextboundaryfinder.cpp b/src/corelib/text/qtextboundaryfinder.cpp
index fdbb7f0176..dd0b96ed68 100644
--- a/src/corelib/text/qtextboundaryfinder.cpp
+++ b/src/corelib/text/qtextboundaryfinder.cpp
@@ -43,18 +43,10 @@
QT_BEGIN_NAMESPACE
-class QTextBoundaryFinderPrivate
+static void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
{
-public:
- QCharAttributes attributes[1];
-};
-
-static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int length, QCharAttributes *attributes)
-{
- const ushort *string = reinterpret_cast<const ushort *>(chars);
-
QUnicodeTools::ScriptItemArray scriptItems;
- QUnicodeTools::initScripts(string, length, &scriptItems);
+ QUnicodeTools::initScripts(str, &scriptItems);
QUnicodeTools::CharAttributeOptions options;
switch (type) {
@@ -64,7 +56,7 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
case QTextBoundaryFinder::Line: options |= QUnicodeTools::LineBreaks; break;
default: break;
}
- QUnicodeTools::initCharAttributes(string, length, scriptItems.data(), scriptItems.count(), attributes, options);
+ QUnicodeTools::initCharAttributes(str, scriptItems.data(), scriptItems.count(), attributes, options);
}
/*!
@@ -145,11 +137,7 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
Constructs an invalid QTextBoundaryFinder object.
*/
QTextBoundaryFinder::QTextBoundaryFinder()
- : t(Grapheme)
- , chars(nullptr)
- , length(0)
- , freePrivate(true)
- , d(nullptr)
+ : freeBuffer(true)
{
}
@@ -159,17 +147,15 @@ QTextBoundaryFinder::QTextBoundaryFinder()
QTextBoundaryFinder::QTextBoundaryFinder(const QTextBoundaryFinder &other)
: t(other.t)
, s(other.s)
- , chars(other.chars)
- , length(other.length)
+ , sv(other.sv)
, pos(other.pos)
- , freePrivate(true)
- , d(nullptr)
+ , freeBuffer(true)
{
- if (other.d) {
- Q_ASSERT(length > 0);
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
- memcpy(d, other.d, (length + 1) * sizeof(QCharAttributes));
+ if (other.attributes) {
+ Q_ASSERT(sv.size() > 0);
+ attributes = (QCharAttributes *) malloc((sv.size() + 1) * sizeof(QCharAttributes));
+ Q_CHECK_PTR(attributes);
+ memcpy(attributes, other.attributes, (sv.size() + 1) * sizeof(QCharAttributes));
}
}
@@ -181,27 +167,26 @@ QTextBoundaryFinder &QTextBoundaryFinder::operator=(const QTextBoundaryFinder &o
if (&other == this)
return *this;
- if (other.d) {
- Q_ASSERT(other.length > 0);
- uint newCapacity = (other.length + 1) * sizeof(QCharAttributes);
- QTextBoundaryFinderPrivate *newD = (QTextBoundaryFinderPrivate *) realloc(freePrivate ? d : nullptr, newCapacity);
+ if (other.attributes) {
+ Q_ASSERT(other.sv.size() > 0);
+ size_t newCapacity = (size_t(other.sv.size()) + 1) * sizeof(QCharAttributes);
+ QCharAttributes *newD = (QCharAttributes *) realloc(freeBuffer ? attributes : nullptr, newCapacity);
Q_CHECK_PTR(newD);
- freePrivate = true;
- d = newD;
+ freeBuffer = true;
+ attributes = newD;
}
t = other.t;
s = other.s;
- chars = other.chars;
- length = other.length;
+ sv = other.sv;
pos = other.pos;
- if (other.d) {
- memcpy(d, other.d, (length + 1) * sizeof(QCharAttributes));
+ if (other.attributes) {
+ memcpy(attributes, other.attributes, (sv.size() + 1) * sizeof(QCharAttributes));
} else {
- if (freePrivate)
- free(d);
- d = nullptr;
+ if (freeBuffer)
+ free(attributes);
+ attributes = nullptr;
}
return *this;
@@ -213,8 +198,8 @@ QTextBoundaryFinder &QTextBoundaryFinder::operator=(const QTextBoundaryFinder &o
QTextBoundaryFinder::~QTextBoundaryFinder()
{
Q_UNUSED(unused);
- if (freePrivate)
- free(d);
+ if (freeBuffer)
+ free(attributes);
}
/*!
@@ -223,22 +208,28 @@ QTextBoundaryFinder::~QTextBoundaryFinder()
QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QString &string)
: t(type)
, s(string)
- , chars(string.unicode())
- , length(string.length())
+ , sv(s)
, pos(0)
- , freePrivate(true)
- , d(nullptr)
+ , freeBuffer(true)
+ , attributes(nullptr)
{
- if (length > 0) {
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
- init(t, chars, length, d->attributes);
+ if (sv.size() > 0) {
+ attributes = (QCharAttributes *) malloc((sv.size() + 1) * sizeof(QCharAttributes));
+ Q_CHECK_PTR(attributes);
+ init(t, sv, attributes);
}
}
/*!
- Creates a QTextBoundaryFinder object of \a type operating on \a chars
- with \a length.
+ \fn QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QChar *chars, qsizetype length, unsigned char *buffer, qsizetype bufferSize)
+ \overload
+
+ The same as QTextBoundaryFinder(type, QStringView(chars, length), buffer, bufferSize).
+*/
+
+/*!
+ Creates a QTextBoundaryFinder object of \a type operating on \a string.
+ \since 6.0
\a buffer is an optional working buffer of size \a bufferSize you can pass to
the QTextBoundaryFinder. If the buffer is large enough to hold the working
@@ -250,25 +241,22 @@ QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QString &strin
as long as the QTextBoundaryFinder object stays alive. The same applies to
\a buffer.
*/
-QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QChar *chars, int length, unsigned char *buffer, int bufferSize)
+QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, QStringView string, unsigned char *buffer, qsizetype bufferSize)
: t(type)
- , chars(chars)
- , length(length)
+ , sv(string)
, pos(0)
- , freePrivate(true)
- , d(nullptr)
+ , freeBuffer(true)
+ , attributes(nullptr)
{
- if (!chars) {
- length = 0;
- } else if (length > 0) {
- if (buffer && (uint)bufferSize >= (length + 1) * sizeof(QCharAttributes)) {
- d = (QTextBoundaryFinderPrivate *)buffer;
- freePrivate = false;
+ if (!sv.isEmpty()) {
+ if (buffer && (uint)bufferSize >= (sv.size() + 1) * sizeof(QCharAttributes)) {
+ attributes = reinterpret_cast<QCharAttributes *>(buffer);
+ freeBuffer = false;
} else {
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
+ attributes = (QCharAttributes *) malloc((sv.size() + 1) * sizeof(QCharAttributes));
+ Q_CHECK_PTR(attributes);
}
- init(t, chars, length, d->attributes);
+ init(t, sv, attributes);
}
}
@@ -289,7 +277,7 @@ void QTextBoundaryFinder::toStart()
*/
void QTextBoundaryFinder::toEnd()
{
- pos = length;
+ pos = sv.size();
}
/*!
@@ -300,7 +288,7 @@ void QTextBoundaryFinder::toEnd()
\sa setPosition()
*/
-int QTextBoundaryFinder::position() const
+qsizetype QTextBoundaryFinder::position() const
{
return pos;
}
@@ -314,9 +302,9 @@ int QTextBoundaryFinder::position() const
\sa position()
*/
-void QTextBoundaryFinder::setPosition(int position)
+void QTextBoundaryFinder::setPosition(qsizetype position)
{
- pos = qBound(0, position, length);
+ pos = qBound(0, position, sv.size());
}
/*! \fn QTextBoundaryFinder::BoundaryType QTextBoundaryFinder::type() const
@@ -335,9 +323,9 @@ void QTextBoundaryFinder::setPosition(int position)
*/
QString QTextBoundaryFinder::string() const
{
- if (chars == s.unicode() && length == s.length())
+ if (sv.data() == s.unicode() && sv.size() == s.size())
return s;
- return QString(chars, length);
+ return sv.toString();
}
@@ -346,9 +334,9 @@ QString QTextBoundaryFinder::string() const
Returns -1 if there is no next boundary.
*/
-int QTextBoundaryFinder::toNextBoundary()
+qsizetype QTextBoundaryFinder::toNextBoundary()
{
- if (!d || pos < 0 || pos >= length) {
+ if (!attributes || pos < 0 || pos >= sv.size()) {
pos = -1;
return pos;
}
@@ -356,19 +344,19 @@ int QTextBoundaryFinder::toNextBoundary()
++pos;
switch(t) {
case Grapheme:
- while (pos < length && !d->attributes[pos].graphemeBoundary)
+ while (pos < sv.size() && !attributes[pos].graphemeBoundary)
++pos;
break;
case Word:
- while (pos < length && !d->attributes[pos].wordBreak)
+ while (pos < sv.size() && !attributes[pos].wordBreak)
++pos;
break;
case Sentence:
- while (pos < length && !d->attributes[pos].sentenceBoundary)
+ while (pos < sv.size() && !attributes[pos].sentenceBoundary)
++pos;
break;
case Line:
- while (pos < length && !d->attributes[pos].lineBreak)
+ while (pos < sv.size() && !attributes[pos].lineBreak)
++pos;
break;
}
@@ -381,9 +369,9 @@ int QTextBoundaryFinder::toNextBoundary()
Returns -1 if there is no previous boundary.
*/
-int QTextBoundaryFinder::toPreviousBoundary()
+qsizetype QTextBoundaryFinder::toPreviousBoundary()
{
- if (!d || pos <= 0 || pos > length) {
+ if (!attributes || pos <= 0 || pos > sv.size()) {
pos = -1;
return pos;
}
@@ -391,19 +379,19 @@ int QTextBoundaryFinder::toPreviousBoundary()
--pos;
switch(t) {
case Grapheme:
- while (pos > 0 && !d->attributes[pos].graphemeBoundary)
+ while (pos > 0 && !attributes[pos].graphemeBoundary)
--pos;
break;
case Word:
- while (pos > 0 && !d->attributes[pos].wordBreak)
+ while (pos > 0 && !attributes[pos].wordBreak)
--pos;
break;
case Sentence:
- while (pos > 0 && !d->attributes[pos].sentenceBoundary)
+ while (pos > 0 && !attributes[pos].sentenceBoundary)
--pos;
break;
case Line:
- while (pos > 0 && !d->attributes[pos].lineBreak)
+ while (pos > 0 && !attributes[pos].lineBreak)
--pos;
break;
}
@@ -416,19 +404,19 @@ int QTextBoundaryFinder::toPreviousBoundary()
*/
bool QTextBoundaryFinder::isAtBoundary() const
{
- if (!d || pos < 0 || pos > length)
+ if (!attributes || pos < 0 || pos > sv.size())
return false;
switch(t) {
case Grapheme:
- return d->attributes[pos].graphemeBoundary;
+ return attributes[pos].graphemeBoundary;
case Word:
- return d->attributes[pos].wordBreak;
+ return attributes[pos].wordBreak;
case Sentence:
- return d->attributes[pos].sentenceBoundary;
+ return attributes[pos].sentenceBoundary;
case Line:
// ### TR#14 LB2 prohibits break at sot
- return d->attributes[pos].lineBreak || pos == 0;
+ return attributes[pos].lineBreak || pos == 0;
}
return false;
}
@@ -439,17 +427,17 @@ bool QTextBoundaryFinder::isAtBoundary() const
QTextBoundaryFinder::BoundaryReasons QTextBoundaryFinder::boundaryReasons() const
{
BoundaryReasons reasons = NotAtBoundary;
- if (!d || pos < 0 || pos > length)
+ if (!attributes || pos < 0 || pos > sv.size())
return reasons;
- const QCharAttributes attr = d->attributes[pos];
+ const QCharAttributes attr = attributes[pos];
switch (t) {
case Grapheme:
if (attr.graphemeBoundary) {
reasons |= BreakOpportunity | StartOfItem | EndOfItem;
if (pos == 0)
reasons &= (~EndOfItem);
- else if (pos == length)
+ else if (pos == sv.size())
reasons &= (~StartOfItem);
}
break;
@@ -467,7 +455,7 @@ QTextBoundaryFinder::BoundaryReasons QTextBoundaryFinder::boundaryReasons() cons
reasons |= BreakOpportunity | StartOfItem | EndOfItem;
if (pos == 0)
reasons &= (~EndOfItem);
- else if (pos == length)
+ else if (pos == sv.size())
reasons &= (~StartOfItem);
}
break;
@@ -479,9 +467,9 @@ QTextBoundaryFinder::BoundaryReasons QTextBoundaryFinder::boundaryReasons() cons
reasons |= MandatoryBreak | StartOfItem | EndOfItem;
if (pos == 0)
reasons &= (~EndOfItem);
- else if (pos == length)
+ else if (pos == sv.size())
reasons &= (~StartOfItem);
- } else if (pos > 0 && chars[pos - 1].unicode() == QChar::SoftHyphen) {
+ } else if (pos > 0 && sv[pos - 1].unicode() == QChar::SoftHyphen) {
reasons |= SoftHyphen;
}
}