Optimize CppCodeMarker::addMarkUp()

This cuts away another 15% of the running time of
qdoc -prepare.

Change-Id: I81bc32fa191b73fad5d7bd27ff22ac845f83a9ce
Reviewed-by: Martin Smith <martin.smith@digia.com>
This commit is contained in:
Lars Knoll 2015-07-22 14:19:07 +02:00
parent 6508365c04
commit 67638d08b4
3 changed files with 38 additions and 12 deletions

View File

@ -194,6 +194,24 @@ QString CodeMarker::protect(const QString& str)
return marked;
}
QString CodeMarker::protect(const QStringRef& str)
{
int n = str.length();
QString marked;
marked.reserve(n * 2 + 30);
const QChar *data = str.constData();
for (int i = 0; i != n; ++i) {
switch (data[i].unicode()) {
case '&': marked += samp; break;
case '<': marked += slt; break;
case '>': marked += sgt; break;
case '"': marked += squot; break;
default : marked += data[i];
}
}
return marked;
}
QString CodeMarker::typified(const QString &string)
{
QString result;

View File

@ -164,6 +164,7 @@ public:
protected:
virtual QString sortName(const Node *node, const QString* name = 0);
QString protect(const QString &string);
QString protect(const QStringRef &string);
QString taggedNode(const Node* node);
QString taggedQmlNode(const Node* node);
QString linkTag(const Node *node, const QString& body);

View File

@ -893,8 +893,8 @@ QString CppCodeMarker::addMarkUp(const QString &in,
ch = (i < (int)code.length()) ? code[i++].cell() : EOF
QString code = in;
QStringList out;
QString text;
QString out;
QStringRef text;
int braceDepth = 0;
int parenDepth = 0;
int i = 0;
@ -1069,27 +1069,34 @@ QString CppCodeMarker::addMarkUp(const QString &in,
}
}
text = code.mid(start, finish - start);
text = code.midRef(start, finish - start);
start = finish;
if (!tag.isEmpty()) {
out << QStringLiteral("<@") << tag;
if (target)
out << QStringLiteral(" target=\"") << text << QStringLiteral("()\"");
out << QStringLiteral(">");
out += QStringLiteral("<@");
out += tag;
if (target) {
out += QStringLiteral(" target=\"");
out += text;
out += QStringLiteral("()\"");
}
out += QStringLiteral(">");
}
out << protect(text);
out += protect(text);
if (!tag.isEmpty())
out << QStringLiteral("</@") << tag << QStringLiteral(">");
if (!tag.isEmpty()) {
out += QStringLiteral("</@");
out += tag;
out += QStringLiteral(">");
}
}
if (start < code.length()) {
out << protect(code.mid(start));
out += protect(code.midRef(start));
}
return out.join(QString());
return out;
}
/*!