https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Enumerate.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#pragma once
11
12#include <iterator>
13#include <iostream>
14
15namespace Moose
16{
17// Forward Declarations of helper objects
18template <class Iterator>
19struct _enumerate_struct;
20
21template <class Iterator>
22struct _enumerate_iterator;
23
24template <class Iterator>
25struct _enumerate_range;
26
50template <class Iterator>
51_enumerate_range<Iterator>
52enumerate(Iterator first,
53 Iterator last,
54 typename std::iterator_traits<Iterator>::difference_type initial)
55{
56 return _enumerate_range<Iterator>(first, last, initial);
57}
58
59template <class Container>
60_enumerate_range<typename Container::iterator>
61enumerate(Container & content)
62{
63 return _enumerate_range<typename Container::iterator>(std::begin(content), std::end(content), 0);
64}
65
66template <class Container>
67_enumerate_range<typename Container::const_iterator>
68enumerate(const Container & content)
69{
71 std::begin(content), std::end(content), 0);
72}
73
75// Helper object
76template <class Iterator>
78{
79 using iterator = Iterator;
80 using index_type = typename std::iterator_traits<iterator>::difference_type;
81 using reference = typename std::iterator_traits<iterator>::reference;
82
84
85 index_type index() { return l_index; }
86
87 reference value() { return *l_iter; }
88
89private:
92};
93
94// Helper object
95template <class Iterator>
97{
98 using iterator = Iterator;
99 using index_type = typename std::iterator_traits<iterator>::difference_type;
100 using reference = typename std::iterator_traits<iterator>::reference;
101
103
105 {
106 ++index;
107 ++iter;
108 return *this;
109 }
110
111 bool operator!=(const _enumerate_iterator & other) const { return iter != other.iter; }
112
123
124private:
127};
128
129template <class Iterator>
131{
132 using index_type = typename std::iterator_traits<Iterator>::difference_type;
134
137 {
138 }
139
140 iterator begin() const { return iterator(initial, first); }
141
142 iterator end() const { return iterator(0, last); }
143
144private:
145 Iterator first;
146 Iterator last;
148};
149}
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
_enumerate_range< Iterator > enumerate(Iterator first, Iterator last, typename std::iterator_traits< Iterator >::difference_type initial)
Enumerate function for iterating over a range and obtaining both a reference to the underlying type a...
Definition Enumerate.h:52
bool operator!=(const _enumerate_iterator &other) const
Definition Enumerate.h:111
_enumerate_iterator(index_type index, iterator iterator)
Definition Enumerate.h:102
typename std::iterator_traits< iterator >::difference_type index_type
Definition Enumerate.h:99
typename std::iterator_traits< iterator >::reference reference
Definition Enumerate.h:100
_enumerate_iterator & operator++()
Definition Enumerate.h:104
_enumerate_struct< iterator > operator*()
When MOOSE moves to C++17, we'll switch the return type of the dereference operator and the correspon...
Definition Enumerate.h:122
_enumerate_iterator< Iterator > iterator
Definition Enumerate.h:133
iterator begin() const
Definition Enumerate.h:140
_enumerate_range(Iterator first, Iterator last, index_type initial)
Definition Enumerate.h:135
iterator end() const
Definition Enumerate.h:142
typename std::iterator_traits< Iterator >::difference_type index_type
Definition Enumerate.h:132
typename std::iterator_traits< iterator >::reference reference
Definition Enumerate.h:81
typename std::iterator_traits< iterator >::difference_type index_type
Definition Enumerate.h:80
_enumerate_struct(index_type index, iterator iterator)
Definition Enumerate.h:83