Fix empty Vector foreach

Fix #8368
emailweixu-patch-1
Yu Yang 7 years ago
parent 4f4abfa313
commit a43fac3567

@ -106,9 +106,9 @@ class Vector {
// std::vector iterator methods. Based on CPU data access method
size_t size() const { return size_; }
T* begin() { return &this->operator[](0); }
T* begin() { return size() == 0 ? &EmptyDummy() : &this->operator[](0); }
T* end() { return &this->operator[](size()); }
T* end() { return size() == 0 ? &EmptyDummy() : &this->operator[](size()); }
T& front() { return *begin(); }
@ -118,12 +118,12 @@ class Vector {
return *it;
}
const T* begin() const { return &this->operator[](0); }
const T* end() const { return &this->operator[](size()); }
const T* cbegin() const { return begin(); }
const T* cend() const { return end(); }
const T* begin() const {
return size() == 0 ? &EmptyDummy() : &this->operator[](0);
}
const T* end() const {
return size() == 0 ? &EmptyDummy() : &this->operator[](size());
}
const T& back() const {
auto it = end();
@ -240,16 +240,18 @@ class Vector {
// implicit cast operator. Vector can be cast to std::vector implicitly.
operator std::vector<T>() const {
std::vector<T> result;
result.resize(size());
std::copy(begin(), end(), result.begin());
if (size() == 0) {
result.resize(size());
std::copy(begin(), end(), result.begin());
}
return result;
}
bool operator==(const Vector<T>& other) const {
if (size() != other.size()) return false;
auto it1 = cbegin();
auto it2 = other.cbegin();
for (; it1 < cend(); ++it1, ++it2) {
auto it1 = begin();
auto it2 = other.begin();
for (; it1 < end(); ++it1, ++it2) {
if (*it1 != *it2) {
return false;
}
@ -358,6 +360,11 @@ class Vector {
}
}
static T& EmptyDummy() {
static T dummy = T();
return dummy;
}
mutable int flag_;
mutable Tensor cpu_vec_;
mutable Tensor cuda_vec_;

@ -98,3 +98,9 @@ TEST(mixed_vector, InitWithCount) {
ASSERT_EQ(vec[i], 10);
}
}
TEST(mixed_vector, ForEach) {
vec<int> tmp;
for (auto& v : tmp) {
}
}

Loading…
Cancel
Save