14template<
typename iterator_type>
17 using iterator = iterator_type;
18 using reference =
typename std::iterator_traits<iterator>::reference;
19 using index_type =
typename std::iterator_traits<iterator>::difference_type;
26 : iter(iter), index(start) {}
33 return iter == other.iter;
36 return iter != other.iter;
38 std::pair<reference, const index_type&> operator*()
const {
39 return { *iter, index };
44template<
typename iterator_type>
48 using iterator =
typename super::iterator;
49 using index_type =
typename super::index_type;
52 :
super(iter, start) {}
53 index_type operator*()
const {
60template<
typename iterator_type>
64 using index_type =
typename std::iterator_traits<iterator_type>::difference_type;
66 const iterator_type first, last;
67 const index_type start;
70 explicit count_range(iterator_type first, iterator_type last,
72 : first(first), last(last), start(start) {}
82template<
typename container_type>
83decltype(
auto) count(container_type& content,
84 typename std::iterator_traits<typename container_type::iterator>::difference_type start = 0) {
87 return count_range(begin(content), end(content), start);
92template<
typename iterator_type>
93decltype(
auto) count(iterator_type first, iterator_type last,
94 typename std::iterator_traits<iterator_type>::difference_type start = 0) {
95 return count_range(first, last, start);
99template<
typename type>
100decltype(
auto) count(
const std::initializer_list<type>& content,
101 std::ptrdiff_t start = 0) {
102 return count_range(content.begin(), content.end(), start);
106template<
typename type>
107decltype(
auto) count(std::initializer_list<type>&& content,
108 std::ptrdiff_t start = 0) {
110 return count_range(content, start);
114template<
typename type, std::
size_t N>
115decltype(
auto) count(type(&content)[N],
116 std::ptrdiff_t start = 0) {
117 return count_range(content, content + N, start);
121template<
typename iterator_type>
125 using iterator =
typename super::iterator;
126 using index_type =
typename super::index_type;
127 using reference =
typename super::reference;
130 :
super(iter, start) {}
131 std::pair<reference, const index_type&> operator*()
const {
132 return { *super::iter, super::index };
138template<
typename iterator_type>
142 using index_type =
typename std::iterator_traits<iterator_type>::difference_type;
144 const iterator_type first, last;
145 const index_type start;
149 index_type start = 0)
150 : first(first), last(last), start(start) {}
160template<
typename container_type>
161decltype(
auto) enumerate(container_type& content,
162 typename std::iterator_traits<typename container_type::iterator>::difference_type start = 0) {
170template<
typename iterator_type>
171decltype(
auto) enumerate(iterator_type first, iterator_type last,
172 typename std::iterator_traits<iterator_type>::difference_type start = 0) {
173 return enumerate_range(first, last, start);
177template<
typename type>
178decltype(
auto) enumerate(
const std::initializer_list<type>& content,
179 std::ptrdiff_t start = 0) {
180 return enumerate_range(content.begin(), content.end(), start);
184template<
typename type>
185decltype(
auto) enumerate(std::initializer_list<type>&& content,
186 std::ptrdiff_t start = 0) {
188 return enumerate_range(content, start);
192template<
typename type, std::
size_t N>
193decltype(
auto) enumerate(type(&content)[N],
194 std::ptrdiff_t start = 0) {
195 return enumerate_range(content, content + N, start);