comparison mupdf-source/thirdparty/zxing-cpp/core/src/Range.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 /*
2 * Copyright 2022 Axel Waggershauser
3 */
4 // SPDX-License-Identifier: Apache-2.0
5
6 #pragma once
7
8 #include "ZXAlgorithms.h"
9
10 #include <iterator>
11
12 namespace ZXing {
13
14 template <typename Iterator>
15 struct StrideIter
16 {
17 Iterator pos;
18 int stride;
19
20 using iterator_category = std::random_access_iterator_tag;
21 using difference_type = typename std::iterator_traits<Iterator>::difference_type;
22 using value_type = typename std::iterator_traits<Iterator>::value_type;
23 using pointer = Iterator;
24 using reference = typename std::iterator_traits<Iterator>::reference;
25
26 auto operator*() const { return *pos; }
27 auto operator[](int i) const { return *(pos + i * stride); }
28 StrideIter<Iterator>& operator++() { return pos += stride, *this; }
29 StrideIter<Iterator> operator++(int) { auto temp = *this; ++*this; return temp; }
30 bool operator!=(const StrideIter<Iterator>& rhs) const { return pos != rhs.pos; }
31 StrideIter<Iterator> operator+(int i) const { return {pos + i * stride, stride}; }
32 StrideIter<Iterator> operator-(int i) const { return {pos - i * stride, stride}; }
33 int operator-(const StrideIter<Iterator>& rhs) const { return narrow_cast<int>((pos - rhs.pos) / stride); }
34 };
35
36 template <typename Iterator>
37 StrideIter(const Iterator&, int) -> StrideIter<Iterator>;
38
39
40 template <typename Iterator>
41 struct Range
42 {
43 Iterator _begin, _end;
44
45 Range(Iterator b, Iterator e) : _begin(b), _end(e) {}
46
47 template <typename C>
48 Range(const C& c) : _begin(std::begin(c)), _end(std::end(c)) {}
49
50 Iterator begin() const noexcept { return _begin; }
51 Iterator end() const noexcept { return _end; }
52 explicit operator bool() const { return begin() < end(); }
53 int size() const { return narrow_cast<int>(end() - begin()); }
54 };
55
56 template <typename C>
57 Range(const C&) -> Range<typename C::const_iterator>;
58
59 } // namespace ZXing