Loosen the requirements on the container passed to QtConcurrent::map*

Using std::begin() and std::end() forces the user to have const begin()
and end() member functions being defined for the passed container. This
is because std::declval<T>() returns rvalue which forces the compiler
to select std::{begin, end}()(const Container &c) overloads and an test
for a presence of const {begin, end}() methods.

Change-Id: I9d96d9f73891ece53224f1741a1334500f7b35ad
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Sona Kurazyan 2020-10-12 14:24:07 +02:00
parent 1918c689d7
commit d5c53554e5
3 changed files with 3 additions and 5 deletions

View File

@ -51,8 +51,8 @@ namespace QtPrivate {
template <class T, typename = void> template <class T, typename = void>
struct IsIterable : std::false_type {}; struct IsIterable : std::false_type {};
template <class T> template <class T>
struct IsIterable<T, std::void_t<decltype(std::begin(std::declval<T>())), struct IsIterable<T, std::void_t<decltype(std::declval<T>().begin()),
decltype(std::end(std::declval<T>()))>> decltype(std::declval<T>().end())>>
: std::true_type : std::true_type
{ }; { };

View File

@ -77,7 +77,7 @@ struct Argument
template <class Sequence> template <class Sequence>
struct Argument<Sequence, typename std::enable_if<IsIterableValue<Sequence>>::type> struct Argument<Sequence, typename std::enable_if<IsIterableValue<Sequence>>::type>
{ {
using Type = std::decay_t<decltype(*std::begin(std::declval<Sequence>()))>; using Type = std::decay_t<decltype(*std::declval<Sequence>().begin())>;
}; };
template <class Iterator> template <class Iterator>

View File

@ -159,8 +159,6 @@ public:
const_iterator cend() const { return data.cend(); } const_iterator cend() const { return data.cend(); }
iterator begin() { return data.begin(); } iterator begin() { return data.begin(); }
iterator end() { return data.end(); } iterator end() { return data.end(); }
const_iterator begin() const { return data.cbegin(); }
const_iterator end() const { return data.cend(); }
bool operator==(const MoveOnlyVector &other) const { return data == other.data; } bool operator==(const MoveOnlyVector &other) const { return data == other.data; }
private: private: