1macro_rules! named_iterators_from_no_argument_handler {
18 ($handler:ident,
19 $item:ty, $(#[$chars_meta:meta])*,
21 $chars:ident,
22 $(#[$chars_indices_meta:meta])*,
23 $char_indices:ident,
24 ) => (
25 $(#[$chars_meta])*
26 #[derive(Debug)]
27 pub struct $chars<'a> {
28 inner: crate::Utf8CharsWithHandler<'a, $handler>,
29 }
30
31 impl<'a> $chars<'a> {
32 #[inline(always)]
33 pub fn new(bytes: &'a [u8]) -> Self {
35 Self {
36 inner: crate::Utf8CharsWithHandler::new(bytes, $handler::new()),
37 }
38 }
39
40 #[must_use]
43 #[inline(always)]
44 pub fn as_slice(&self) -> &'a [u8] {
45 self.inner.as_slice()
46 }
47 }
48
49 impl<'a> Iterator for $chars<'a> {
50 type Item = $item;
51
52 #[inline(always)]
53 fn next(&mut self) -> Option<Self::Item> {
54 self.inner.next()
55 }
56
57 #[inline(always)]
58 fn count(self) -> usize {
59 self.inner.count()
60 }
61
62 #[inline(always)]
63 fn size_hint(&self) -> (usize, Option<usize>) {
64 self.inner.size_hint()
65 }
66
67 #[inline(always)]
68 fn last(mut self) -> Option<Self::Item> {
69 self.next_back()
71 }
72 }
73
74 impl<'a> DoubleEndedIterator for $chars<'a> {
75 #[inline(always)]
76 fn next_back(&mut self) -> Option<Self::Item> {
77 self.inner.next_back()
78 }
79 }
80
81 impl core::iter::FusedIterator for $chars<'_> {}
82
83 impl<'a> Clone for $chars<'a> {
84 fn clone(&self) -> Self {
85 Self {
86 inner: self.inner.clone(),
87 }
88 }
89 }
90
91 $(#[$chars_indices_meta])*
92 #[derive(Debug)]
93 pub struct $char_indices<'a> {
94 inner: crate::Utf8CharIndicesWithHandler<'a, $handler>,
95 }
96
97 impl<'a> $char_indices<'a> {
98 #[inline(always)]
99 pub fn new(bytes: &'a [u8]) -> Self {
101 Self {
102 inner: crate::Utf8CharIndicesWithHandler::new(bytes, $handler::new()),
103 }
104 }
105
106 #[inline(always)]
109 #[must_use]
110 pub fn as_slice(&self) -> &'a [u8] {
111 self.inner.as_slice()
112 }
113
114 #[inline(always)]
116 #[must_use]
117 pub fn offset(&self) -> usize {
118 self.inner.offset()
119 }
120 }
121
122 impl<'a> Iterator for $char_indices<'a> {
123 type Item = (usize, $item);
124
125 #[inline(always)]
126 fn next(&mut self) -> Option<Self::Item> {
127 self.inner.next()
128 }
129
130 #[inline(always)]
131 fn count(self) -> usize {
132 self.inner.count()
133 }
134
135 #[inline(always)]
136 fn size_hint(&self) -> (usize, Option<usize>) {
137 self.inner.size_hint()
138 }
139
140 #[inline(always)]
141 fn last(mut self) -> Option<Self::Item> {
142 self.next_back()
144 }
145 }
146
147 impl<'a> DoubleEndedIterator for $char_indices<'a> {
148 #[inline(always)]
149 fn next_back(&mut self) -> Option<Self::Item> {
150 self.inner.next_back()
151 }
152 }
153
154 impl core::iter::FusedIterator for $char_indices<'_> {}
155
156 impl<'a> Clone for $char_indices<'a> {
157 fn clone(&self) -> Self {
158 Self {
159 inner: self.inner.clone(),
160 }
161 }
162 }
163 )
164}
165
166pub(crate) use named_iterators_from_no_argument_handler;