MongoDB C++ Driver mongocxx-3.6.7
view_or_value.hpp
1// Copyright 2015 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
19#include <bsoncxx/stdx/optional.hpp>
20
21#include <bsoncxx/config/prelude.hpp>
22
23namespace bsoncxx {
24BSONCXX_INLINE_NAMESPACE_BEGIN
25
29template <typename View, typename Value>
31 public:
32 using view_type = View;
33 using value_type = Value;
34
38 static_assert(std::is_constructible<View, Value>::value,
39 "View type must be constructible from a Value");
40
44 static_assert(std::is_default_constructible<View>::value,
45 "View type must be default constructible");
46
51 BSONCXX_INLINE view_or_value() = default;
52
60 BSONCXX_INLINE view_or_value(View view) : _view{view} {}
61
68 BSONCXX_INLINE view_or_value(Value&& value) : _value(std::move(value)), _view(*_value) {}
69
73 BSONCXX_INLINE view_or_value(const view_or_value& other)
74 : _value(other._value), _view(_value ? *_value : other._view) {}
75
79 BSONCXX_INLINE view_or_value& operator=(const view_or_value& other) {
80 _value = other._value;
81 _view = _value ? *_value : other._view;
82 return *this;
83 }
84
88
90 BSONCXX_INLINE view_or_value(view_or_value &&other) noexcept
91 : _value{std::move(other._value)},
92 _view(_value ? *_value : std::move(other._view)) {
93 other._view = View();
94 other._value = stdx::nullopt;
95 }
96
101 BSONCXX_INLINE view_or_value& operator=(view_or_value&& other) noexcept {
102 _value = std::move(other._value);
103 _view = _value ? *_value : std::move(other._view);
104 other._view = View();
105 other._value = stdx::nullopt;
106 return *this;
107 }
108
114 BSONCXX_INLINE bool is_owning() const noexcept {
115 return static_cast<bool>(_value);
116 }
117
123 BSONCXX_INLINE operator View() const {
124 return _view;
125 }
126
132 BSONCXX_INLINE const View& view() const {
133 return _view;
134 }
135
136 private:
137 stdx::optional<Value> _value;
138 View _view;
139};
140
148template <typename View, typename Value>
149BSONCXX_INLINE bool operator==(const view_or_value<View, Value>& lhs,
150 const view_or_value<View, Value>& rhs) {
151 return lhs.view() == rhs.view();
152}
153
154template <typename View, typename Value>
155BSONCXX_INLINE bool operator!=(const view_or_value<View, Value>& lhs,
156 const view_or_value<View, Value>& rhs) {
157 return !(lhs == rhs);
158}
162
170template <typename View, typename Value>
171BSONCXX_INLINE bool operator==(const view_or_value<View, Value>& lhs, View rhs) {
172 return lhs.view() == rhs;
173}
174
175template <typename View, typename Value>
176BSONCXX_INLINE bool operator==(View lhs, const view_or_value<View, Value>& rhs) {
177 return rhs == lhs;
178}
179
180template <typename View, typename Value>
181BSONCXX_INLINE bool operator!=(const view_or_value<View, Value>& lhs, View rhs) {
182 return !(lhs == rhs);
183}
184
185template <typename View, typename Value>
186BSONCXX_INLINE bool operator!=(View lhs, const view_or_value<View, Value>& rhs) {
187 return !(rhs == lhs);
188}
189
190template <typename View, typename Value>
191BSONCXX_INLINE bool operator==(const view_or_value<View, Value>& lhs, const Value& rhs) {
192 return lhs.view() == View(rhs);
193}
194
195template <typename View, typename Value>
196BSONCXX_INLINE bool operator==(const Value& lhs, const view_or_value<View, Value>& rhs) {
197 return rhs == lhs;
198}
199
200template <typename View, typename Value>
201BSONCXX_INLINE bool operator!=(const view_or_value<View, Value>& lhs, const Value& rhs) {
202 return !(lhs == rhs);
203}
204
205template <typename View, typename Value>
206BSONCXX_INLINE bool operator!=(const Value& lhs, const view_or_value<View, Value>& rhs) {
207 return !(rhs == lhs);
208}
212
213BSONCXX_INLINE_NAMESPACE_END
214} // namespace bsoncxx
215
216#include <bsoncxx/config/postlude.hpp>
Class representing a view-or-value variant type.
Definition: view_or_value.hpp:30
view_or_value(const view_or_value &other)
Construct a view_or_value from a copied view_or_value.
Definition: view_or_value.hpp:73
const View & view() const
Get a View for the type.
Definition: view_or_value.hpp:132
view_or_value(View view)
Construct a view_or_value from a View.
Definition: view_or_value.hpp:60
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:90
view_or_value()=default
Class View must be constructible from an instance of class Value.
bool operator==(const view_or_value< View, Value > &lhs, View rhs)
Mixed (in)-equality operators for view_or_value against View or Value types.
Definition: view_or_value.hpp:171
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:101
view_or_value(Value &&value)
Constructs a view_or_value from a Value type.
Definition: view_or_value.hpp:68
bool is_owning() const noexcept
Return whether or not this view_or_value owns an underlying Value.
Definition: view_or_value.hpp:114
view_or_value & operator=(const view_or_value &other)
Assign to this view_or_value from a copied view_or_value.
Definition: view_or_value.hpp:79
bool operator==(const view_or_value< View, Value > &lhs, const view_or_value< View, Value > &rhs)
Compare view_or_value objects for (in)-equality.
Definition: view_or_value.hpp:149
Top level namespace for MongoDB C++ BSON functionality.
Definition: element.hpp:24