26
26
#include " subspace/containers/__private/array_marker.h"
27
27
#include " subspace/containers/__private/slice_iter.h"
28
28
#include " subspace/containers/slice.h"
29
- #include " subspace/fn/fn_box_defn.h"
30
29
#include " subspace/fn/fn_concepts.h"
31
30
#include " subspace/fn/run_fn.h"
32
- #include " subspace/macros/compiler .h"
31
+ #include " subspace/macros/lifetimebound .h"
33
32
#include " subspace/marker/unsafe.h"
34
33
#include " subspace/mem/clone.h"
35
34
#include " subspace/mem/copy.h"
@@ -172,17 +171,17 @@ class Array final {
172
171
constexpr usize len () const & noexcept { return N; }
173
172
174
173
// / Returns a const reference to the element at index `i`.
175
- constexpr Option<const T&> at (usize i) const & noexcept
174
+ constexpr Option<const T&> get (usize i) const & noexcept sus_lifetimebound
176
175
requires(N > 0 )
177
176
{
178
177
if (i.primitive_value >= N) [[unlikely]]
179
178
return Option<const T&>::none ();
180
179
return Option<const T&>::some (storage_.data_ [i.primitive_value ]);
181
180
}
182
- constexpr Option<const T&> at (usize i) && = delete;
181
+ constexpr Option<const T&> get (usize i) && = delete;
183
182
184
183
// / Returns a mutable reference to the element at index `i`.
185
- constexpr Option<T&> get_mut (usize i) & noexcept
184
+ constexpr Option<T&> get_mut (usize i) & noexcept sus_lifetimebound
186
185
requires(N > 0 )
187
186
{
188
187
if (i.primitive_value >= N) [[unlikely]]
@@ -195,8 +194,8 @@ class Array final {
195
194
// / # Safety
196
195
// / The index `i` must be inside the bounds of the array or Undefined
197
196
// / Behaviour results.
198
- constexpr inline const T& get_unchecked (::sus::marker::UnsafeFnMarker,
199
- usize i) const & noexcept
197
+ constexpr inline const T& get_unchecked (
198
+ ::sus::marker::UnsafeFnMarker, usize i) const & noexcept sus_lifetimebound
200
199
requires(N > 0 )
201
200
{
202
201
return storage_.data_ [i.primitive_value ];
@@ -210,63 +209,64 @@ class Array final {
210
209
// / The index `i` must be inside the bounds of the array or Undefined
211
210
// / Behaviour results.
212
211
constexpr inline T& get_unchecked_mut (::sus::marker::UnsafeFnMarker,
213
- usize i) & noexcept
212
+ usize i) & noexcept sus_lifetimebound
214
213
requires(N > 0 )
215
214
{
216
215
return storage_.data_ [i.primitive_value ];
217
216
}
218
217
219
- constexpr inline const T& operator [](usize i) const & noexcept {
218
+ constexpr inline const T& operator [](usize i) const & noexcept
219
+ sus_lifetimebound {
220
220
check (i.primitive_value < N);
221
221
return storage_.data_ [i.primitive_value ];
222
222
}
223
223
constexpr inline const T& operator [](usize i) && = delete ;
224
224
225
- constexpr inline T& operator [](usize i) & noexcept {
225
+ constexpr inline T& operator [](usize i) & noexcept sus_lifetimebound {
226
226
check (i.primitive_value < N);
227
227
return storage_.data_ [i.primitive_value ];
228
228
}
229
229
230
230
// / Returns a const pointer to the first element in the array.
231
- inline const T* as_ptr () const & noexcept
231
+ inline const T* as_ptr () const & noexcept sus_lifetimebound
232
232
requires(N > 0 )
233
233
{
234
234
return storage_.data_ ;
235
235
}
236
236
const T* as_ptr () && = delete;
237
237
238
238
// / Returns a mutable pointer to the first element in the array.
239
- inline T* as_mut_ptr () & noexcept
239
+ inline T* as_mut_ptr () & noexcept sus_lifetimebound
240
240
requires(N > 0 )
241
241
{
242
242
return storage_.data_ ;
243
243
}
244
244
245
245
// Returns a slice that references all the elements of the array as const
246
246
// references.
247
- constexpr Slice<const T> as_ref () const & noexcept {
247
+ constexpr Slice<const T> as_slice () const & noexcept sus_lifetimebound {
248
248
return Slice<const T>::from (storage_.data_ );
249
249
}
250
- constexpr Slice<const T> as_ref () && = delete;
250
+ constexpr Slice<const T> as_slice () && = delete;
251
251
252
252
// Returns a slice that references all the elements of the array as mutable
253
253
// references.
254
- constexpr Slice<T> as_mut () & noexcept {
254
+ constexpr Slice<T> as_mut_slice () & noexcept sus_lifetimebound {
255
255
return Slice<T>::from (storage_.data_ );
256
256
}
257
257
258
258
// / Returns an iterator over all the elements in the array, visited in the
259
259
// / same order they appear in the array. The iterator gives const access to
260
260
// / each element.
261
- constexpr SliceIter<const T&> iter () const & noexcept {
261
+ constexpr SliceIter<const T&> iter () const & noexcept sus_lifetimebound {
262
262
return SliceIter<const T&>::with (storage_.data_ , N);
263
263
}
264
264
constexpr SliceIter<const T&> iter () && = delete;
265
265
266
266
// / Returns an iterator over all the elements in the array, visited in the
267
267
// / same order they appear in the array. The iterator gives mutable access to
268
268
// / each element.
269
- constexpr SliceIterMut<T&> iter_mut () & noexcept {
269
+ constexpr SliceIterMut<T&> iter_mut () & noexcept sus_lifetimebound {
270
270
return SliceIterMut<T&>::with (storage_.data_ , N);
271
271
}
272
272
@@ -331,7 +331,8 @@ class Array final {
331
331
template <class U , size_t ... Is>
332
332
constexpr inline auto eq_impl (const Array<U, N>& r,
333
333
std::index_sequence<Is...>) const & noexcept {
334
- return (... && (at (Is) == r.at (Is)));
334
+ return (... && (get_unchecked (::sus::marker::unsafe_fn, Is) ==
335
+ r.get_unchecked (::sus::marker::unsafe_fn, Is)));
335
336
};
336
337
337
338
// Using a union ensures that the default constructor doesn't initialize
@@ -350,7 +351,8 @@ namespace __private {
350
351
template <size_t I, class O , class T , class U , size_t N>
351
352
constexpr inline bool array_cmp_impl (O& val, const Array<T, N>& l,
352
353
const Array<U, N>& r) noexcept {
353
- auto cmp = l.at (I) <=> r.at (I);
354
+ auto cmp = l.get_unchecked (::sus::marker::unsafe_fn, I) <=>
355
+ r.get_unchecked (::sus::marker::unsafe_fn, I);
354
356
// Allow downgrading from equal to equivalent, but not the inverse.
355
357
if (cmp != 0 ) val = cmp;
356
358
// Short circuit by returning true when we find a difference.
@@ -432,7 +434,7 @@ auto get(Array<T, N>&& a) noexcept {
432
434
template <class ... Ts>
433
435
requires (sizeof ...(Ts) > 0 )
434
436
[[nodiscard]] inline constexpr auto array (
435
- Ts&&... vs sus_if_clang ([[clang::lifetimebound]]) ) noexcept {
437
+ Ts&&... vs sus_lifetimebound ) noexcept {
436
438
return __private::ArrayMarker<Ts...>(
437
439
::sus::tuple_type::Tuple<Ts&&...>::with (::sus::forward<Ts>(vs)...));
438
440
}
0 commit comments