Don't capture this implicitly

Relax const constraints on the range iterator
This commit is contained in:
Tom Lin 2022-07-28 16:23:07 +01:00
parent dfb4eb06b2
commit f77e43c6d5
2 changed files with 13 additions and 8 deletions

View File

@ -83,7 +83,7 @@ template <class T>
void STDIndicesStream<T>::mul()
{
// b[i] = scalar * c[i];
std::transform(exe_policy, range.begin(), range.end(), BEGIN(b), [&, scalar = startScalar](int i) {
std::transform(exe_policy, range.begin(), range.end(), BEGIN(b), [this, scalar = startScalar](int i) {
return scalar * c[i];
});
}
@ -92,7 +92,7 @@ template <class T>
void STDIndicesStream<T>::add()
{
// c[i] = a[i] + b[i];
std::transform(exe_policy, range.begin(), range.end(), BEGIN(c), [&](int i) {
std::transform(exe_policy, range.begin(), range.end(), BEGIN(c), [this](int i) {
return a[i] + b[i];
});
}
@ -101,7 +101,7 @@ template <class T>
void STDIndicesStream<T>::triad()
{
// a[i] = b[i] + scalar * c[i];
std::transform(exe_policy, range.begin(), range.end(), BEGIN(a), [&, scalar = startScalar](int i) {
std::transform(exe_policy, range.begin(), range.end(), BEGIN(a), [this, scalar = startScalar](int i) {
return b[i] + scalar * c[i];
});
}
@ -113,7 +113,7 @@ void STDIndicesStream<T>::nstream()
// Need to do in two stages with C++11 STL.
// 1: a[i] += b[i]
// 2: a[i] += scalar * c[i];
std::transform(exe_policy, range.begin(), range.end(), BEGIN(a), [&, scalar = startScalar](int i) {
std::transform(exe_policy, range.begin(), range.end(), BEGIN(a), [this, scalar = startScalar](int i) {
return a[i] + b[i] + scalar * c[i];
});
}

View File

@ -25,17 +25,22 @@ public:
using difference_type = N;
using value_type = N;
using pointer = const N*;
using reference = const N&;
using reference = N;
using iterator_category = std::random_access_iterator_tag;
// XXX This is not part of the iterator spec, it gets picked up by oneDPL if enabled.
// Without this, the DPL SYCL backend collects the iterator data on the host and copies to the device.
// This type is unused for any nother STL impl.
using is_passed_directly = std::true_type;
reference operator *() const { return i_; }
const iterator &operator ++() { ++i_; return *this; }
iterator &operator ++() { ++i_; return *this; }
iterator operator ++(int) { iterator copy(*this); ++i_; return copy; }
const iterator &operator --() { --i_; return *this; }
iterator &operator --() { --i_; return *this; }
iterator operator --(int) { iterator copy(*this); --i_; return copy; }
const iterator &operator +=(N by) { i_+=by; return *this; }
iterator &operator +=(N by) { i_+=by; return *this; }
value_type operator[](const difference_type &i) const { return i_ + i; }