diff --git a/source/mijin/container/optional.hpp b/source/mijin/container/optional.hpp index 80f1fac..6411773 100644 --- a/source/mijin/container/optional.hpp +++ b/source/mijin/container/optional.hpp @@ -156,6 +156,14 @@ public: public: [[nodiscard]] inline std::remove_reference_t& get() noexcept; [[nodiscard]] inline const std::remove_reference_t& get() const noexcept; + template + [[nodiscard]] inline std::remove_reference_t getOr(TDefault&& defaultValue) const& MIJIN_NOEXCEPT_IF((std::is_nothrow_constructible_v && std::is_nothrow_copy_constructible_v)); + template + [[nodiscard]] inline std::remove_reference_t getOr(TDefault&& defaultValue) && MIJIN_NOEXCEPT_IF((std::is_nothrow_constructible_v && std::is_nothrow_move_constructible_v)); + template + [[nodiscard]] inline std::remove_reference_t getOrThrow(TArgs&&... args) const&; + template + [[nodiscard]] inline std::remove_reference_t getOrThrow(TArgs&&... args) &&; [[nodiscard]] constexpr bool empty() const noexcept { return storage_.empty(); } inline void reset() noexcept; @@ -350,6 +358,46 @@ inline const std::remove_reference_t& Optional::get() const noex return storage_.get(); } +template +template +std::remove_reference_t Optional::getOr(TDefault&& defaultValue) const& MIJIN_NOEXCEPT_IF((std::is_nothrow_constructible_v && std::is_nothrow_copy_constructible_v)) +{ + if (!empty()) { + return get(); + } + return TValue(std::forward(defaultValue)); +} + +template +template +std::remove_reference_t Optional::getOr(TDefault&& defaultValue) && MIJIN_NOEXCEPT_IF((std::is_nothrow_constructible_v && std::is_nothrow_move_constructible_v)) +{ + if (!empty()) { + return std::move(get()); + } + return TValue(std::forward(defaultValue)); +} + +template +template +std::remove_reference_t Optional::getOrThrow(TArgs&&... args) const& +{ + if (!empty()) { + return get(); + } + throw TException(std::forward(args)...); +} + +template +template +std::remove_reference_t Optional::getOrThrow(TArgs&&... args) && +{ + if (!empty()) { + return std::move(get()); + } + throw TException(std::forward(args)...); +} + template inline void Optional::reset() noexcept {