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:
parent
6991735367
commit
f6d69a7575
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user