Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions include/beman/optional/optional.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,8 @@ class optional {
* @return optional
*/
template <class F>
constexpr optional or_else(F&& f) const&;
constexpr optional or_else(F&& f) const&
requires (std::invocable<F> && std::copy_constructible<T>);

/**
* @brief Returns an optional containing the contained value if it has one, or
Expand All @@ -738,7 +739,8 @@ class optional {
* @return auto
*/
template <class F>
constexpr optional or_else(F&& f) &&;
constexpr optional or_else(F&& f) &&
requires (std::invocable<F> && std::move_constructible<T>);

// \ref{optional.mod}, modifiers
/**
Expand Down Expand Up @@ -1231,7 +1233,9 @@ constexpr auto optional<T>::transform(F&& f) const&& {
*/
template <class T>
template <class F>
constexpr optional<T> optional<T>::or_else(F&& f) const& {
constexpr optional<T> optional<T>::or_else(F&& f) const&
requires (std::invocable<F> && std::copy_constructible<T>)
{
static_assert(std::is_same_v<std::remove_cvref_t<std::invoke_result_t<F>>, optional>);
if (has_value())
return value_;
Expand All @@ -1250,7 +1254,9 @@ constexpr optional<T> optional<T>::or_else(F&& f) const& {
*/
template <class T>
template <class F>
constexpr optional<T> optional<T>::or_else(F&& f) && {
constexpr optional<T> optional<T>::or_else(F&& f) &&
requires (std::invocable<F> && std::move_constructible<T>)
{
static_assert(std::is_same_v<std::remove_cvref_t<std::invoke_result_t<F>>, optional>);
if (has_value())
return std::move(value_);
Expand Down Expand Up @@ -1870,7 +1876,8 @@ class optional<T&> {
* return an optional type.
*/
template <class F>
constexpr optional or_else(F&& f) const;
constexpr optional or_else(F&& f) const
requires (std::invocable<F>);

// \ref{optional.mod}, modifiers
/**
Expand Down Expand Up @@ -2078,7 +2085,10 @@ constexpr optional<std::invoke_result_t<F, T&>> optional<T&>::transform(F&& f) c
*/
template <class T>
template <class F>
constexpr optional<T&> optional<T&>::or_else(F&& f) const {
constexpr optional<T&> optional<T&>::or_else(F&& f) const

requires (std::invocable<F>)
{
using U = std::invoke_result_t<F>;
static_assert(std::is_same_v<std::remove_cvref_t<U>, optional>, "Result must be an optional");
if (has_value()) {
Expand Down