| 15 | class array; |
| 16 | |
| 17 | class data_iterator |
| 18 | { |
| 19 | public: |
| 20 | data_iterator(std::shared_ptr<void> owner, std::span<const uint8_t> data, icm::shape shape, dtype dt) |
| 21 | : owner_(std::move(owner)) |
| 22 | , data_(data) |
| 23 | , shape_(std::move(shape)) |
| 24 | , dtype_(dt) |
| 25 | { |
| 26 | ASSERT(std::accumulate(shape_.begin(), shape_.end(), 1, std::multiplies{}) * dtype_bytes(dtype_) == |
| 27 | data.size()); |
| 28 | } |
| 29 | |
| 30 | array operator*() const; |
| 31 | |
| 32 | void operator++() |
| 33 | { |
| 34 | data_ = std::span<const uint8_t>(data_.data() + data_.size(), data_.size()); |
| 35 | } |
| 36 | |
| 37 | void operator--() |
| 38 | { |
| 39 | data_ = std::span<const uint8_t>(data_.data() - data_.size(), data_.size()); |
| 40 | } |
| 41 | |
| 42 | void operator+=(std::ptrdiff_t n) |
| 43 | { |
| 44 | data_ = std::span<const uint8_t>(data_.data() + n * data_.size(), data_.size()); |
| 45 | } |
| 46 | |
| 47 | void operator-=(std::ptrdiff_t n) |
| 48 | { |
| 49 | data_ = std::span<const uint8_t>(data_.data() - n * data_.size(), data_.size()); |
| 50 | } |
| 51 | |
| 52 | std::ptrdiff_t operator-(const data_iterator& other) const |
| 53 | { |
| 54 | return (data_.data() - other.data_.data()) / data_.size(); |
| 55 | } |
| 56 | |
| 57 | bool operator==(const data_iterator& other) const |
| 58 | { |
| 59 | return data_.data() == other.data_.data(); |
| 60 | } |
| 61 | |
| 62 | bool operator!=(const data_iterator& other) const |
| 63 | { |
| 64 | return data_.data() != other.data_.data(); |
| 65 | } |
| 66 | |
| 67 | private: |
| 68 | std::shared_ptr<void> owner_; |
| 69 | std::span<const uint8_t> data_; |
| 70 | icm::shape shape_; |
| 71 | dtype dtype_; |
| 72 | }; |
| 73 | |
| 74 | using dynamic_vector_iterator = std::vector<array>::const_iterator; |