1
- // itlib-span v1.01
1
+ // itlib-span v1.02
2
2
//
3
3
// A C++11 implementation C++20's of std::span with a dynamic extent
4
4
//
28
28
//
29
29
// VERSION HISTORY
30
30
//
31
+ // 1.02 (2023-11-29) fix constness of various methods as per C++20
31
32
// 1.01 (2023-11-27) byte_size() renamed to size_bytes() for C++20 compatibility
32
33
// 1.00 (2022-05-16) Initial release
33
34
//
@@ -110,15 +111,15 @@ class span
110
111
template <typename U, typename = typename std::enable_if<
111
112
std::is_same<T, U>::value ||
112
113
std::is_same<T, const U>::value, int >::type>
113
- span (U* begin, U* end)
114
+ span (U* begin, U* end) noexcept
114
115
: m_begin(begin)
115
116
, m_end(end)
116
117
{}
117
118
118
119
template <typename U, typename = typename std::enable_if<
119
120
std::is_same<T, U>::value ||
120
121
std::is_same<T, const U>::value, int >::type>
121
- span (U* begin, size_t size)
122
+ span (U* begin, size_t size) noexcept
122
123
: span(begin, begin + size)
123
124
{}
124
125
@@ -129,20 +130,20 @@ class span
129
130
template <typename Container, typename = typename std::enable_if<
130
131
std::is_same<T*, decltype (std::declval<Container>().data())>::value ||
131
132
std::is_same<T*, decltype (std::declval<const Container>().data())>::value, int >::type>
132
- span (Container& c)
133
+ span (Container& c) noexcept
133
134
: span(c.data(), c.size())
134
135
{}
135
136
136
137
// span of const from span of non-const
137
138
template <typename U, typename = typename std::enable_if<
138
139
std::is_same<T, U>::value ||
139
140
std::is_same<T, const U>::value, int >::type>
140
- span (const span<U>& s)
141
+ span (const span<U>& s) noexcept
141
142
: span(s.data(), s.size())
142
143
{}
143
144
144
145
template <size_t N>
145
- span (T(&ar)[N])
146
+ span (T(&ar)[N]) noexcept
146
147
: span(ar, N)
147
148
{}
148
149
@@ -162,70 +163,39 @@ class span
162
163
span (span&&) noexcept = default ;
163
164
span& operator =(span&&) noexcept = default ;
164
165
165
- explicit operator bool () const
166
+ explicit operator bool () const noexcept
166
167
{
167
168
return !!m_begin;
168
169
}
169
170
170
- const T& at (size_t i) const
171
+ T& at (size_t i) const noexcept
171
172
{
172
173
I_ITLIB_SPAN_BOUNDS_CHECK (i);
173
174
return *(m_begin + i);
174
175
}
175
176
176
- T& at (size_t i)
177
- {
178
- I_ITLIB_SPAN_BOUNDS_CHECK (i);
179
- return *(m_begin + i);
180
- }
181
-
182
- const T& operator [](size_t i) const
177
+ T& operator [](size_t i) const noexcept
183
178
{
184
179
return at (i);
185
180
}
186
181
187
- T& operator [](size_t i)
188
- {
189
- return at (i);
190
- }
191
-
192
- const T& front () const
182
+ T& front () const noexcept
193
183
{
194
184
return at (0 );
195
185
}
196
186
197
- T& front ()
198
- {
199
- return at (0 );
200
- }
201
-
202
- const T& back () const
187
+ T& back () const noexcept
203
188
{
204
189
return at (size () - 1 );
205
190
}
206
191
207
- T& back ()
208
- {
209
- return at (size () - 1 );
210
- }
211
-
212
- const T* data () const noexcept
213
- {
214
- return m_begin;
215
- }
216
-
217
- T* data () noexcept
192
+ T* data () const noexcept
218
193
{
219
194
return m_begin;
220
195
}
221
196
222
197
// iterators
223
- iterator begin () noexcept
224
- {
225
- return m_begin;
226
- }
227
-
228
- const_iterator begin () const noexcept
198
+ iterator begin () const noexcept
229
199
{
230
200
return m_begin;
231
201
}
@@ -235,12 +205,7 @@ class span
235
205
return m_begin;
236
206
}
237
207
238
- iterator end () noexcept
239
- {
240
- return m_end;
241
- }
242
-
243
- const_iterator end () const noexcept
208
+ iterator end () const noexcept
244
209
{
245
210
return m_end;
246
211
}
@@ -250,22 +215,22 @@ class span
250
215
return m_end;
251
216
}
252
217
253
- reverse_iterator rbegin () noexcept
218
+ reverse_iterator rbegin () const noexcept
254
219
{
255
220
return reverse_iterator (end ());
256
221
}
257
222
258
- const_reverse_iterator rbegin () const noexcept
223
+ const_reverse_iterator crbegin () const noexcept
259
224
{
260
225
return const_reverse_iterator (end ());
261
226
}
262
227
263
- reverse_iterator rend () noexcept
228
+ reverse_iterator rend () const noexcept
264
229
{
265
230
return reverse_iterator (begin ());
266
231
}
267
232
268
- const_reverse_iterator rend () const noexcept
233
+ const_reverse_iterator crend () const noexcept
269
234
{
270
235
return const_reverse_iterator (begin ());
271
236
}
@@ -292,7 +257,7 @@ class span
292
257
return span<const uint8_t >(reinterpret_cast <const uint8_t *>(m_begin), size_bytes ());
293
258
}
294
259
295
- span<byte_t > as_writable_bytes () noexcept
260
+ span<byte_t > as_writable_bytes () const noexcept
296
261
{
297
262
return span<byte_t >(reinterpret_cast <byte_t *>(m_begin), size_bytes ());
298
263
}
@@ -332,25 +297,25 @@ class span
332
297
};
333
298
334
299
template <typename T>
335
- span<T> make_span (T* begin, T* end)
300
+ span<T> make_span (T* begin, T* end) noexcept
336
301
{
337
302
return span<T>(begin, end);
338
303
}
339
304
340
305
template <typename T>
341
- span<T> make_span (T* begin, size_t size)
306
+ span<T> make_span (T* begin, size_t size) noexcept
342
307
{
343
308
return span<T>(begin, size);
344
309
}
345
310
346
311
template <typename Container, typename Ptr = decltype (std::declval<Container>().data())>
347
- auto make_span (Container& c) -> span<typename std::remove_pointer<Ptr>::type>
312
+ auto make_span (Container& c) noexcept -> span<typename std::remove_pointer<Ptr>::type>
348
313
{
349
314
return span<typename std::remove_pointer<Ptr>::type>(c);
350
315
}
351
316
352
317
template <typename T, size_t N>
353
- span<T> make_span (T(&ar)[N])
318
+ span<T> make_span (T(&ar)[N]) noexcept
354
319
{
355
320
return span<T>(ar);
356
321
}
0 commit comments