Pioneer
Loading...
Searching...
No Matches
IterationProxy.h
Go to the documentation of this file.
1// Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#ifndef ITERATIONPROXY_H
5#define ITERATIONPROXY_H
6
7#include <iterator>
8#include <type_traits>
9
10// The IterationProxy template provides access to the iterator interface of containers but hides the rest of it
11// General version for containers without random access iterators
12template <typename Container, typename T = void>
14public:
15 IterationProxy(Container &container) :
16 m_container(container) {}
17 typename Container::iterator begin() { return m_container.begin(); }
18 typename Container::iterator end() { return m_container.end(); }
19 typename Container::const_iterator begin() const { return m_container.begin(); }
20 typename Container::const_iterator end() const { return m_container.end(); }
21 typename Container::const_iterator cbegin() { return m_container.cbegin(); }
22 typename Container::const_iterator cend() { return m_container.cend(); }
23
24private:
25 Container &m_container;
26};
27
28// This specialized version is for containers that provide a random access iterator, we provide an operator[] in this case
29template <typename Container>
30class IterationProxy<Container,
31 typename std::enable_if<std::is_same<typename std::iterator_traits<typename Container::iterator>::iterator_category,
32 std::random_access_iterator_tag>::value>::type> {
33public:
34 IterationProxy(Container &container) :
35 m_container(container) {}
36 typename Container::iterator begin() { return m_container.begin(); }
37 typename Container::iterator end() { return m_container.end(); }
38 typename Container::const_iterator begin() const { return m_container.begin(); }
39 typename Container::const_iterator end() const { return m_container.end(); }
40 typename Container::const_iterator cbegin() { return m_container.cbegin(); }
41 typename Container::const_iterator cend() { return m_container.cend(); }
42
43 typename Container::reference operator[](int i) { return *(m_container.begin() + i); }
44 typename Container::const_reference operator[](int i) const { return *(m_container.begin() + i); }
45
46private:
47 Container &m_container;
48};
49
50template <typename Container>
51inline IterationProxy<Container> MakeIterationProxy(Container &container) { return IterationProxy<Container>(container); }
52
53#endif
IterationProxy< Container > MakeIterationProxy(Container &container)
Definition IterationProxy.h:51
Definition IterationProxy.h:13
Container::const_iterator cbegin()
Definition IterationProxy.h:21
IterationProxy(Container &container)
Definition IterationProxy.h:15
Container::const_iterator begin() const
Definition IterationProxy.h:19
Container::const_iterator end() const
Definition IterationProxy.h:20
Container::iterator begin()
Definition IterationProxy.h:17
Container::const_iterator cend()
Definition IterationProxy.h:22
Container::iterator end()
Definition IterationProxy.h:18