CppWAMP
C++11 client library for the WAMP protocol
optional.hpp
Go to the documentation of this file.
1 /*------------------------------------------------------------------------------
2  Copyright Butterfly Energy Systems 2014-2015, 2022.
3  Distributed under the Boost Software License, Version 1.0.
4  http://www.boost.org/LICENSE_1_0.txt
5 ------------------------------------------------------------------------------*/
6 
7 #ifndef CPPWAMP_TYPES_OPTIONAL_HPP
8 #define CPPWAMP_TYPES_OPTIONAL_HPP
9 
10 //------------------------------------------------------------------------------
14 //------------------------------------------------------------------------------
15 
16 #include <optional>
17 #include "../api.hpp"
18 #include "../variant.hpp"
19 
20 namespace wamp
21 {
22 
23 //------------------------------------------------------------------------------
26 //------------------------------------------------------------------------------
27 template <typename T>
28 CPPWAMP_API void convert(FromVariantConverter& conv, std::optional<T>& opt)
29 {
30  const auto& variant = conv.variant();
31  if (!variant)
32  opt.reset();
33  else
34  opt = variant.to<T>();
35 }
36 
37 //------------------------------------------------------------------------------
40 //------------------------------------------------------------------------------
41 template <typename T>
42 CPPWAMP_API void convert(ToVariantConverter& conv, std::optional<T>& opt)
43 {
44  auto& variant = conv.variant();
45  if (!opt)
46  variant = null;
47  else
48  variant = Variant::from(*opt);
49 }
50 
51 
52 //------------------------------------------------------------------------------
53 // Comparison Operators
54 //------------------------------------------------------------------------------
55 
57 template <typename T>
58 CPPWAMP_API bool operator==(const Variant& v, const std::optional<T> o)
59 {
60  return !o ? !v : (v == *o);
61 }
62 
64 template <typename T>
65 CPPWAMP_API bool operator==(const std::optional<T> o, const Variant& v)
66 {
67  return v == o;
68 }
69 
71 template <typename T>
72 CPPWAMP_API bool operator!=(const Variant& v, const std::optional<T> o)
73 {
74  return !o ? !!v : (v != *o);
75 }
76 
78 template <typename T>
79 CPPWAMP_API bool operator!=(const std::optional<T> o, const Variant& v)
80 {
81  return v != o;
82 }
83 
84 } // namespace wamp
85 
86 #endif // CPPWAMP_TYPES_OPTIONAL_HPP
wamp::FromVariantConverter::variant
const Variant & variant() const
Returns a constant reference to the wrapped variant.
Definition: variant.hpp:1384
wamp::Variant
Discriminated union container that represents a JSON value.
Definition: variant.hpp:134
wamp::ToVariantConverter::variant
Variant & variant()
Returns a reference to the wrapped variant.
Definition: variant.hpp:1208
wamp
Definition: anyhandler.hpp:36
wamp::ToVariantConverter
Wrapper around a destination Variant, used for conversions.
Definition: variant.hpp:604
wamp::FromVariantConverter
Wrapper around a source Variant, used for conversions.
Definition: variant.hpp:650
wamp::convert
void convert(TConverter &c, TValue &val)
General function for converting custom types to/from Variant.
Definition: variant.hpp:709
wamp::Variant::to
T to() const
Converts the variant's bound value to the given type.
Definition: variant.hpp:840
wamp::Variant::from
static Variant from(TValue &&value)
Constructs a variant from a custom type.
Definition: variant.hpp:744