• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Policies for result and outcome
2 (C) 2017-2020 Niall Douglas <http://www.nedproductions.biz/> (6 commits) and Andrzej Krzemieński <akrzemi1@gmail.com> (1 commit)
3 File Created: Oct 2017
4 
5 
6 Boost Software License - Version 1.0 - August 17th, 2003
7 
8 Permission is hereby granted, free of charge, to any person or organization
9 obtaining a copy of the software and accompanying documentation covered by
10 this license (the "Software") to use, reproduce, display, distribute,
11 execute, and transmit the Software, and to prepare derivative works of the
12 Software, and to permit third-parties to whom the Software is furnished to
13 do so, all subject to the following:
14 
15 The copyright notices in the Software and this entire statement, including
16 the above license grant, this restriction and the following disclaimer,
17 must be included in all copies of the Software, in whole or in part, and
18 all derivative works of the Software, unless such copies or derivative
19 works are solely in the form of machine-executable object code generated by
20 a source language processor.
21 
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
25 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
26 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
27 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 DEALINGS IN THE SOFTWARE.
29 */
30 
31 #ifndef BOOST_OUTCOME_POLICY_BASE_HPP
32 #define BOOST_OUTCOME_POLICY_BASE_HPP
33 
34 #include "../detail/value_storage.hpp"
35 
36 BOOST_OUTCOME_V2_NAMESPACE_EXPORT_BEGIN
37 
38 namespace policy
39 {
40   namespace detail
41   {
42     using BOOST_OUTCOME_V2_NAMESPACE::detail::make_ub;
43   }
44   /*! AWAITING HUGO JSON CONVERSION TOOL
45 SIGNATURE NOT RECOGNISED
46 */
47   struct base
48   {
49   protected:
_make_ubpolicy::base50     template <class Impl> static constexpr void _make_ub(Impl &&self) noexcept { return detail::make_ub(static_cast<Impl &&>(self)); }
_has_valuepolicy::base51     template <class Impl> static constexpr bool _has_value(Impl &&self) noexcept { return self._state._status.have_value(); }
_has_errorpolicy::base52     template <class Impl> static constexpr bool _has_error(Impl &&self) noexcept { return self._state._status.have_error(); }
_has_exceptionpolicy::base53     template <class Impl> static constexpr bool _has_exception(Impl &&self) noexcept { return self._state._status.have_exception(); }
_has_error_is_errnopolicy::base54     template <class Impl> static constexpr bool _has_error_is_errno(Impl &&self) noexcept { return self._state._status.have_error_is_errno(); }
55 
_set_has_valuepolicy::base56     template <class Impl> static constexpr void _set_has_value(Impl &&self, bool v) noexcept { self._state._status.set_have_value(v); }
_set_has_errorpolicy::base57     template <class Impl> static constexpr void _set_has_error(Impl &&self, bool v) noexcept { self._state._status.set_have_error(v); }
_set_has_exceptionpolicy::base58     template <class Impl> static constexpr void _set_has_exception(Impl &&self, bool v) noexcept { self._state._status.set_have_exception(v); }
_set_has_error_is_errnopolicy::base59     template <class Impl> static constexpr void _set_has_error_is_errno(Impl &&self, bool v) noexcept { self._state._status.set_have_error_is_errno(v); }
60 
_valuepolicy::base61     template <class Impl> static constexpr auto &&_value(Impl &&self) noexcept { return static_cast<Impl &&>(self)._state._value; }
_errorpolicy::base62     template <class Impl> static constexpr auto &&_error(Impl &&self) noexcept { return static_cast<Impl &&>(self)._error; }
63 
64   public:
65     template <class R, class S, class P, class NoValuePolicy, class Impl> static inline constexpr auto &&_exception(Impl &&self) noexcept;
66 
narrow_value_checkpolicy::base67     template <class Impl> static constexpr void narrow_value_check(Impl &&self) noexcept
68     {
69       if(!_has_value(self))
70       {
71         _make_ub(self);
72       }
73     }
narrow_error_checkpolicy::base74     template <class Impl> static constexpr void narrow_error_check(Impl &&self) noexcept
75     {
76       if(!_has_error(self))
77       {
78         _make_ub(self);
79       }
80     }
narrow_exception_checkpolicy::base81     template <class Impl> static constexpr void narrow_exception_check(Impl &&self) noexcept
82     {
83       if(!_has_exception(self))
84       {
85         _make_ub(self);
86       }
87     }
88   };
89 }  // namespace policy
90 
91 BOOST_OUTCOME_V2_NAMESPACE_END
92 
93 #endif
94