Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-11-15 09:20:27

0001 /* Exception observers for outcome type
0002 (C) 2017-2023 Niall Douglas <http://www.nedproductions.biz/> (6 commits)
0003 File Created: Oct 2017
0004 
0005 
0006 Boost Software License - Version 1.0 - August 17th, 2003
0007 
0008 Permission is hereby granted, free of charge, to any person or organization
0009 obtaining a copy of the software and accompanying documentation covered by
0010 this license (the "Software") to use, reproduce, display, distribute,
0011 execute, and transmit the Software, and to prepare derivative works of the
0012 Software, and to permit third-parties to whom the Software is furnished to
0013 do so, all subject to the following:
0014 
0015 The copyright notices in the Software and this entire statement, including
0016 the above license grant, this restriction and the following disclaimer,
0017 must be included in all copies of the Software, in whole or in part, and
0018 all derivative works of the Software, unless such copies or derivative
0019 works are solely in the form of machine-executable object code generated by
0020 a source language processor.
0021 
0022 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0023 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0024 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
0025 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
0026 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
0027 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
0028 DEALINGS IN THE SOFTWARE.
0029 */
0030 
0031 #ifndef BOOST_OUTCOME_BASIC_OUTCOME_EXCEPTION_OBSERVERS_IMPL_HPP
0032 #define BOOST_OUTCOME_BASIC_OUTCOME_EXCEPTION_OBSERVERS_IMPL_HPP
0033 
0034 #include "basic_outcome_exception_observers.hpp"
0035 
0036 #include "../policy/base.hpp"
0037 
0038 BOOST_OUTCOME_V2_NAMESPACE_EXPORT_BEGIN
0039 
0040 namespace policy
0041 {
0042   template <class R, class S, class P, class NoValuePolicy, class Impl> inline constexpr auto &&base::_exception(Impl &&self) noexcept
0043   {
0044     // Impl will be some internal implementation class which has no knowledge of the _ptr stored
0045     // beneath it. So statically cast, preserving rvalue and constness, to the derived class.
0046     using Outcome = BOOST_OUTCOME_V2_NAMESPACE::detail::rebind_type<basic_outcome<R, S, P, NoValuePolicy>, decltype(self)>;
0047 #if defined(_MSC_VER) && _MSC_VER < 1920
0048     // VS2017 tries a copy construction in the correct implementation despite that Outcome is always a rvalue or lvalue ref! :(
0049     basic_outcome<R, S, P, NoValuePolicy> &_self = (basic_outcome<R, S, P, NoValuePolicy> &) (self);  // NOLINT
0050 #else
0051     Outcome _self = static_cast<Outcome>(self);  // NOLINT
0052 #endif
0053     return static_cast<Outcome>(_self)._ptr;
0054   }
0055 }  // namespace policy
0056 
0057 namespace detail
0058 {
0059   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::assume_exception() & noexcept
0060   {
0061     NoValuePolicy::narrow_exception_check(*this);
0062     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(*this);
0063   }
0064   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr const typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::assume_exception() const &noexcept
0065   {
0066     NoValuePolicy::narrow_exception_check(*this);
0067     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(*this);
0068   }
0069   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &&basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::assume_exception() && noexcept
0070   {
0071     NoValuePolicy::narrow_exception_check(std::move(*this));
0072     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(std::move(*this));
0073   }
0074   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr const typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &&basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::assume_exception() const &&noexcept
0075   {
0076     NoValuePolicy::narrow_exception_check(std::move(*this));
0077     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(std::move(*this));
0078   }
0079 
0080   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception() &
0081   {
0082     NoValuePolicy::wide_exception_check(*this);
0083     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(*this);
0084   }
0085   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr const typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception() const &
0086   {
0087     NoValuePolicy::wide_exception_check(*this);
0088     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(*this);
0089   }
0090   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &&basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception() &&
0091   {
0092     NoValuePolicy::wide_exception_check(std::move(*this));
0093     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(std::move(*this));
0094   }
0095   template <class Base, class R, class S, class P, class NoValuePolicy> inline constexpr const typename basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception_type &&basic_outcome_exception_observers<Base, R, S, P, NoValuePolicy>::exception() const &&
0096   {
0097     NoValuePolicy::wide_exception_check(std::move(*this));
0098     return NoValuePolicy::template _exception<R, S, P, NoValuePolicy>(std::move(*this));
0099   }
0100 }  // namespace detail
0101 
0102 BOOST_OUTCOME_V2_NAMESPACE_END
0103 
0104 #endif