summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorbjørn Lund Martsum <tmartsum@gmail.com>2012-10-28 15:36:11 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-29 22:21:32 +0100
commitaf437047a2d849d19f8de01b5ecfb685f813d6a2 (patch)
tree50a8763dc6f74dd92fb0c9409b75531fa64b8694
parent3a333f2d92a44feba017c7951049e89adbbda686 (diff)
QMap - improve QMap stl-map ctor
We can insert directly on the most left-most Node. We always enforce an insert here (unlike the insert call), but that is not a problem since the keys in a std::map are unique. Change-Id: Ib409b90ffc57a5a43dab4a4b08d34f6fdabd057f Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/corelib/tools/qmap.h2
-rw-r--r--tests/auto/corelib/tools/qmap/tst_qmap.cpp25
-rw-r--r--tests/benchmarks/corelib/tools/qmap/main.cpp15
3 files changed, 41 insertions, 1 deletions
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h
index e0b267ce20..d44a79473d 100644
--- a/src/corelib/tools/qmap.h
+++ b/src/corelib/tools/qmap.h
@@ -939,7 +939,7 @@ Q_OUTOFLINE_TEMPLATE QMap<Key, T>::QMap(const std::map<Key, T> &other)
typename std::map<Key,T>::const_iterator it = other.end();
while (it != other.begin()) {
--it;
- insert((*it).first, (*it).second);
+ d->createNode((*it).first, (*it).second, d->begin(), true); // insert on most left node.
}
}
diff --git a/tests/auto/corelib/tools/qmap/tst_qmap.cpp b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
index 9c53563a5c..e64496352c 100644
--- a/tests/auto/corelib/tools/qmap/tst_qmap.cpp
+++ b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
@@ -55,6 +55,7 @@ protected:
public slots:
void init();
private slots:
+ void ctor();
void count();
void clear();
void beginEnd();
@@ -146,6 +147,30 @@ void tst_QMap::init()
MyClass::count = 0;
}
+void tst_QMap::ctor()
+{
+ std::map<int, int> map;
+ for (int i = 0; i < 100000; ++i)
+ map.insert(std::pair<int, int>(i * 3, i * 7));
+
+ QMap<int, int> qmap(map); // ctor.
+
+ // Check that we have the same
+ std::map<int, int>::iterator j = map.begin();
+ QMap<int, int>::const_iterator i = qmap.constBegin();
+
+ while (i != qmap.constEnd()) {
+ QCOMPARE( (*j).first, i.key());
+ QCOMPARE( (*j).second, i.value());
+ ++i;
+ ++j;
+ }
+
+ QCOMPARE( (int) map.size(), qmap.size());
+}
+
+
+
void tst_QMap::count()
{
{
diff --git a/tests/benchmarks/corelib/tools/qmap/main.cpp b/tests/benchmarks/corelib/tools/qmap/main.cpp
index 4d9833b7a1..c11e54ff1d 100644
--- a/tests/benchmarks/corelib/tools/qmap/main.cpp
+++ b/tests/benchmarks/corelib/tools/qmap/main.cpp
@@ -62,6 +62,8 @@ private slots:
void iteration();
void toStdMap();
void iterator_begin();
+
+ void ctorStdMap();
};
@@ -189,6 +191,19 @@ void tst_QMap::iterator_begin()
}
}
+void tst_QMap::ctorStdMap()
+{
+ std::map<int, int> map;
+ for (int i = 0; i < 100000; ++i)
+ map.insert(std::pair<int, int>(i, i));
+
+ QBENCHMARK {
+ QMap<int, int> qmap(map);
+ qmap.constBegin();
+ }
+}
+
+
QTEST_MAIN(tst_QMap)
#include "main.moc"