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.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/ext/jsoncons/extconf.rb +43 -0
  3. data/ext/jsoncons/jsoncons.cpp +161 -0
  4. data/ext/jsoncons/jsoncons.h +10 -0
  5. data/jsoncons.gemspec +44 -0
  6. data/lib/jsoncons/jsoncons/examples/input/address-book.json +13 -0
  7. data/lib/jsoncons/jsoncons/examples/input/books.json +28 -0
  8. data/lib/jsoncons/jsoncons/examples/input/countries.json +7 -0
  9. data/lib/jsoncons/jsoncons/examples/input/employees.json +30 -0
  10. data/lib/jsoncons/jsoncons/examples/input/jsonschema/name.json +15 -0
  11. data/lib/jsoncons/jsoncons/examples/input/multiple-json-objects.json +3 -0
  12. data/lib/jsoncons/jsoncons/examples/input/sales.csv +6 -0
  13. data/lib/jsoncons/jsoncons/examples/input/store.json +28 -0
  14. data/lib/jsoncons/jsoncons/examples/input/tasks.csv +6 -0
  15. data/lib/jsoncons/jsoncons/include/jsoncons/allocator_holder.hpp +38 -0
  16. data/lib/jsoncons/jsoncons/include/jsoncons/basic_json.hpp +5905 -0
  17. data/lib/jsoncons/jsoncons/include/jsoncons/bigint.hpp +1611 -0
  18. data/lib/jsoncons/jsoncons/include/jsoncons/byte_string.hpp +820 -0
  19. data/lib/jsoncons/jsoncons/include/jsoncons/config/binary_config.hpp +226 -0
  20. data/lib/jsoncons/jsoncons/include/jsoncons/config/compiler_support.hpp +375 -0
  21. data/lib/jsoncons/jsoncons/include/jsoncons/config/jsoncons_config.hpp +309 -0
  22. data/lib/jsoncons/jsoncons/include/jsoncons/config/version.hpp +40 -0
  23. data/lib/jsoncons/jsoncons/include/jsoncons/conv_error.hpp +218 -0
  24. data/lib/jsoncons/jsoncons/include/jsoncons/decode_json.hpp +209 -0
  25. data/lib/jsoncons/jsoncons/include/jsoncons/decode_traits.hpp +651 -0
  26. data/lib/jsoncons/jsoncons/include/jsoncons/detail/endian.hpp +44 -0
  27. data/lib/jsoncons/jsoncons/include/jsoncons/detail/grisu3.hpp +312 -0
  28. data/lib/jsoncons/jsoncons/include/jsoncons/detail/optional.hpp +483 -0
  29. data/lib/jsoncons/jsoncons/include/jsoncons/detail/parse_number.hpp +1133 -0
  30. data/lib/jsoncons/jsoncons/include/jsoncons/detail/span.hpp +188 -0
  31. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_view.hpp +537 -0
  32. data/lib/jsoncons/jsoncons/include/jsoncons/detail/string_wrapper.hpp +370 -0
  33. data/lib/jsoncons/jsoncons/include/jsoncons/detail/write_number.hpp +567 -0
  34. data/lib/jsoncons/jsoncons/include/jsoncons/encode_json.hpp +315 -0
  35. data/lib/jsoncons/jsoncons/include/jsoncons/encode_traits.hpp +378 -0
  36. data/lib/jsoncons/jsoncons/include/jsoncons/json.hpp +18 -0
  37. data/lib/jsoncons/jsoncons/include/jsoncons/json_array.hpp +324 -0
  38. data/lib/jsoncons/jsoncons/include/jsoncons/json_content_handler.hpp +12 -0
  39. data/lib/jsoncons/jsoncons/include/jsoncons/json_cursor.hpp +448 -0
  40. data/lib/jsoncons/jsoncons/include/jsoncons/json_decoder.hpp +420 -0
  41. data/lib/jsoncons/jsoncons/include/jsoncons/json_encoder.hpp +1587 -0
  42. data/lib/jsoncons/jsoncons/include/jsoncons/json_error.hpp +156 -0
  43. data/lib/jsoncons/jsoncons/include/jsoncons/json_exception.hpp +241 -0
  44. data/lib/jsoncons/jsoncons/include/jsoncons/json_filter.hpp +653 -0
  45. data/lib/jsoncons/jsoncons/include/jsoncons/json_fwd.hpp +23 -0
  46. data/lib/jsoncons/jsoncons/include/jsoncons/json_object.hpp +1772 -0
  47. data/lib/jsoncons/jsoncons/include/jsoncons/json_options.hpp +862 -0
  48. data/lib/jsoncons/jsoncons/include/jsoncons/json_parser.hpp +2900 -0
  49. data/lib/jsoncons/jsoncons/include/jsoncons/json_reader.hpp +731 -0
  50. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros.hpp +1072 -0
  51. data/lib/jsoncons/jsoncons/include/jsoncons/json_traits_macros_deprecated.hpp +144 -0
  52. data/lib/jsoncons/jsoncons/include/jsoncons/json_type.hpp +206 -0
  53. data/lib/jsoncons/jsoncons/include/jsoncons/json_type_traits.hpp +1830 -0
  54. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor.hpp +1560 -0
  55. data/lib/jsoncons/jsoncons/include/jsoncons/json_visitor2.hpp +2079 -0
  56. data/lib/jsoncons/jsoncons/include/jsoncons/pretty_print.hpp +89 -0
  57. data/lib/jsoncons/jsoncons/include/jsoncons/ser_context.hpp +62 -0
  58. data/lib/jsoncons/jsoncons/include/jsoncons/sink.hpp +289 -0
  59. data/lib/jsoncons/jsoncons/include/jsoncons/source.hpp +777 -0
  60. data/lib/jsoncons/jsoncons/include/jsoncons/source_adaptor.hpp +148 -0
  61. data/lib/jsoncons/jsoncons/include/jsoncons/staj2_cursor.hpp +1189 -0
  62. data/lib/jsoncons/jsoncons/include/jsoncons/staj_cursor.hpp +1254 -0
  63. data/lib/jsoncons/jsoncons/include/jsoncons/staj_iterator.hpp +449 -0
  64. data/lib/jsoncons/jsoncons/include/jsoncons/tag_type.hpp +245 -0
  65. data/lib/jsoncons/jsoncons/include/jsoncons/text_source_adaptor.hpp +144 -0
  66. data/lib/jsoncons/jsoncons/include/jsoncons/traits_extension.hpp +884 -0
  67. data/lib/jsoncons/jsoncons/include/jsoncons/typed_array_view.hpp +250 -0
  68. data/lib/jsoncons/jsoncons/include/jsoncons/unicode_traits.hpp +1330 -0
  69. data/lib/jsoncons/jsoncons/include/jsoncons/uri.hpp +635 -0
  70. data/lib/jsoncons/jsoncons/include/jsoncons/value_converter.hpp +340 -0
  71. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson.hpp +23 -0
  72. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_cursor.hpp +320 -0
  73. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_decimal128.hpp +865 -0
  74. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_encoder.hpp +585 -0
  75. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_error.hpp +103 -0
  76. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_oid.hpp +245 -0
  77. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_options.hpp +75 -0
  78. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_parser.hpp +645 -0
  79. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_reader.hpp +92 -0
  80. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/bson_type.hpp +44 -0
  81. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/decode_bson.hpp +201 -0
  82. data/lib/jsoncons/jsoncons/include/jsoncons_ext/bson/encode_bson.hpp +144 -0
  83. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor.hpp +26 -0
  84. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor.hpp +351 -0
  85. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_cursor2.hpp +265 -0
  86. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_detail.hpp +93 -0
  87. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_encoder.hpp +1766 -0
  88. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_error.hpp +105 -0
  89. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_options.hpp +113 -0
  90. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_parser.hpp +1942 -0
  91. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/cbor_reader.hpp +116 -0
  92. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/decode_cbor.hpp +203 -0
  93. data/lib/jsoncons/jsoncons/include/jsoncons_ext/cbor/encode_cbor.hpp +151 -0
  94. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv.hpp +17 -0
  95. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_cursor.hpp +358 -0
  96. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_encoder.hpp +954 -0
  97. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_error.hpp +85 -0
  98. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_options.hpp +973 -0
  99. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_parser.hpp +2099 -0
  100. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_reader.hpp +348 -0
  101. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/csv_serializer.hpp +12 -0
  102. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/decode_csv.hpp +208 -0
  103. data/lib/jsoncons/jsoncons/include/jsoncons_ext/csv/encode_csv.hpp +122 -0
  104. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath.hpp +5215 -0
  105. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jmespath/jmespath_error.hpp +215 -0
  106. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch.hpp +579 -0
  107. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpatch/jsonpatch_error.hpp +121 -0
  108. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/expression.hpp +3329 -0
  109. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/flatten.hpp +432 -0
  110. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_location.hpp +445 -0
  111. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/json_query.hpp +115 -0
  112. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath.hpp +13 -0
  113. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_error.hpp +240 -0
  114. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_expression.hpp +2612 -0
  115. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpath/jsonpath_selector.hpp +1322 -0
  116. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer.hpp +1577 -0
  117. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonpointer/jsonpointer_error.hpp +119 -0
  118. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/format_validator.hpp +968 -0
  119. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/json_validator.hpp +120 -0
  120. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema.hpp +13 -0
  121. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_error.hpp +105 -0
  122. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/jsonschema_version.hpp +18 -0
  123. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator.hpp +1745 -0
  124. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/keyword_validator_factory.hpp +556 -0
  125. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_draft7.hpp +198 -0
  126. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_location.hpp +200 -0
  127. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/schema_version.hpp +35 -0
  128. data/lib/jsoncons/jsoncons/include/jsoncons_ext/jsonschema/subschema.hpp +144 -0
  129. data/lib/jsoncons/jsoncons/include/jsoncons_ext/mergepatch/mergepatch.hpp +103 -0
  130. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/decode_msgpack.hpp +202 -0
  131. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/encode_msgpack.hpp +142 -0
  132. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack.hpp +24 -0
  133. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor.hpp +343 -0
  134. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_cursor2.hpp +259 -0
  135. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_encoder.hpp +753 -0
  136. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_error.hpp +94 -0
  137. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_options.hpp +74 -0
  138. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_parser.hpp +748 -0
  139. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_reader.hpp +116 -0
  140. data/lib/jsoncons/jsoncons/include/jsoncons_ext/msgpack/msgpack_type.hpp +63 -0
  141. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/decode_ubjson.hpp +201 -0
  142. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/encode_ubjson.hpp +142 -0
  143. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson.hpp +23 -0
  144. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_cursor.hpp +307 -0
  145. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_encoder.hpp +502 -0
  146. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_error.hpp +100 -0
  147. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_options.hpp +87 -0
  148. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_parser.hpp +880 -0
  149. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_reader.hpp +92 -0
  150. data/lib/jsoncons/jsoncons/include/jsoncons_ext/ubjson/ubjson_type.hpp +43 -0
  151. data/lib/jsoncons/version.rb +5 -0
  152. data/lib/jsoncons.rb +33 -0
  153. data/test/jsoncons_test.rb +108 -0
  154. data/test/test_helper.rb +7 -0
  155. 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