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:
parent
1918c689d7
commit
d5c53554e5
@ -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
|
||||||
{ };
|
{ };
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user