Enable vectorization of common loops using iterators with range checking enabled with GCC and Clang (#557)

This commit is contained in:
Anna Gringauze 2017-09-18 15:16:23 -07:00 committed by Neil MacIntosh
parent b01450878b
commit e7bcdf541b

View File

@ -129,7 +129,7 @@ namespace details
constexpr span_iterator(const Span* span, typename Span::index_type index) GSL_NOEXCEPT constexpr span_iterator(const Span* span, typename Span::index_type index) GSL_NOEXCEPT
: span_(span), index_(index) : span_(span), index_(index)
{ {
Expects(span == nullptr || (index_ >= 0 && index <= span_->length())); Expects(span == nullptr || (0 <= index_ && index <= span_->length()));
} }
friend span_iterator<Span, true>; friend span_iterator<Span, true>;
@ -141,19 +141,19 @@ namespace details
constexpr reference operator*() const GSL_NOEXCEPT constexpr reference operator*() const GSL_NOEXCEPT
{ {
Expects(span_); Expects(index_ != span_->length());
return (*span_)[index_]; return *(span_->data() + index_);
} }
constexpr pointer operator->() const GSL_NOEXCEPT constexpr pointer operator->() const GSL_NOEXCEPT
{ {
Expects(span_ && index_ >= 0 && index_ < span_->length()); Expects(index_ != span_->length());
return span_->data() + index_; return span_->data() + index_;
} }
constexpr span_iterator& operator++() GSL_NOEXCEPT constexpr span_iterator& operator++() GSL_NOEXCEPT
{ {
Expects(span_ && index_ >= 0 && index_ < span_->length()); Expects(0 <= index_ && index_ != span_->length());
++index_; ++index_;
return *this; return *this;
} }
@ -167,7 +167,7 @@ namespace details
constexpr span_iterator& operator--() GSL_NOEXCEPT constexpr span_iterator& operator--() GSL_NOEXCEPT
{ {
Expects(span_ && index_ > 0 && index_ <= span_->length()); Expects(index_ != 0 && index_ <= span_->length());
--index_; --index_;
return *this; return *this;
} }
@ -187,7 +187,7 @@ namespace details
constexpr span_iterator& operator+=(difference_type n) GSL_NOEXCEPT constexpr span_iterator& operator+=(difference_type n) GSL_NOEXCEPT
{ {
Expects(span_ && (index_ + n) >= 0 && (index_ + n) <= span_->length()); Expects((index_ + n) >= 0 && (index_ + n) <= span_->length());
index_ += n; index_ += n;
return *this; return *this;
} }