Pioneer
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
12 template <typename Container, typename T = void>
14 public:
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 
24 private:
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
29 template <typename Container>
30 class 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> {
33 public:
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 
46 private:
47  Container &m_container;
48 };
49 
50 template <typename Container>
51 inline 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