jsoncons 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/jsoncons/extconf.rb +43 -0
- data/ext/jsoncons/jsoncons.cpp +161 -0
- data/ext/jsoncons/jsoncons.h +10 -0
- data/jsoncons.gemspec +44 -0
- data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
- data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
- data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
- data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
- data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
- data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
- data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
- data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
- data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
- data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
- data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
- data/lib/jsoncons/version.rb +5 -0
- data/lib/jsoncons.rb +33 -0
- data/test/jsoncons_test.rb +108 -0
- data/test/test_helper.rb +7 -0
- metadata +268 -0
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
// Copyright 2019 Daniel Parker
|
|
2
|
+
// Distributed under the Boost license, Version 1.0.
|
|
3
|
+
// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
4
|
+
|
|
5
|
+
// See https://github.com/danielaparker/jsoncons for latest version
|
|
6
|
+
|
|
7
|
+
#ifndef JSONCONS_DETAIL_OPTIONAL_HPP
|
|
8
|
+
#define JSONCONS_DETAIL_OPTIONAL_HPP
|
|
9
|
+
|
|
10
|
+
#include <new> // placement new
|
|
11
|
+
#include <memory>
|
|
12
|
+
#include <utility> // std::swap
|
|
13
|
+
#include <type_traits>
|
|
14
|
+
#include <jsoncons/config/compiler_support.hpp>
|
|
15
|
+
|
|
16
|
+
namespace jsoncons
|
|
17
|
+
{
|
|
18
|
+
namespace detail
|
|
19
|
+
{
|
|
20
|
+
template <typename T>
|
|
21
|
+
class optional;
|
|
22
|
+
|
|
23
|
+
template <typename T1, typename T2>
|
|
24
|
+
struct is_constructible_or_convertible_from_optional
|
|
25
|
+
: std::integral_constant<
|
|
26
|
+
bool, std::is_constructible<T1, optional<T2>&>::value ||
|
|
27
|
+
std::is_constructible<T1, optional<T2>&&>::value ||
|
|
28
|
+
std::is_constructible<T1, const optional<T2>&>::value ||
|
|
29
|
+
std::is_constructible<T1, const optional<T2>&&>::value ||
|
|
30
|
+
std::is_convertible<optional<T2>&, T1>::value ||
|
|
31
|
+
std::is_convertible<optional<T2>&&, T1>::value ||
|
|
32
|
+
std::is_convertible<const optional<T2>&, T1>::value ||
|
|
33
|
+
std::is_convertible<const optional<T2>&&, T1>::value> {};
|
|
34
|
+
|
|
35
|
+
template <typename T1, typename T2>
|
|
36
|
+
struct is_constructible_convertible_or_assignable_from_optional
|
|
37
|
+
: std::integral_constant<
|
|
38
|
+
bool, is_constructible_or_convertible_from_optional<T1, T2>::value ||
|
|
39
|
+
std::is_assignable<T1&, optional<T2>&>::value ||
|
|
40
|
+
std::is_assignable<T1&, optional<T2>&&>::value ||
|
|
41
|
+
std::is_assignable<T1&, const optional<T2>&>::value ||
|
|
42
|
+
std::is_assignable<T1&, const optional<T2>&&>::value> {};
|
|
43
|
+
|
|
44
|
+
template <typename T>
|
|
45
|
+
class optional
|
|
46
|
+
{
|
|
47
|
+
public:
|
|
48
|
+
using value_type = T;
|
|
49
|
+
private:
|
|
50
|
+
bool has_value_;
|
|
51
|
+
union {
|
|
52
|
+
char dummy_;
|
|
53
|
+
T value_;
|
|
54
|
+
};
|
|
55
|
+
public:
|
|
56
|
+
constexpr optional() noexcept
|
|
57
|
+
: has_value_(false), dummy_{}
|
|
58
|
+
{
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// copy constructors
|
|
62
|
+
optional(const optional<T>& other)
|
|
63
|
+
: has_value_(false), dummy_{}
|
|
64
|
+
{
|
|
65
|
+
if (other)
|
|
66
|
+
{
|
|
67
|
+
construct(*other);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// converting
|
|
72
|
+
template <class U,
|
|
73
|
+
typename std::enable_if<!std::is_same<T,U>::value &&
|
|
74
|
+
std::is_constructible<T, const U&>::value &&
|
|
75
|
+
std::is_convertible<const U&,T>::value &&
|
|
76
|
+
!is_constructible_or_convertible_from_optional<T,U>::value &&
|
|
77
|
+
std::is_copy_constructible<typename std::decay<U>::type>::value,int>::type = 0>
|
|
78
|
+
optional(const optional<U>& other)
|
|
79
|
+
: has_value_(false), dummy_{}
|
|
80
|
+
{
|
|
81
|
+
if (other)
|
|
82
|
+
{
|
|
83
|
+
construct(*other);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
template <class U,
|
|
88
|
+
typename std::enable_if<!std::is_same<T,U>::value &&
|
|
89
|
+
std::is_constructible<T, const U&>::value &&
|
|
90
|
+
!std::is_convertible<const U&,T>::value &&
|
|
91
|
+
!is_constructible_or_convertible_from_optional<T,U>::value &&
|
|
92
|
+
std::is_copy_constructible<typename std::decay<U>::type>::value,int>::type = 0>
|
|
93
|
+
explicit optional(const optional<U>& other)
|
|
94
|
+
: has_value_(false), dummy_{}
|
|
95
|
+
{
|
|
96
|
+
if (other)
|
|
97
|
+
{
|
|
98
|
+
construct(*other);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// move constructors
|
|
103
|
+
template <class T2 = T>
|
|
104
|
+
optional(optional<T>&& other,
|
|
105
|
+
typename std::enable_if<std::is_move_constructible<typename std::decay<T2>::type>::value>::type* = 0)
|
|
106
|
+
: has_value_(false), dummy_{}
|
|
107
|
+
{
|
|
108
|
+
if (other)
|
|
109
|
+
{
|
|
110
|
+
construct(std::move(other.value_));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// converting
|
|
115
|
+
template <class U>
|
|
116
|
+
optional(optional<U>&& value,
|
|
117
|
+
typename std::enable_if<!std::is_same<T,U>::value &&
|
|
118
|
+
std::is_constructible<T, U&&>::value &&
|
|
119
|
+
!is_constructible_or_convertible_from_optional<T,U>::value &&
|
|
120
|
+
std::is_convertible<U&&,T>::value,int>::type = 0) // (8)
|
|
121
|
+
: has_value_(true), value_(std::forward<U>(value))
|
|
122
|
+
{
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
template <class U>
|
|
126
|
+
explicit optional(optional<U>&& value,
|
|
127
|
+
typename std::enable_if<!std::is_same<T,U>::value &&
|
|
128
|
+
std::is_constructible<T, U&&>::value &&
|
|
129
|
+
!is_constructible_or_convertible_from_optional<T,U>::value &&
|
|
130
|
+
!std::is_convertible<U&&,T>::value,int>::type = 0) // (8)
|
|
131
|
+
: has_value_(true), value_(std::forward<U>(value))
|
|
132
|
+
{
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
// value constructors
|
|
137
|
+
template <class T2>
|
|
138
|
+
optional(T2&& value,
|
|
139
|
+
typename std::enable_if<!std::is_same<optional<T>,typename std::decay<T2>::type>::value &&
|
|
140
|
+
std::is_constructible<T, T2>::value &&
|
|
141
|
+
std::is_convertible<T2,T>::value,int>::type = 0) // (8)
|
|
142
|
+
: has_value_(true), value_(std::forward<T2>(value))
|
|
143
|
+
{
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
template <class T2>
|
|
147
|
+
explicit optional(T2&& value,
|
|
148
|
+
typename std::enable_if<!std::is_same<optional<T>,typename std::decay<T2>::type>::value &&
|
|
149
|
+
std::is_constructible<T, T2>::value &&
|
|
150
|
+
!std::is_convertible<T2,T>::value,int>::type = 0) // (8)
|
|
151
|
+
: has_value_(true), value_(std::forward<T2>(value))
|
|
152
|
+
{
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
~optional() noexcept
|
|
156
|
+
{
|
|
157
|
+
destroy();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
optional& operator=(const optional& other)
|
|
161
|
+
{
|
|
162
|
+
if (other)
|
|
163
|
+
{
|
|
164
|
+
assign(*other);
|
|
165
|
+
}
|
|
166
|
+
else
|
|
167
|
+
{
|
|
168
|
+
reset();
|
|
169
|
+
}
|
|
170
|
+
return *this;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
optional& operator=(optional&& other )
|
|
174
|
+
{
|
|
175
|
+
if (other)
|
|
176
|
+
{
|
|
177
|
+
assign(std::move(*other));
|
|
178
|
+
}
|
|
179
|
+
else
|
|
180
|
+
{
|
|
181
|
+
reset();
|
|
182
|
+
}
|
|
183
|
+
return *this;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
template <typename U>
|
|
187
|
+
typename std::enable_if<!std::is_same<optional<T>, U>::value &&
|
|
188
|
+
std::is_constructible<T, const U&>::value &&
|
|
189
|
+
!is_constructible_convertible_or_assignable_from_optional<T,U>::value &&
|
|
190
|
+
std::is_assignable<T&, const U&>::value,
|
|
191
|
+
optional&>::type
|
|
192
|
+
operator=(const optional<U>& other)
|
|
193
|
+
{
|
|
194
|
+
if (other)
|
|
195
|
+
{
|
|
196
|
+
assign(*other);
|
|
197
|
+
}
|
|
198
|
+
else
|
|
199
|
+
{
|
|
200
|
+
destroy();
|
|
201
|
+
}
|
|
202
|
+
return *this;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
template <typename U>
|
|
206
|
+
typename std::enable_if<!std::is_same<optional<T>, U>::value &&
|
|
207
|
+
std::is_constructible<T, U>::value &&
|
|
208
|
+
!is_constructible_convertible_or_assignable_from_optional<T,U>::value &&
|
|
209
|
+
std::is_assignable<T&, U>::value,
|
|
210
|
+
optional&>::type
|
|
211
|
+
operator=(optional<U>&& other)
|
|
212
|
+
{
|
|
213
|
+
if (other)
|
|
214
|
+
{
|
|
215
|
+
assign(std::move(*other));
|
|
216
|
+
}
|
|
217
|
+
else
|
|
218
|
+
{
|
|
219
|
+
destroy();
|
|
220
|
+
}
|
|
221
|
+
return *this;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// value assignment
|
|
225
|
+
template <typename T2>
|
|
226
|
+
typename std::enable_if<!std::is_same<optional<T>, typename std::decay<T2>::type>::value &&
|
|
227
|
+
std::is_constructible<T, T2>::value &&
|
|
228
|
+
std::is_assignable<T&, T2>::value &&
|
|
229
|
+
!(std::is_scalar<T>::value && std::is_same<T, typename std::decay<T2>::type>::value),
|
|
230
|
+
optional&>::type
|
|
231
|
+
operator=(T2&& v)
|
|
232
|
+
{
|
|
233
|
+
assign(std::forward<T2>(v));
|
|
234
|
+
return *this;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
constexpr explicit operator bool() const noexcept
|
|
238
|
+
{
|
|
239
|
+
return has_value_;
|
|
240
|
+
}
|
|
241
|
+
constexpr bool has_value() const noexcept
|
|
242
|
+
{
|
|
243
|
+
return has_value_;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
#ifdef _MSC_VER
|
|
247
|
+
#pragma warning(push)
|
|
248
|
+
#pragma warning(disable : 4702)
|
|
249
|
+
#endif // _MSC_VER
|
|
250
|
+
|
|
251
|
+
T& value() &
|
|
252
|
+
{
|
|
253
|
+
return static_cast<bool>(*this)
|
|
254
|
+
? get()
|
|
255
|
+
: JSONCONS_THROW(std::runtime_error("Bad optional access")), get();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
constexpr const T& value() const &
|
|
259
|
+
{
|
|
260
|
+
return static_cast<bool>(*this)
|
|
261
|
+
? get()
|
|
262
|
+
: JSONCONS_THROW(std::runtime_error("Bad optional access")), get();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
template <typename U>
|
|
266
|
+
constexpr T value_or(U&& default_value) const &
|
|
267
|
+
{
|
|
268
|
+
static_assert(std::is_copy_constructible<T>::value,
|
|
269
|
+
"get_value_or: T must be copy constructible");
|
|
270
|
+
static_assert(std::is_convertible<U&&, T>::value,
|
|
271
|
+
"get_value_or: U must be convertible to T");
|
|
272
|
+
return static_cast<bool>(*this)
|
|
273
|
+
? **this
|
|
274
|
+
: static_cast<T>(std::forward<U>(default_value));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
template <typename U>
|
|
278
|
+
T value_or(U&& default_value) &&
|
|
279
|
+
{
|
|
280
|
+
static_assert(std::is_move_constructible<T>::value,
|
|
281
|
+
"get_value_or: T must be move constructible");
|
|
282
|
+
static_assert(std::is_convertible<U&&, T>::value,
|
|
283
|
+
"get_value_or: U must be convertible to T");
|
|
284
|
+
return static_cast<bool>(*this) ? std::move(**this)
|
|
285
|
+
: static_cast<T>(std::forward<U>(default_value));
|
|
286
|
+
}
|
|
287
|
+
#ifdef _MSC_VER
|
|
288
|
+
#pragma warning(pop)
|
|
289
|
+
#endif // _MSC_VER
|
|
290
|
+
|
|
291
|
+
const T* operator->() const
|
|
292
|
+
{
|
|
293
|
+
return std::addressof(this->value_);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
T* operator->()
|
|
297
|
+
{
|
|
298
|
+
return std::addressof(this->value_);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
constexpr const T& operator*() const&
|
|
302
|
+
{
|
|
303
|
+
return value();
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
T& operator*() &
|
|
307
|
+
{
|
|
308
|
+
return value();
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
void reset() noexcept
|
|
312
|
+
{
|
|
313
|
+
destroy();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
void swap(optional& other) noexcept(std::is_nothrow_move_constructible<T>::value /*&&
|
|
317
|
+
std::is_nothrow_swappable<T>::value*/)
|
|
318
|
+
{
|
|
319
|
+
const bool contains_a_value = has_value();
|
|
320
|
+
if (contains_a_value == other.has_value())
|
|
321
|
+
{
|
|
322
|
+
if (contains_a_value)
|
|
323
|
+
{
|
|
324
|
+
using std::swap;
|
|
325
|
+
swap(**this, *other);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else
|
|
329
|
+
{
|
|
330
|
+
optional& source = contains_a_value ? *this : other;
|
|
331
|
+
optional& target = contains_a_value ? other : *this;
|
|
332
|
+
target = optional<T>(*source);
|
|
333
|
+
source.reset();
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
private:
|
|
337
|
+
constexpr const T& get() const { return this->value_; }
|
|
338
|
+
T& get() { return this->value_; }
|
|
339
|
+
|
|
340
|
+
template <typename... Args>
|
|
341
|
+
void construct(Args&&... args)
|
|
342
|
+
{
|
|
343
|
+
::new (static_cast<void*>(&this->value_)) T(std::forward<Args>(args)...);
|
|
344
|
+
has_value_ = true;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
void destroy() noexcept
|
|
348
|
+
{
|
|
349
|
+
if (has_value_)
|
|
350
|
+
{
|
|
351
|
+
value_.~T();
|
|
352
|
+
has_value_ = false;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
template <typename U>
|
|
357
|
+
void assign(U&& u)
|
|
358
|
+
{
|
|
359
|
+
if (has_value_)
|
|
360
|
+
{
|
|
361
|
+
value_ = std::forward<U>(u);
|
|
362
|
+
}
|
|
363
|
+
else
|
|
364
|
+
{
|
|
365
|
+
construct(std::forward<U>(u));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
template <typename T>
|
|
371
|
+
typename std::enable_if<std::is_nothrow_move_constructible<T>::value,void>::type
|
|
372
|
+
swap(optional<T>& lhs, optional<T>& rhs) noexcept
|
|
373
|
+
{
|
|
374
|
+
lhs.swap(rhs);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
template <class T1, class T2>
|
|
378
|
+
constexpr bool operator==(const optional<T1>& lhs, const optional<T2>& rhs) noexcept
|
|
379
|
+
{
|
|
380
|
+
return lhs.has_value() == rhs.has_value() && (!lhs.has_value() || *lhs == *rhs);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
template <class T1, class T2>
|
|
384
|
+
constexpr bool operator!=(const optional<T1>& lhs, const optional<T2>& rhs) noexcept
|
|
385
|
+
{
|
|
386
|
+
return lhs.has_value() != rhs.has_value() || (lhs.has_value() && *lhs != *rhs);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
template <class T1, class T2>
|
|
390
|
+
constexpr bool operator<(const optional<T1>& lhs, const optional<T2>& rhs) noexcept
|
|
391
|
+
{
|
|
392
|
+
return rhs.has_value() && (!lhs.has_value() || *lhs < *rhs);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
template <class T1, class T2>
|
|
396
|
+
constexpr bool operator>(const optional<T1>& lhs, const optional<T2>& rhs) noexcept
|
|
397
|
+
{
|
|
398
|
+
return lhs.has_value() && (!rhs.has_value() || *lhs > *rhs);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
template <class T1, class T2>
|
|
402
|
+
constexpr bool operator<=(const optional<T1>& lhs, const optional<T2>& rhs) noexcept
|
|
403
|
+
{
|
|
404
|
+
return !lhs.has_value() || (rhs.has_value() && *lhs <= *rhs);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
template <class T1, class T2>
|
|
408
|
+
constexpr bool operator>=(const optional<T1>& lhs, const optional<T2>& rhs) noexcept
|
|
409
|
+
{
|
|
410
|
+
return !rhs.has_value() || (lhs.has_value() && *lhs >= *rhs);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
template <class T1, class T2>
|
|
414
|
+
constexpr bool operator==(const optional<T1>& lhs, const T2& rhs) noexcept
|
|
415
|
+
{
|
|
416
|
+
return lhs ? *lhs == rhs : false;
|
|
417
|
+
}
|
|
418
|
+
template <class T1, class T2>
|
|
419
|
+
constexpr bool operator==(const T1& lhs, const optional<T2>& rhs) noexcept
|
|
420
|
+
{
|
|
421
|
+
return rhs ? lhs == *rhs : false;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
template <class T1, class T2>
|
|
425
|
+
constexpr bool operator!=(const optional<T1>& lhs, const T2& rhs) noexcept
|
|
426
|
+
{
|
|
427
|
+
return lhs ? *lhs != rhs : true;
|
|
428
|
+
}
|
|
429
|
+
template <class T1, class T2>
|
|
430
|
+
constexpr bool operator!=(const T1& lhs, const optional<T2>& rhs) noexcept
|
|
431
|
+
{
|
|
432
|
+
return rhs ? lhs != *rhs : true;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
template <class T1, class T2>
|
|
436
|
+
constexpr bool operator<(const optional<T1>& lhs, const T2& rhs) noexcept
|
|
437
|
+
{
|
|
438
|
+
return lhs ? *lhs < rhs : true;
|
|
439
|
+
}
|
|
440
|
+
template <class T1, class T2>
|
|
441
|
+
constexpr bool operator<(const T1& lhs, const optional<T2>& rhs) noexcept
|
|
442
|
+
{
|
|
443
|
+
return rhs ? lhs < *rhs : false;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
template <class T1, class T2>
|
|
447
|
+
constexpr bool operator<=(const optional<T1>& lhs, const T2& rhs) noexcept
|
|
448
|
+
{
|
|
449
|
+
return lhs ? *lhs <= rhs : true;
|
|
450
|
+
}
|
|
451
|
+
template <class T1, class T2>
|
|
452
|
+
constexpr bool operator<=(const T1& lhs, const optional<T2>& rhs) noexcept
|
|
453
|
+
{
|
|
454
|
+
return rhs ? lhs <= *rhs : false;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
template <class T1, class T2>
|
|
458
|
+
constexpr bool operator>(const optional<T1>& lhs, const T2& rhs) noexcept
|
|
459
|
+
{
|
|
460
|
+
return lhs ? *lhs > rhs : false;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
template <class T1, class T2>
|
|
464
|
+
constexpr bool operator>(const T1& lhs, const optional<T2>& rhs) noexcept
|
|
465
|
+
{
|
|
466
|
+
return rhs ? lhs > *rhs : true;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
template <class T1, class T2>
|
|
470
|
+
constexpr bool operator>=(const optional<T1>& lhs, const T2& rhs) noexcept
|
|
471
|
+
{
|
|
472
|
+
return lhs ? *lhs >= rhs : false;
|
|
473
|
+
}
|
|
474
|
+
template <class T1, class T2>
|
|
475
|
+
constexpr bool operator>=(const T1& lhs, const optional<T2>& rhs) noexcept
|
|
476
|
+
{
|
|
477
|
+
return rhs ? lhs >= *rhs : true;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
} // namespace detail
|
|
481
|
+
} // namespace jsoncons
|
|
482
|
+
|
|
483
|
+
#endif
|