1 #ifndef BOOST_LEAF_DETAIL_OPTIONAL_HPP_INCLUDED
2 #define BOOST_LEAF_DETAIL_OPTIONAL_HPP_INCLUDED
4 // Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc.
6 // Distributed under the Boost Software License, Version 1.0. (See accompanying
7 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 #include <boost/leaf/config.hpp>
14 namespace boost { namespace leaf {
28 BOOST_LEAF_CONSTEXPR optional() noexcept:
33 BOOST_LEAF_CONSTEXPR optional( optional const & x ):
37 (void) new (&value_) T( x.value_ );
40 BOOST_LEAF_CONSTEXPR optional( optional && x ) noexcept:
45 (void) new (&value_) T( std::move(x.value_) );
50 BOOST_LEAF_CONSTEXPR optional( int key, T const & v ):
54 BOOST_LEAF_ASSERT(!empty());
57 BOOST_LEAF_CONSTEXPR optional( int key, T && v ) noexcept:
61 BOOST_LEAF_ASSERT(!empty());
64 BOOST_LEAF_CONSTEXPR optional & operator=( optional const & x )
67 if( int key = x.key() )
75 BOOST_LEAF_CONSTEXPR optional & operator=( optional && x ) noexcept
78 if( int key = x.key() )
80 put(key, std::move(x.value_));
91 BOOST_LEAF_CONSTEXPR bool empty() const noexcept
96 BOOST_LEAF_CONSTEXPR int key() const noexcept
101 BOOST_LEAF_CONSTEXPR void reset() noexcept
110 BOOST_LEAF_CONSTEXPR T & put( int key, T const & v )
112 BOOST_LEAF_ASSERT(key);
114 (void) new(&value_) T(v);
119 BOOST_LEAF_CONSTEXPR T & put( int key, T && v ) noexcept
121 BOOST_LEAF_ASSERT(key);
123 (void) new(&value_) T(std::move(v));
128 BOOST_LEAF_CONSTEXPR T const * has_value(int key) const noexcept
130 BOOST_LEAF_ASSERT(key);
131 return key_==key ? &value_ : 0;
134 BOOST_LEAF_CONSTEXPR T * has_value(int key) noexcept
136 BOOST_LEAF_ASSERT(key);
137 return key_==key ? &value_ : 0;
140 BOOST_LEAF_CONSTEXPR T const & value(int key) const & noexcept
142 BOOST_LEAF_ASSERT(has_value(key) != 0);
146 BOOST_LEAF_CONSTEXPR T & value(int key) & noexcept
148 BOOST_LEAF_ASSERT(has_value(key) != 0);
152 BOOST_LEAF_CONSTEXPR T const && value(int key) const && noexcept
154 BOOST_LEAF_ASSERT(has_value(key) != 0);
158 BOOST_LEAF_CONSTEXPR T value(int key) && noexcept
160 BOOST_LEAF_ASSERT(has_value(key) != 0);
161 T tmp(std::move(value_));