iterator_for.hpp 828 Bytes
Newer Older
Paul's avatar
Paul committed
1
2
3
#ifndef MIGRAPH_GUARD_RTGLIB_ITERATOR_FOR_HPP
#define MIGRAPH_GUARD_RTGLIB_ITERATOR_FOR_HPP

Paul's avatar
Paul committed
4
5
6
#include <cassert>
#include <type_traits>

Paul's avatar
Paul committed
7
8
namespace migraph {

Paul's avatar
Paul committed
9
10
11
template <class T>
struct iterator_for_range
{
Paul's avatar
Paul committed
12
    T* base;
Paul's avatar
Paul committed
13
    using base_iterator = std::remove_reference_t<decltype(base->begin())>;
Paul's avatar
Paul committed
14

Paul's avatar
Paul committed
15
16
    struct iterator
    {
Paul's avatar
Paul committed
17
        base_iterator i;
Paul's avatar
Paul committed
18
19
20
        base_iterator operator*() { return i; }
        base_iterator operator++() { return ++i; }
        bool operator!=(const iterator& rhs) { return i != rhs.i; }
Paul's avatar
Paul committed
21
22
    };

Paul's avatar
Paul committed
23
24
25
26
27
28
29
30
31
32
    iterator begin()
    {
        assert(base != nullptr);
        return {base->begin()};
    }
    iterator end()
    {
        assert(base != nullptr);
        return {base->end()};
    }
Paul's avatar
Paul committed
33
34
};
template <class T>
Paul's avatar
Paul committed
35
iterator_for_range<T> iterator_for(T& x)
Paul's avatar
Paul committed
36
37
38
39
40
41
42
{
    return {&x};
}

} // namespace migraph

#endif