6#ifndef GEMMI_ITERATOR_HPP_
7#define GEMMI_ITERATOR_HPP_
17#if defined(__INTEL_COMPILER) || defined(__NVCOMPILER)
18 #pragma diagnostic push
19 #pragma diag_suppress = conversion_function_not_usable
20#elif defined(__NVCC__)
21 #pragma nv_diagnostic push
22 #pragma nv_diag_suppress = conversion_function_not_usable
26template <
typename Policy>
28 using value_type =
typename std::remove_cv<typename Policy::value_type>::type;
30 using pointer =
typename Policy::value_type*;
51template<
typename Value>
70template<
typename Value>
74template<
typename Redirect,
typename Value>
81 : redir_(
redir), cur_(cur) {}
91 std::vector<int>::const_iterator cur_;
93template<
typename Redirect,
typename Value>
97template<
typename Vector,
typename Value>
106 const auto&
key = (*vec_)[pos_].group_key();
108 while (pos_ != vec_->size() && (*vec_)[pos_].group_key() ==
key)
113 const auto&
key = (*vec_)[pos_].group_key();
114 while (pos_ != 0 && (*vec_)[pos_-1].group_key() ==
key)
125template<
typename Vector,
typename Value>
128template<
typename Value,
typename Vector=std::vector<Value>>
135template<
typename Value,
typename Vector=std::vector<Value>>
144template<
typename Vector,
typename Value>
152 span_.set_begin(span_.end());
154 while (!span_.is_ending() &&
155 span_.begin()->group_key() == span_.end()->group_key())
156 span_.set_size(span_.size() + 1);
159 span_.set_begin(span_.begin() - 1);
161 while (!span_.is_beginning() &&
162 span_.begin()->group_key() == (span_.begin() - 1)->group_key()) {
163 span_.set_begin(span_.begin() - 1);
164 span_.set_size(span_.size() + 1);
168 return span_.begin() ==
o.span_.begin();
176template<
typename Vector,
typename Value>
180template<
typename Filter,
typename Vector,
typename Value>
187 : filter_(filter), vec_(vec), pos_(pos) {
188 while (pos_ != vec_->size() && !
matches(pos_))
191 bool matches(std::size_t
p)
const {
return filter_->matches((*vec_)[
p]); }
203template<
typename Filter,
typename Vector,
typename Value>
206template<
typename Filter,
typename Value>
215template<
typename Filter,
typename Value>
218 const std::vector<Value>&
vec;
225template<
typename Item>
230 : size_(
int(
end - start)), extent_(
int(
end - start)), start_(start) {
231 for (
const Item*
i = start + 1;
i !=
end; ++
i)
232 if (
i->group_key() != start->group_key())
242 const Item* prev =
ptr++;
243 while (
ptr !=
end &&
ptr->group_key() != prev->group_key())
253 size_t size()
const {
return (
size_t) size_; }
255 bool empty()
const {
return size_ == 0; }
257 const Item&
front()
const {
return *start_; }
258 Item&
back() {
return start_[extent_ - 1]; }
259 const Item&
back()
const {
return start_[extent_ - 1]; }
263 if (size_ == extent_ ||
i == 0)
265 for (Item* ptr = start_ + 1; ; ++ptr)
266 if (ptr->group_key() == start_->group_key())
271 return const_cast<ItemGroup*
>(
this)->
operator[](
i);
277 Item* start_ =
nullptr;
280#if defined(__INTEL_COMPILER) || defined(__NVCOMPILER)
281 #pragma diagnostic pop
282#elif defined(__NVCC__)
283 #pragma nv_diagnostic pop
bool equal(const FilterIterPolicy &o) const
bool matches(std::size_t p) const
FilterIterPolicy< Filter, Vector const, Value const > const_policy
FilterIterPolicy(const Filter *filter, Vector *vec, std::size_t pos)
GroupingIterPolicy< Vector const, Value const > const_policy
GroupingIterPolicy()=default
bool equal(const GroupingIterPolicy &o) const
GroupingIterPolicy(const Value &span)
bool equal(const IndirectIterPolicy &o) const
IndirectIterPolicy< Redirect const, Value const > const_policy
IndirectIterPolicy(Redirect *redir, std::vector< int >::const_iterator cur)
StrideIterPolicy< Value const > const_policy
bool equal(const StrideIterPolicy &o) const
StrideIterPolicy(Value *ptr, std::size_t offset, size_t stride)
bool equal(const UniqIterPolicy &o) const
UniqIterPolicy(Vector *vec, std::size_t pos)
UniqIterPolicy< Vector const, Value const > const_policy
bool operator==(const BidirIterator &o) const
BidirIterator< typename Policy::const_policy > const_variant
typename Policy::value_type * pointer
typename Policy::reference reference
std::bidirectional_iterator_tag iterator_category
BidirIterator operator--(int)
std::ptrdiff_t difference_type
bool operator!=(const BidirIterator &o) const
BidirIterator & operator--()
BidirIterator operator++(int)
BidirIterator(Policy &&p)
BidirIterator & operator++()
typename std::remove_cv< typename Policy::value_type >::type value_type
const std::vector< Value > & vec
std::vector< Value > & vec
bool operator!=(const iterator &o) const
bool operator==(const iterator &o) const
const Item & operator[](std::size_t i) const
const Item & front() const
ItemGroup(Item *start, const Item *end)
Item & operator[](std::size_t i)
const Item & back() const