PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
enumerate.h
1#pragma once
2
3#include <cstddef>
4#include <iterator>
5#include <tuple>
6#include <type_traits>
7#include <utility>
8
9namespace pixelbullet
10{
11template <typename T>
12class EnumerateWrapper
13{
14public:
15 explicit EnumerateWrapper(T&& iterable)
16 : iterable_(std::forward<T>(iterable))
17 {
18 }
19
20 template <typename IterType>
21 class Iterator
22 {
23 public:
24 using iterator_category = std::input_iterator_tag;
25 using difference_type = std::ptrdiff_t;
26 using element_reference = decltype(*std::declval<IterType&>());
27 using value_type = std::tuple<std::size_t, std::remove_cvref_t<element_reference>>;
28 using pointer = void;
29 using reference = std::tuple<std::size_t, element_reference>;
30
31 Iterator(IterType iter, const std::size_t index)
32 : iter_(iter)
33 , index_(index)
34 {
35 }
36
37 Iterator& operator++()
38 {
39 ++iter_;
40 ++index_;
41 return *this;
42 }
43
44 Iterator operator++(int)
45 {
46 Iterator previous = *this;
47 ++(*this);
48 return previous;
49 }
50
51 bool operator==(const Iterator& other) const
52 {
53 return iter_ == other.iter_;
54 }
55
56 bool operator!=(const Iterator& other) const
57 {
58 return !(*this == other);
59 }
60
61 reference operator*() const
62 {
63 return reference{ index_, *iter_ };
64 }
65
66 private:
67 IterType iter_;
68 std::size_t index_;
69 };
70
71 auto begin()
72 {
73 return Iterator<decltype(std::begin(iterable_))>{ std::begin(iterable_), 0 };
74 }
75
76 auto end()
77 {
78 return Iterator<decltype(std::end(iterable_))>{ std::end(iterable_), 0 };
79 }
80
81 auto begin() const
82 {
83 return Iterator<decltype(std::begin(iterable_))>{ std::begin(iterable_), 0 };
84 }
85
86 auto end() const
87 {
88 return Iterator<decltype(std::end(iterable_))>{ std::end(iterable_), 0 };
89 }
90
91private:
92 T iterable_;
93};
94
95template <typename T>
96auto enumerate(T&& iterable)
97{
98 return EnumerateWrapper<T>{ std::forward<T>(iterable) };
99}
100} // namespace pixelbullet
Definition enumerate.h:13