Use QStringRef for parsing of logging rules

Use QStringRef to speed up the parsing of the left side of logging rules.

Change-Id: Idd4d75496e3865d092f2802c45928a414c14c615
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Kai Koehne 2014-02-25 15:44:54 +01:00 committed by The Qt Project
parent 2350c7e35c
commit 19693362e7
3 changed files with 24 additions and 16 deletions

View File

@ -64,7 +64,7 @@ QLoggingRule::QLoggingRule() :
\internal
Constructs a logging rule.
*/
QLoggingRule::QLoggingRule(const QString &pattern, bool enabled) :
QLoggingRule::QLoggingRule(const QStringRef &pattern, bool enabled) :
messageType(-1),
flags(Invalid),
enabled(enabled)
@ -119,36 +119,44 @@ int QLoggingRule::pass(const QString &cat, QtMsgType msgType) const
*.io.warning RightFilter, QtWarningMsg
*.core.* MidFilter
*/
void QLoggingRule::parse(const QString &pattern)
void QLoggingRule::parse(const QStringRef &pattern)
{
category = pattern;
QStringRef p;
// strip trailing ".messagetype"
if (pattern.endsWith(QLatin1String(".debug"))) {
category.chop(strlen(".debug"));
p = QStringRef(pattern.string(), pattern.position(),
pattern.length() - strlen(".debug"));
messageType = QtDebugMsg;
} else if (pattern.endsWith(QLatin1String(".warning"))) {
category.chop(strlen(".warning"));
p = QStringRef(pattern.string(), pattern.position(),
pattern.length() - strlen(".warning"));
messageType = QtWarningMsg;
} else if (pattern.endsWith(QLatin1String(".critical"))) {
category.chop(strlen(".critical"));
p = QStringRef(pattern.string(), pattern.position(),
pattern.length() - strlen(".critical"));
messageType = QtCriticalMsg;
} else {
p = pattern;
}
flags = Invalid;
if (!category.contains(QLatin1Char('*'))) {
if (!p.contains(QLatin1Char('*'))) {
flags = FullText;
} else {
if (category.endsWith(QLatin1Char('*'))) {
if (p.endsWith(QLatin1Char('*'))) {
flags |= LeftFilter;
category.chop(1);
p = QStringRef(p.string(), p.position(), p.length() - 1);
}
if (category.startsWith(QLatin1Char('*'))) {
if (p.startsWith(QLatin1Char('*'))) {
flags |= RightFilter;
category.remove(0, 1);
p = QStringRef(p.string(), p.position() + 1, p.length() - 1);
}
if (category.contains(QLatin1Char('*'))) // '*' only supported at start/end
if (p.contains(QLatin1Char('*'))) // '*' only supported at start/end
flags = Invalid;
}
category = p.toString();
}
/*!
@ -205,7 +213,7 @@ void QLoggingSettingsParser::setContent(QTextStream &stream)
int equalPos = line.indexOf(QLatin1Char('='));
if ((equalPos != -1)
&& (line.lastIndexOf(QLatin1Char('=')) == equalPos)) {
const QString pattern = line.left(equalPos);
const QStringRef pattern = line.leftRef(equalPos);
const QStringRef value = line.midRef(equalPos + 1);
bool enabled = (value.compare(QLatin1String("true"),
Qt::CaseInsensitive) == 0);

View File

@ -68,7 +68,7 @@ class Q_AUTOTEST_EXPORT QLoggingRule
{
public:
QLoggingRule();
QLoggingRule(const QString &pattern, bool enabled);
QLoggingRule(const QStringRef &pattern, bool enabled);
int pass(const QString &categoryName, QtMsgType type) const;
enum PatternFlag {
@ -86,7 +86,7 @@ public:
bool enabled;
private:
void parse(const QString &pattern);
void parse(const QStringRef &pattern);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QLoggingRule::PatternFlags)

View File

@ -169,7 +169,7 @@ private slots:
QFETCH(QtMsgType, msgType);
QFETCH(LoggingRuleState, result);
QLoggingRule rule(pattern, true);
QLoggingRule rule(QStringRef(&pattern), true);
LoggingRuleState state = Invalid;
if (rule.flags != QLoggingRule::Invalid) {
switch (rule.pass(category, msgType)) {