qtringbuilder: simplify by removing the QStringBuilder<QString> specialization

This commit is contained in:
hjk
2009-05-26 12:47:39 +02:00
parent ea6617cede
commit e1e1bfbf67
2 changed files with 37 additions and 52 deletions

View File

@@ -88,10 +88,17 @@ private:
template <typename A, typename B> template <typename A, typename B>
class QStringBuilderPair; class QStringBuilderPair
{
public:
QStringBuilderPair(const A &a_, const B &b_) : a(a_), b(b_) {}
template <typename A, typename B> const A &a;
inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p); const B &b;
};
namespace Qt {
inline int qStringBuilderSize(const char) { return 1; } inline int qStringBuilderSize(const char) { return 1; }
@@ -105,13 +112,22 @@ inline int qStringBuilderSize(const QString &a) { return a.size(); }
inline int qStringBuilderSize(const QStringRef &a) { return a.size(); } inline int qStringBuilderSize(const QStringRef &a) { return a.size(); }
template <typename A, typename B> template <typename A, typename B>
inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out); inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p)
{
return qStringBuilderSize(p.a) + qStringBuilderSize(p.b);
}
inline void qStringBuilderAppend(const char c, QChar *&out) { *out++ = QLatin1Char(c); }
inline void qStringBuilderAppend(const QLatin1Char c, QChar *&out) { *out++ = c; } inline void qStringBuilderAppend(const char c, QChar *&out)
{
*out++ = QLatin1Char(c);
}
inline void qStringBuilderAppend(const QLatin1Char c, QChar *&out)
{
*out++ = c;
}
inline void qStringBuilderAppend(const QLatin1String &a, QChar *&out) inline void qStringBuilderAppend(const QLatin1String &a, QChar *&out)
{ {
@@ -139,6 +155,15 @@ inline void qStringBuilderAppend(const QLatin1Literal &a, QChar *&out)
*out++ = QLatin1Char(*s++); *out++ = QLatin1Char(*s++);
} }
template <typename A, typename B>
inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out)
{
qStringBuilderAppend(p.a, out);
qStringBuilderAppend(p.b, out);
}
} // Qt
template <typename A> template <typename A>
class QStringBuilder : public A class QStringBuilder : public A
@@ -152,43 +177,15 @@ public:
QString s(this->size(), QChar(-1)); QString s(this->size(), QChar(-1));
#else #else
QString s; QString s;
s.resize(this->size()); s.resize(Qt::qStringBuilderSize(*this));
#endif #endif
QChar *d = s.data(); QChar *d = s.data();
qStringBuilderAppend(*this, d); Qt::qStringBuilderAppend(*this, d);
return s; return s;
} }
}; };
template <>
class QStringBuilder<QString>
{
public:
QStringBuilder(const QString &a_) : a(&a_) {}
inline operator QString() const { return *a; }
private:
const QString *a;
};
template <typename A, typename B>
class QStringBuilderPair
{
public:
QStringBuilderPair(const A &a_, const B &b_) : a(a_), b(b_) {}
inline int size() const
{
return qStringBuilderSize(a) + qStringBuilderSize(b);
}
//private:
const A &a;
const B &b;
};
template <typename A, typename B> template <typename A, typename B>
QStringBuilder< QStringBuilderPair<A, B> > QStringBuilder< QStringBuilderPair<A, B> >
@@ -197,18 +194,6 @@ operator%(const A &a, const B &b)
return QStringBuilderPair<A, B> (a, b); return QStringBuilderPair<A, B> (a, b);
} }
template <typename A, typename B>
inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out)
{
qStringBuilderAppend(p.a, out);
qStringBuilderAppend(p.b, out);
}
template <typename A, typename B>
inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p)
{
return qStringBuilderSize(p.a) + qStringBuilderSize(p.b);
}
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@@ -124,11 +124,11 @@ private slots:
} }
void b_string_l1string() { void b_string_l1string() {
QBENCHMARK { r = string % l1string; } QBENCHMARK { r = string % l1string; }
COMPARE(r, string + l1literal); COMPARE(r, string + l1string);
} }
void s_string_l1literal() { void s_string_l1literal() {
QBENCHMARK { r = string + l1literal; } QBENCHMARK { r = string + l1string; }
COMPARE(r, QString(string % l1string)); COMPARE(r, QString(string % l1literal));
} }
void s_string_l1string() { void s_string_l1string() {
QBENCHMARK { r = string + l1string; } QBENCHMARK { r = string + l1string; }