]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/leaf/detail/optional.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / leaf / detail / optional.hpp
CommitLineData
20effc67
TL
1#ifndef BOOST_LEAF_DETAIL_OPTIONAL_HPP_INCLUDED
2#define BOOST_LEAF_DETAIL_OPTIONAL_HPP_INCLUDED
3
1e59de90 4// Copyright 2018-2022 Emil Dotchevski and Reverge Studios, Inc.
20effc67
TL
5
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)
8
1e59de90 9#include <boost/leaf/config.hpp>
20effc67 10
20effc67
TL
11#include <utility>
12#include <new>
13
14namespace boost { namespace leaf {
15
1e59de90
TL
16namespace leaf_detail
17{
18 template <class T>
19 class optional
20effc67 20 {
1e59de90
TL
21 int key_;
22 union { T value_; };
20effc67 23
1e59de90 24 public:
20effc67 25
1e59de90 26 typedef T value_type;
20effc67 27
1e59de90
TL
28 BOOST_LEAF_CONSTEXPR optional() noexcept:
29 key_(0)
30 {
31 }
20effc67 32
1e59de90
TL
33 BOOST_LEAF_CONSTEXPR optional( optional const & x ):
34 key_(x.key_)
35 {
36 if( x.key_ )
37 (void) new (&value_) T( x.value_ );
38 }
20effc67 39
1e59de90
TL
40 BOOST_LEAF_CONSTEXPR optional( optional && x ) noexcept:
41 key_(x.key_)
42 {
43 if( x.key_ )
20effc67 44 {
1e59de90
TL
45 (void) new (&value_) T( std::move(x.value_) );
46 x.reset();
20effc67 47 }
1e59de90 48 }
20effc67 49
1e59de90
TL
50 BOOST_LEAF_CONSTEXPR optional( int key, T const & v ):
51 key_(key),
52 value_(v)
53 {
54 BOOST_LEAF_ASSERT(!empty());
55 }
20effc67 56
1e59de90
TL
57 BOOST_LEAF_CONSTEXPR optional( int key, T && v ) noexcept:
58 key_(key),
59 value_(std::move(v))
60 {
61 BOOST_LEAF_ASSERT(!empty());
62 }
20effc67 63
1e59de90
TL
64 BOOST_LEAF_CONSTEXPR optional & operator=( optional const & x )
65 {
66 reset();
67 if( int key = x.key() )
20effc67 68 {
1e59de90
TL
69 put(key, x.value_);
70 key_ = key;
20effc67 71 }
1e59de90
TL
72 return *this;
73 }
20effc67 74
1e59de90
TL
75 BOOST_LEAF_CONSTEXPR optional & operator=( optional && x ) noexcept
76 {
77 reset();
78 if( int key = x.key() )
20effc67 79 {
1e59de90
TL
80 put(key, std::move(x.value_));
81 x.reset();
20effc67 82 }
1e59de90
TL
83 return *this;
84 }
20effc67 85
1e59de90
TL
86 ~optional() noexcept
87 {
88 reset();
89 }
20effc67 90
1e59de90
TL
91 BOOST_LEAF_CONSTEXPR bool empty() const noexcept
92 {
93 return key_==0;
94 }
20effc67 95
1e59de90
TL
96 BOOST_LEAF_CONSTEXPR int key() const noexcept
97 {
98 return key_;
99 }
20effc67 100
1e59de90
TL
101 BOOST_LEAF_CONSTEXPR void reset() noexcept
102 {
103 if( key_ )
20effc67 104 {
1e59de90
TL
105 value_.~T();
106 key_=0;
20effc67 107 }
1e59de90 108 }
20effc67 109
1e59de90
TL
110 BOOST_LEAF_CONSTEXPR T & put( int key, T const & v )
111 {
112 BOOST_LEAF_ASSERT(key);
113 reset();
114 (void) new(&value_) T(v);
115 key_=key;
116 return value_;
117 }
118
119 BOOST_LEAF_CONSTEXPR T & put( int key, T && v ) noexcept
120 {
121 BOOST_LEAF_ASSERT(key);
122 reset();
123 (void) new(&value_) T(std::move(v));
124 key_=key;
125 return value_;
126 }
127
128 BOOST_LEAF_CONSTEXPR T const * has_value(int key) const noexcept
129 {
130 BOOST_LEAF_ASSERT(key);
131 return key_==key ? &value_ : 0;
132 }
20effc67 133
1e59de90
TL
134 BOOST_LEAF_CONSTEXPR T * has_value(int key) noexcept
135 {
136 BOOST_LEAF_ASSERT(key);
137 return key_==key ? &value_ : 0;
138 }
20effc67 139
1e59de90
TL
140 BOOST_LEAF_CONSTEXPR T const & value(int key) const & noexcept
141 {
142 BOOST_LEAF_ASSERT(has_value(key) != 0);
143 return value_;
144 }
20effc67 145
1e59de90
TL
146 BOOST_LEAF_CONSTEXPR T & value(int key) & noexcept
147 {
148 BOOST_LEAF_ASSERT(has_value(key) != 0);
149 return value_;
150 }
20effc67 151
1e59de90
TL
152 BOOST_LEAF_CONSTEXPR T const && value(int key) const && noexcept
153 {
154 BOOST_LEAF_ASSERT(has_value(key) != 0);
155 return value_;
156 }
20effc67 157
1e59de90
TL
158 BOOST_LEAF_CONSTEXPR T value(int key) && noexcept
159 {
160 BOOST_LEAF_ASSERT(has_value(key) != 0);
161 T tmp(std::move(value_));
162 reset();
163 return tmp;
164 }
165 };
166
167}
20effc67
TL
168
169} }
170
171#endif