PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
Enumerate.hpp
1#pragma once
2
3#include <iterator>
4#include <tuple>
5#include <utility>
6
7namespace PixelBullet
8{
9 template <typename T>
11 {
12 public:
13 explicit EnumerateWrapper(T&& iterable)
14 : iterable_(std::forward<T>(iterable))
15 {
16 }
17
19 {
20 public:
21 using IterType = decltype(std::begin(std::declval<T&>()));
22 using DifferenceType = std::ptrdiff_t;
23 using ValueType = std::tuple<std::size_t, decltype(*std::begin(std::declval<T&>()))>;
24 using Pointer = void;
25 using Reference = ValueType;
26 using IteratorCategory = std::input_iterator_tag;
27
28 iterator(IterType iter, std::size_t index)
29 : iter_(iter)
30 , index_(index)
31 {
32 }
33
34 iterator& operator++()
35 {
36 ++iter_;
37 ++index_;
38 return *this;
39 }
40
41 bool operator!=(const iterator& other) const
42 {
43 return iter_ != other.iter_;
44 }
45
46 auto operator*() const
47 {
48 return std::tie(index_, *iter_);
49 }
50
51 private:
52 IterType iter_;
53 std::size_t index_;
54 };
55
56 auto begin()
57 {
58 return iterator{ std::begin(iterable_), 0 };
59 }
60
61 auto end()
62 {
63 return iterator{ std::end(iterable_), 0 };
64 }
65
66 private:
67 T iterable_;
68 };
69
70 template <typename T>
71 auto Enumerate(T&& iterable)
72 {
73 return EnumerateWrapper<T>{ std::forward<T>(iterable) };
74 }
75} // namespace PixelBullet
Definition Enumerate.hpp:19
Definition Enumerate.hpp:11