Skip to content

Commit 0db7d83

Browse files
committed
[span] fix constness of fix constness of various methods as per C++20
1 parent d8efe7f commit 0db7d83

File tree

1 file changed

+24
-59
lines changed

1 file changed

+24
-59
lines changed

include/itlib/span.hpp

Lines changed: 24 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// itlib-span v1.01
1+
// itlib-span v1.02
22
//
33
// A C++11 implementation C++20's of std::span with a dynamic extent
44
//
@@ -28,6 +28,7 @@
2828
//
2929
// VERSION HISTORY
3030
//
31+
// 1.02 (2023-11-29) fix constness of various methods as per C++20
3132
// 1.01 (2023-11-27) byte_size() renamed to size_bytes() for C++20 compatibility
3233
// 1.00 (2022-05-16) Initial release
3334
//
@@ -110,15 +111,15 @@ class span
110111
template <typename U, typename = typename std::enable_if<
111112
std::is_same<T, U>::value ||
112113
std::is_same<T, const U>::value, int>::type>
113-
span(U* begin, U* end)
114+
span(U* begin, U* end) noexcept
114115
: m_begin(begin)
115116
, m_end(end)
116117
{}
117118

118119
template <typename U, typename = typename std::enable_if<
119120
std::is_same<T, U>::value ||
120121
std::is_same<T, const U>::value, int>::type>
121-
span(U* begin, size_t size)
122+
span(U* begin, size_t size) noexcept
122123
: span(begin, begin + size)
123124
{}
124125

@@ -129,20 +130,20 @@ class span
129130
template <typename Container, typename = typename std::enable_if<
130131
std::is_same<T*, decltype(std::declval<Container>().data())>::value ||
131132
std::is_same<T*, decltype(std::declval<const Container>().data())>::value, int>::type>
132-
span(Container& c)
133+
span(Container& c) noexcept
133134
: span(c.data(), c.size())
134135
{}
135136

136137
// span of const from span of non-const
137138
template <typename U, typename = typename std::enable_if<
138139
std::is_same<T, U>::value ||
139140
std::is_same<T, const U>::value, int>::type>
140-
span(const span<U>& s)
141+
span(const span<U>& s) noexcept
141142
: span(s.data(), s.size())
142143
{}
143144

144145
template <size_t N>
145-
span(T(&ar)[N])
146+
span(T(&ar)[N]) noexcept
146147
: span(ar, N)
147148
{}
148149

@@ -162,70 +163,39 @@ class span
162163
span(span&&) noexcept = default;
163164
span& operator=(span&&) noexcept = default;
164165

165-
explicit operator bool() const
166+
explicit operator bool() const noexcept
166167
{
167168
return !!m_begin;
168169
}
169170

170-
const T& at(size_t i) const
171+
T& at(size_t i) const noexcept
171172
{
172173
I_ITLIB_SPAN_BOUNDS_CHECK(i);
173174
return *(m_begin + i);
174175
}
175176

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
183178
{
184179
return at(i);
185180
}
186181

187-
T& operator[](size_t i)
188-
{
189-
return at(i);
190-
}
191-
192-
const T& front() const
182+
T& front() const noexcept
193183
{
194184
return at(0);
195185
}
196186

197-
T& front()
198-
{
199-
return at(0);
200-
}
201-
202-
const T& back() const
187+
T& back() const noexcept
203188
{
204189
return at(size() - 1);
205190
}
206191

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
218193
{
219194
return m_begin;
220195
}
221196

222197
// iterators
223-
iterator begin() noexcept
224-
{
225-
return m_begin;
226-
}
227-
228-
const_iterator begin() const noexcept
198+
iterator begin() const noexcept
229199
{
230200
return m_begin;
231201
}
@@ -235,12 +205,7 @@ class span
235205
return m_begin;
236206
}
237207

238-
iterator end() noexcept
239-
{
240-
return m_end;
241-
}
242-
243-
const_iterator end() const noexcept
208+
iterator end() const noexcept
244209
{
245210
return m_end;
246211
}
@@ -250,22 +215,22 @@ class span
250215
return m_end;
251216
}
252217

253-
reverse_iterator rbegin() noexcept
218+
reverse_iterator rbegin() const noexcept
254219
{
255220
return reverse_iterator(end());
256221
}
257222

258-
const_reverse_iterator rbegin() const noexcept
223+
const_reverse_iterator crbegin() const noexcept
259224
{
260225
return const_reverse_iterator(end());
261226
}
262227

263-
reverse_iterator rend() noexcept
228+
reverse_iterator rend() const noexcept
264229
{
265230
return reverse_iterator(begin());
266231
}
267232

268-
const_reverse_iterator rend() const noexcept
233+
const_reverse_iterator crend() const noexcept
269234
{
270235
return const_reverse_iterator(begin());
271236
}
@@ -292,7 +257,7 @@ class span
292257
return span<const uint8_t>(reinterpret_cast<const uint8_t*>(m_begin), size_bytes());
293258
}
294259

295-
span<byte_t> as_writable_bytes() noexcept
260+
span<byte_t> as_writable_bytes() const noexcept
296261
{
297262
return span<byte_t>(reinterpret_cast<byte_t*>(m_begin), size_bytes());
298263
}
@@ -332,25 +297,25 @@ class span
332297
};
333298

334299
template <typename T>
335-
span<T> make_span(T* begin, T* end)
300+
span<T> make_span(T* begin, T* end) noexcept
336301
{
337302
return span<T>(begin, end);
338303
}
339304

340305
template <typename T>
341-
span<T> make_span(T* begin, size_t size)
306+
span<T> make_span(T* begin, size_t size) noexcept
342307
{
343308
return span<T>(begin, size);
344309
}
345310

346311
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>
348313
{
349314
return span<typename std::remove_pointer<Ptr>::type>(c);
350315
}
351316

352317
template <typename T, size_t N>
353-
span<T> make_span(T(&ar)[N])
318+
span<T> make_span(T(&ar)[N]) noexcept
354319
{
355320
return span<T>(ar);
356321
}

0 commit comments

Comments
 (0)