summaryrefslogtreecommitdiff
path: root/asl/option.hpp
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-11-02 20:18:32 +0100
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-12-20 15:35:58 +0100
commitc6a4aa13c256a65123355636d30f4a7b38c4fccf (patch)
treee8153a15297aafe02616733207ea76fa79b007c6 /asl/option.hpp
parent7e8e2ef0be2eebc7f872ea37620dc1b60d62197f (diff)
Add option::transform and option::or_else
Diffstat (limited to 'asl/option.hpp')
-rw-r--r--asl/option.hpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/asl/option.hpp b/asl/option.hpp
index ebb9eef..0c816f4 100644
--- a/asl/option.hpp
+++ b/asl/option.hpp
@@ -429,6 +429,53 @@ public:
}
return un_cvref_t<result_of_t<F(T)>>{};
}
+
+ template<typename F>
+ constexpr auto transform(F&& f) &
+ {
+ using U = un_cvref_t<result_of_t<F(T&)>>;
+ if (has_value())
+ {
+ return option<U>{ invoke(ASL_FWD(f), value()) };
+ }
+ return option<U>{};
+ }
+
+ template<typename F>
+ constexpr auto transform(F&& f) const&
+ {
+ using U = un_cvref_t<result_of_t<F(const T&)>>;
+ if (has_value())
+ {
+ return option<U>{ invoke(ASL_FWD(f), value()) };
+ }
+ return option<U>{};
+ }
+
+ template<typename F>
+ constexpr auto transform(F&& f) &&
+ {
+ using U = un_cvref_t<result_of_t<F(T)>>;
+ if (has_value())
+ {
+ return option<U>{ invoke(ASL_FWD(f), ASL_MOVE(value())) };
+ }
+ return option<U>{};
+ }
+
+ template<typename F>
+ constexpr option or_else(F&& f) const&
+ requires is_same<un_cvref_t<result_of_t<F()>>, option>
+ {
+ return has_value() ? *this : invoke(ASL_FWD(f));
+ }
+
+ template<typename F>
+ constexpr option or_else(F&& f) &&
+ requires is_same<un_cvref_t<result_of_t<F()>>, option>
+ {
+ return has_value() ? ASL_MOVE(*this) : invoke(ASL_FWD(f));
+ }
};
template<typename T>