MongoDB C++ Driver 4.1.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
view_or_value.hpp
Go to the documentation of this file.
1// Copyright 2009-present MongoDB, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
17#include <type_traits>
18
20
22
24
25namespace bsoncxx {
26namespace v_noabi {
27
31template <typename View, typename Value>
33 public:
34 using view_type = View;
35 using value_type = Value;
36
40 static_assert(std::is_constructible<View, Value>::value, "View type must be constructible from a Value");
41
45 static_assert(std::is_default_constructible<View>::value, "View type must be default constructible");
46
50 ~view_or_value() = default;
51
56 view_or_value() = default;
57
65 view_or_value(View view) : _view{view} {}
66
73 view_or_value(Value&& value) : _value(std::move(value)), _view(*_value) {}
74
78 view_or_value(view_or_value const& other) : _value(other._value), _view(_value ? *_value : other._view) {}
79
84 _value = other._value;
85 _view = _value ? *_value : other._view;
86 return *this;
87 }
88
92
94 view_or_value(view_or_value&& other) noexcept
95 : _value{std::move(other._value)}, _view(_value ? *_value : std::move(other._view)) {
96 other._view = View();
97 other._value = stdx::nullopt;
98 }
99
105 _value = std::move(other._value);
106 _view = _value ? *_value : std::move(other._view);
107 other._view = View();
108 other._value = stdx::nullopt;
109 return *this;
110 }
111
117 bool is_owning() const noexcept {
118 return static_cast<bool>(_value);
119 }
120
126 operator View() const {
127 return _view;
128 }
129
135 View const& view() const {
136 return _view;
137 }
138
139 private:
141 View _view;
142};
143
148
150template <typename View, typename Value>
152 return lhs.view() == rhs.view();
153}
154
156template <typename View, typename Value>
158 return !(lhs == rhs);
159}
160
163
168
170template <typename View, typename Value>
171bool operator==(view_or_value<View, Value> const& lhs, View rhs) {
172 return lhs.view() == rhs;
173}
174
176template <typename View, typename Value>
177bool operator==(View lhs, view_or_value<View, Value> const& rhs) {
178 return rhs == lhs;
179}
180
182template <typename View, typename Value>
183bool operator!=(view_or_value<View, Value> const& lhs, View rhs) {
184 return !(lhs == rhs);
185}
186
188template <typename View, typename Value>
189bool operator!=(View lhs, view_or_value<View, Value> const& rhs) {
190 return !(rhs == lhs);
191}
192
194template <typename View, typename Value>
195bool operator==(view_or_value<View, Value> const& lhs, Value const& rhs) {
196 return lhs.view() == View(rhs);
197}
198
200template <typename View, typename Value>
201bool operator==(Value const& lhs, view_or_value<View, Value> const& rhs) {
202 return rhs == lhs;
203}
204
206template <typename View, typename Value>
207bool operator!=(view_or_value<View, Value> const& lhs, Value const& rhs) {
208 return !(lhs == rhs);
209}
210
212template <typename View, typename Value>
213bool operator!=(Value const& lhs, view_or_value<View, Value> const& rhs) {
214 return !(rhs == lhs);
215}
216
219
220} // namespace v_noabi
221} // namespace bsoncxx
222
223namespace bsoncxx {
224
225using ::bsoncxx::v_noabi::operator==;
226using ::bsoncxx::v_noabi::operator!=;
227
228} // namespace bsoncxx
229
231
The bsoncxx v_noabi macro guard postlude header.
The bsoncxx v_noabi macro guard prelude header.
A polyfill for std::optional<T>.
Definition optional.hpp:800
view_or_value(View view)
Construct a view_or_value from a View. When constructed with a View, this object is non-owning....
Definition view_or_value.hpp:65
bool operator==(view_or_value< View, Value > const &lhs, view_or_value< View, Value > const &rhs)
Compare view_or_value objects for (in)equality.
Definition view_or_value.hpp:151
view_or_value()=default
Default-constructs a view_or_value. This is equivalent to constructing a view_or_value with a default...
bool operator!=(Value const &lhs, view_or_value< View, Value > const &rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:213
view_or_value(view_or_value const &other)
Construct a view_or_value from a copied view_or_value.
Definition view_or_value.hpp:78
bool is_owning() const noexcept
Return whether or not this view_or_value owns an underlying Value.
Definition view_or_value.hpp:117
bool operator!=(view_or_value< View, Value > const &lhs, View rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:183
view const & view() const
Definition view_or_value.hpp:135
view_or_value(Value &&value)
Constructs a view_or_value from a Value type. This object owns the passed-in Value.
Definition view_or_value.hpp:73
bool operator==(View lhs, view_or_value< View, Value > const &rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:177
view_or_value & operator=(view_or_value &&other) noexcept
Assign to this view_or_value from a moved-in view_or_value.
Definition view_or_value.hpp:104
bool operator!=(view_or_value< View, Value > const &lhs, view_or_value< View, Value > const &rhs)
Compare view_or_value objects for (in)equality.
Definition view_or_value.hpp:157
view_or_value & operator=(view_or_value const &other)
Assign to this view_or_value from a copied view_or_value.
Definition view_or_value.hpp:83
bool operator==(Value const &lhs, view_or_value< View, Value > const &rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:201
bool operator==(view_or_value< View, Value > const &lhs, Value const &rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:195
bool operator!=(view_or_value< View, Value > const &lhs, Value const &rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:207
view_or_value(view_or_value &&other) noexcept
Construct a view_or_value from a moved-in view_or_value.
Definition view_or_value.hpp:94
bool operator!=(View lhs, view_or_value< View, Value > const &rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:189
~view_or_value()=default
View must be constructible from an instance of class Value.
bool operator==(view_or_value< View, Value > const &lhs, View rhs)
Mixed (in)equality operators for view_or_value against View and Value types.
Definition view_or_value.hpp:171
Declares entities whose ABI stability is NOT guaranteed.
The top-level namespace within which all bsoncxx library entities are declared.
Provides std::optional-related polyfills for library API usage.
Declares bsoncxx::v_noabi::view_or_value.