12class mapped_iterator {
17 using traits = std::iterator_traits<IterT>;
21 using iterator_category = traits::iterator_category;
23 using value_type =
typename std::invoke_result<F, typename IterT::value_type>::type;
32 using difference_type = traits::difference_type;
34 using pointer = traits::pointer;
36 mapped_iterator(IterT iterator, F func):
37 iterator(iterator), func(func) {}
41 return iterator == other.iterator;
45 bool operator!=(
const mapped_iterator& other)
const {
46 return iterator != other.iterator;
49 mapped_iterator& operator++()
requires(std::incrementable<IterT>) {
54 mapped_iterator& operator--()
requires(std::bidirectional_iterator<IterT>) {
59 mapped_iterator operator++(
int)
requires(std::incrementable<IterT>) {
60 return mapped_iterator { iterator++, func };
63 mapped_iterator operator--(
int)
requires(std::bidirectional_iterator<IterT>) {
64 return mapped_iterator { iterator--, func };
67 IterT& operator+(std::ptrdiff_t offset)
requires(std::random_access_iterator<IterT>) {
72 IterT& operator-(std::ptrdiff_t offset)
requires(std::random_access_iterator<IterT>) {
77 reference operator*()
requires(std::indirectly_readable<IterT>) {
78 return func(*iterator);
81 IterT& operator=(value_type&& value)
requires(std::indirectly_writable<IterT, value_type>) {
100 using difference_type = ZEN_NAMESPACE::mapped_iterator<IterT, F>::difference_type;
101 using value_type = ZEN_NAMESPACE::mapped_iterator<IterT, F>::value_type;
102 using pointer = ZEN_NAMESPACE::mapped_iterator<IterT, F>::pointer;
103 using reference = ZEN_NAMESPACE::mapped_iterator<IterT, F>::reference;
104 using iterator_category = ZEN_NAMESPACE::mapped_iterator<IterT, F>::iterator_category;