diff --git a/src/corelib/tools/qflatmap_p.h b/src/corelib/tools/qflatmap_p.h index 7e8b230fee..e066a53661 100644 --- a/src/corelib/tools/qflatmap_p.h +++ b/src/corelib/tools/qflatmap_p.h @@ -610,6 +610,12 @@ public: return do_remove(binary_find(key)); } + template = nullptr> + bool remove(const X &key) + { + return do_remove(binary_find(key)); + } + iterator erase(iterator it) { c.values.erase(toValuesIterator(it)); @@ -621,23 +627,49 @@ public: return do_take(binary_find(key)); } + template = nullptr> + T take(const X &key) + { + return do_take(binary_find(key)); + } + bool contains(const Key &key) const { return binary_find(key) != end(); } + template = nullptr> + bool contains(const X &key) const + { + return binary_find(key) != end(); + } + T value(const Key &key, const T &defaultValue) const { auto it = binary_find(key); return it == end() ? defaultValue : it.value(); } + template = nullptr> + T value(const X &key, const T &defaultValue) const + { + auto it = binary_find(key); + return it == end() ? defaultValue : it.value(); + } + T value(const Key &key) const { auto it = binary_find(key); return it == end() ? T() : it.value(); } + template = nullptr> + T value(const X &key) const + { + auto it = binary_find(key); + return it == end() ? T() : it.value(); + } + T &operator[](const Key &key) { return try_emplace(key).first.value(); @@ -793,11 +825,23 @@ public: return binary_find(k); } + template = nullptr> + iterator find(const X &key) + { + return binary_find(key); + } + const_iterator find(const key_type &k) const { return binary_find(k); } + template = nullptr> + const_iterator find(const X &key) const + { + return binary_find(key); + } + key_compare key_comp() const noexcept { return static_cast(*this); @@ -912,6 +956,12 @@ private: return { &c, std::as_const(*this).binary_find(key).i }; } + template = nullptr> + iterator binary_find(const X &key) + { + return { &c, std::as_const(*this).binary_find(key).i }; + } + const_iterator binary_find(const Key &key) const { auto it = lower_bound(key); @@ -923,6 +973,18 @@ private: return it; } + template = nullptr> + const_iterator binary_find(const X &key) const + { + auto it = lower_bound(key); + if (it != end()) { + if (!key_compare::operator()(key, it.key())) + return it; + it = end(); + } + return it; + } + void ensureOrderedUnique() { std::vector p(size_t(c.keys.size())); diff --git a/tests/auto/corelib/tools/qflatmap/tst_qflatmap.cpp b/tests/auto/corelib/tools/qflatmap/tst_qflatmap.cpp index 1de1c3ad71..88d2748f06 100644 --- a/tests/auto/corelib/tools/qflatmap/tst_qflatmap.cpp +++ b/tests/auto/corelib/tools/qflatmap/tst_qflatmap.cpp @@ -410,7 +410,7 @@ void tst_QFlatMap::transparency() struct StringViewCompare { using is_transparent = void; - bool operator()(const QStringView &lhs, const QStringView &rhs) const + bool operator()(QAnyStringView lhs, QAnyStringView rhs) const { return lhs < rhs; } @@ -424,8 +424,21 @@ void tst_QFlatMap::transparency() const QStringView sv2{numbers.constData() + 4, 3}; const QStringView sv3{numbers.constData() + 8, 5}; QCOMPARE(m.lower_bound(sv1).value(), "een"); + QCOMPARE(m.value(sv1), "een"); QCOMPARE(m.lower_bound(sv2).value(), "twee"); + QCOMPARE(m.value(sv2), "twee"); QCOMPARE(m.lower_bound(sv3).value(), "dree"); + QCOMPARE(m.value(sv3), "dree"); + + QVERIFY(m.contains(sv2)); + auto twee = m.take(sv2); + static_assert(std::is_same_v); + QCOMPARE(twee, "twee"); + QVERIFY(!m.contains(sv2)); + + QVERIFY(m.contains(QLatin1String("one"))); + QVERIFY(m.remove(QAnyStringView(u8"one"))); + QVERIFY(!m.contains(QLatin1String("one"))); } void tst_QFlatMap::try_emplace_and_insert_or_assign()