-
Notifications
You must be signed in to change notification settings - Fork 1
/
pixeliterator.hpp
103 lines (84 loc) · 2.32 KB
/
pixeliterator.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#ifndef PIXELITERATOR_HPP
# define PIXELITERATOR_HPP
# pragma once
#include <cstddef>
#include <array>
#include <iterator>
#include <memory>
template <typename T, std::size_t N>
class pixel_iterator
{
T* ptr_;
public:
using iterator_category = std::random_access_iterator_tag;
using value_type = std::array<T, N>;
using difference_type = std::ptrdiff_t;
using pointer = value_type*;
using reference = value_type&;
public:
explicit pixel_iterator(T* const ptr) noexcept : ptr_(ptr) {}
// increment, decrement
auto& operator++() noexcept { return ptr_ += N, *this; }
auto operator++(int) const noexcept { return pixel_iterator(ptr_ + N); }
auto& operator--() noexcept { return ptr_ -= N, *this; }
auto operator--(int) const noexcept { return pixel_iterator(ptr_ - N); }
// arithmetic
difference_type operator-(pixel_iterator const& o) const noexcept
{
return (ptr_ - o.ptr_) / N;
}
auto operator+(difference_type const M) const noexcept
{
return pixel_iterator(ptr_ + N * M);
}
auto operator-(difference_type const M) const noexcept
{
return pixel_iterator(ptr_ - N * M);
}
// comparison
bool operator==(pixel_iterator const& o) const noexcept
{
return std::addressof(*ptr_ ) == std::addressof(*o.ptr_);
}
bool operator<(pixel_iterator const& o) const noexcept
{
return std::addressof(*ptr_ ) < std::addressof(*o.ptr_);
}
// member access
auto& operator[](difference_type const i) const noexcept
{
return *(*this + i);
}
auto& operator*() const noexcept
{
return *const_cast<pointer>(reinterpret_cast<value_type const*>(
std::addressof(*ptr_)));
}
};
template <std::size_t N, typename T>
inline auto make_pixel_iterator(T* const p) noexcept
{
return pixel_iterator<T, N>(p);
}
#endif // PIXELITERATOR_HPP
/*
std::transform(std::execution::unseq,
make_pixel_iterator<4>(src),
make_pixel_iterator<4>(src + pixels_),
make_pixel_iterator<4>(src),
[](auto&& s) noexcept ->
typename pixel_iterator<unsigned char, 4>::value_type
{
if constexpr (std::endian::little == std::endian::native)
{
// BGRA -> RGBx
return {s[2], s[1], s[0]};
}
else if constexpr (std::endian::big == std::endian::native)
{
// ARGB -> RGBx
return {s[1], s[2], s[3]};
}
}
);
*/