QHash: adapt to C++20 ranges not offering operator->()

Iterators no longer provide it, because they may need to return a
temporary in some occasions.

Fixes: QTBUG-128102
Change-Id: Ide0a7a84f612fff73afffffd49889321cb70505f
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
(cherry picked from commit cb40a1fa7f4b06acced1d17e8333742084092f9e)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Thiago Macieira 2024-08-16 09:03:50 -07:00 committed by Qt Cherry-pick Bot
parent 6991735367
commit f6d69a7575
3 changed files with 29 additions and 6 deletions

View File

@ -299,8 +299,8 @@ using KeyAndValueTest = decltype(
template <typename Iterator>
using FirstAndSecondTest = decltype(
std::declval<Iterator &>()->first,
std::declval<Iterator &>()->second
(*std::declval<Iterator &>()).first,
(*std::declval<Iterator &>()).second
);
template <typename Iterator>

View File

@ -894,8 +894,11 @@ public:
: QHash()
{
QtPrivate::reserveIfForwardIterator(this, f, l);
for (; f != l; ++f)
insert(f->first, f->second);
for (; f != l; ++f) {
auto &&e = *f;
using V = decltype(e);
insert(std::forward<V>(e).first, std::forward<V>(e).second);
}
}
#endif
void swap(QHash &other) noexcept { qt_ptr_swap(d, other.d); }
@ -1463,8 +1466,11 @@ public:
QMultiHash(InputIterator f, InputIterator l)
{
QtPrivate::reserveIfForwardIterator(this, f, l);
for (; f != l; ++f)
insert(f->first, f->second);
for (; f != l; ++f) {
auto &&e = *f;
using V = decltype(e);
insert(std::forward<V>(e).first, std::forward<V>(e).second);
}
}
#endif
QMultiHash(const QMultiHash &other) noexcept

View File

@ -16,6 +16,9 @@
#include <functional>
#include <iostream>
#include <list>
#ifdef __cpp_lib_ranges
#include <ranges>
#endif
#include <set>
#include <sstream>
#include <map>
@ -737,6 +740,20 @@ void tst_ContainerApiSymmetry::ranged_ctor_associative_impl() const
QCOMPARE(c3a, reference);
QCOMPARE(c3b, reference);
QCOMPARE(c4, reference);
#ifdef __cpp_lib_ranges
{
auto view1 = values1 | std::views::transform(std::identity{});
Container c5(std::ranges::begin(view1),
std::ranges::end(view1));
QCOMPARE(c5, reference);
auto view2 = values1 | std::views::filter([](auto &&){ return true; });
Container c6(std::ranges::begin(view2),
std::ranges::end(view2));
QCOMPARE(c6, reference);
}
#endif
}
template <typename Container>