31
31
#include " subspace/iter/from_iterator.h"
32
32
#include " subspace/iter/into_iterator.h"
33
33
#include " subspace/macros/always_inline.h"
34
- #include " subspace/macros/compiler .h"
34
+ #include " subspace/macros/lifetimebound .h"
35
35
#include " subspace/macros/nonnull.h"
36
36
#include " subspace/marker/unsafe.h"
37
37
#include " subspace/mem/clone.h"
@@ -129,7 +129,7 @@ class Option final {
129
129
}
130
130
}
131
131
132
- static inline constexpr Option some (T& t) noexcept
132
+ static inline constexpr Option some (T& t sus_lifetimebound ) noexcept
133
133
requires(std::is_reference_v<T>)
134
134
{
135
135
return Option (move_to_storage (t));
@@ -385,12 +385,14 @@ class Option final {
385
385
// / reuse, making variable names bad.
386
386
// / * It's expected due to std::optional and general container-of-one things
387
387
// / to provide access through operator* and operator->.
388
- constexpr const std::remove_reference_t <T>& operator *() const & noexcept {
388
+ constexpr const std::remove_reference_t <T>& operator *() const & noexcept
389
+ sus_lifetimebound {
389
390
::sus::check (t_.state() == Some);
390
391
return t_.val ();
391
392
}
392
393
constexpr const std::remove_reference_t <T>* operator *() && noexcept = delete ;
393
- constexpr std::remove_reference_t <T>& operator *() & noexcept {
394
+ constexpr std::remove_reference_t <T>& operator *() & noexcept
395
+ sus_lifetimebound {
394
396
::sus::check (t_.state() == Some);
395
397
return t_.val_mut ();
396
398
}
@@ -420,13 +422,15 @@ class Option final {
420
422
// / reuse, making variable names bad.
421
423
// / * It's expected due to std::optional and general container-of-one things
422
424
// / to provide access through operator* and operator->.
423
- constexpr const std::remove_reference_t <T>* operator ->() const & noexcept {
425
+ constexpr const std::remove_reference_t <T>* operator ->() const & noexcept
426
+ sus_lifetimebound {
424
427
::sus::check (t_.state() == Some);
425
428
return ::sus::mem::addressof (
426
429
static_cast <const std::remove_reference_t <T>&>(t_.val ()));
427
430
}
428
431
constexpr const std::remove_reference_t <T>* operator ->() && noexcept ;
429
- constexpr std::remove_reference_t <T>* operator ->() & noexcept {
432
+ constexpr std::remove_reference_t <T>* operator ->() & noexcept
433
+ sus_lifetimebound {
430
434
::sus::check (t_.state() == Some);
431
435
return ::sus::mem::addressof (
432
436
static_cast <std::remove_reference_t <T>&>(t_.val_mut ()));
@@ -486,7 +490,7 @@ class Option final {
486
490
// /
487
491
// / If it is non-trivial to construct `T`, the <get_or_insert_with>() method
488
492
// / would be preferable, as it only constructs a `T` if needed.
489
- T& get_or_insert (T t) & noexcept
493
+ T& get_or_insert (T t) & noexcept sus_lifetimebound
490
494
requires(sus::mem::MoveOrRef<T>)
491
495
{
492
496
if (t_.state () == None) {
@@ -507,7 +511,7 @@ class Option final {
507
511
// /
508
512
// / The Option's contained type `T` must be #Default, and will be
509
513
// / constructed through that trait.
510
- constexpr T& get_or_insert_default () & noexcept
514
+ constexpr T& get_or_insert_default () & noexcept sus_lifetimebound
511
515
requires(::sus::construct::Default<T>)
512
516
{
513
517
if (t_.state () == None) t_.construct_from_none (T ());
@@ -835,7 +839,8 @@ class Option final {
835
839
836
840
// / Returns an Option<const T&> from this Option<T>, that either holds #None
837
841
// / or a reference to the value in this Option.
838
- constexpr Option<const std::remove_reference_t <T>&> as_ref () const & noexcept {
842
+ constexpr Option<const std::remove_reference_t <T>&> as_ref () const & noexcept
843
+ sus_lifetimebound {
839
844
if (t_.state () == None)
840
845
return Option<const std::remove_reference_t <T>&>::none ();
841
846
else
@@ -855,7 +860,7 @@ class Option final {
855
860
856
861
// / Returns an Option<T&> from this Option<T>, that either holds #None or a
857
862
// / reference to the value in this Option.
858
- constexpr Option<T&> as_mut () & noexcept {
863
+ constexpr Option<T&> as_mut () & noexcept sus_lifetimebound {
859
864
if (t_.state () == None)
860
865
return Option<T&>::none ();
861
866
else
@@ -873,7 +878,8 @@ class Option final {
873
878
return Option<T&>(t_.take_and_set_none ());
874
879
}
875
880
876
- constexpr Once<const std::remove_reference_t <T>&> iter () const & noexcept {
881
+ constexpr Once<const std::remove_reference_t <T>&> iter () const & noexcept
882
+ sus_lifetimebound {
877
883
return Once<const std::remove_reference_t <T>&>::with (as_ref ());
878
884
}
879
885
constexpr Once<const std::remove_reference_t <T>&> iter () && noexcept
@@ -883,7 +889,9 @@ class Option final {
883
889
::sus::move (*this ).as_ref());
884
890
}
885
891
886
- constexpr Once<T&> iter_mut () & noexcept { return Once<T&>::with (as_mut ()); }
892
+ constexpr Once<T&> iter_mut () & noexcept sus_lifetimebound {
893
+ return Once<T&>::with (as_mut ());
894
+ }
887
895
constexpr Once<T&> iter_mut () && noexcept
888
896
requires(std::is_reference_v<T>)
889
897
{
@@ -1048,7 +1056,7 @@ using sus::iter::__private::end;
1048
1056
// / Option<T&> correctly.
1049
1057
template <class T >
1050
1058
[[nodiscard]] inline constexpr __private::SomeMarker<T&&> some (
1051
- T&& t sus_if_clang ([[clang::lifetimebound]]) ) noexcept {
1059
+ T&& t sus_lifetimebound ) noexcept {
1052
1060
return __private::SomeMarker<T&&>(::sus::forward<T>(t));
1053
1061
}
1054
1062
0 commit comments