Skip to content

Commit 6b3e297

Browse files
committed
Revert "Fixed msgpack#1070."
This reverts commit 34f8fd6.
1 parent 8c602e8 commit 6b3e297

File tree

3 files changed

+38
-146
lines changed

3 files changed

+38
-146
lines changed

include/msgpack/v1/adaptor/boost/msgpack_variant.hpp

+31-29
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,6 @@ struct basic_variant :
122122
int_init(v);
123123
}
124124
basic_variant(unsigned long long v):base(uint64_t(v)) {}
125-
basic_variant(float v) {
126-
double_init(v);
127-
}
128-
basic_variant(double v) {
129-
double_init(v);
130-
}
131125

132126
bool is_nil() const {
133127
return boost::get<msgpack::type::nil_t>(this) != MSGPACK_NULLPTR;
@@ -183,50 +177,71 @@ struct basic_variant :
183177
int64_t as_int64_t() const {
184178
return boost::get<int64_t>(*this);
185179
}
180+
int64_t& as_int64_t() {
181+
return boost::get<int64_t>(*this);
182+
}
186183
uint64_t as_uint64_t() const {
187184
return boost::get<uint64_t>(*this);
188185
}
186+
uint64_t& as_uint64_t() {
187+
return boost::get<uint64_t>(*this);
188+
}
189189
double as_double() const {
190-
if (is_double()) {
191-
return boost::get<double>(*this);
192-
}
193-
if (is_int64_t()) {
194-
return static_cast<double>(boost::get<int64_t>(*this));
195-
}
196-
if (is_uint64_t()) {
197-
return static_cast<double>(boost::get<uint64_t>(*this));
198-
}
199-
throw msgpack::type_error();
190+
return boost::get<double>(*this);
191+
}
192+
double& as_double() {
193+
return boost::get<double>(*this);
200194
}
201195
std::string const& as_string() const {
202196
return boost::get<std::string>(*this);
203197
}
198+
std::string& as_string() {
199+
return boost::get<std::string>(*this);
200+
}
204201
#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
205202
boost::string_ref const& as_boost_string_ref() const {
206203
return boost::get<boost::string_ref>(*this);
207204
}
205+
boost::string_ref& as_boost_string_ref() {
206+
return boost::get<boost::string_ref>(*this);
207+
}
208208
#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
209209
std::vector<char> const& as_vector_char() const {
210210
return boost::get<std::vector<char> >(*this);
211211
}
212+
std::vector<char>& as_vector_char() {
213+
return boost::get<std::vector<char> >(*this);
214+
}
212215
raw_ref const& as_raw_ref() const {
213216
return boost::get<raw_ref>(*this);
214217
}
215218
ext const& as_ext() const {
216219
return boost::get<ext>(*this);
217220
}
221+
ext& as_ext() {
222+
return boost::get<ext>(*this);
223+
}
218224
ext_ref const& as_ext_ref() const {
219225
return boost::get<ext_ref>(*this);
220226
}
221227
std::vector<basic_variant<STR, BIN, EXT> > const& as_vector() const {
222228
return boost::get<std::vector<basic_variant<STR, BIN, EXT> > >(*this);
223229
}
230+
std::vector<basic_variant<STR, BIN, EXT> >& as_vector() {
231+
return boost::get<std::vector<basic_variant<STR, BIN, EXT> > >(*this);
232+
}
224233
std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > const& as_map() const {
225234
return boost::get<std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
226235
}
236+
std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> >& as_map() {
237+
return boost::get<std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
238+
}
227239
std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > const& as_multimap() const {
228240
return boost::get<std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
229241
}
242+
std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> >& as_multimap() {
243+
return boost::get<std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
244+
}
230245
private:
231246
template <typename T>
232247
void int_init(T v) {
@@ -237,19 +252,6 @@ struct basic_variant :
237252
static_cast<base&>(*this) = uint64_t(v);
238253
}
239254
}
240-
void double_init(double v) {
241-
if (v == v) { // check for nan
242-
if (v >= 0 && v <= double(std::numeric_limits<uint64_t>::max()) && v == double(uint64_t(v))) {
243-
static_cast<base&>(*this) = uint64_t(v);
244-
return;
245-
}
246-
else if (v < 0 && v >= double(std::numeric_limits<int64_t>::min()) && v == double(int64_t(v))) {
247-
static_cast<base&>(*this) = int64_t(v);
248-
return;
249-
}
250-
}
251-
static_cast<base&>(*this) = v;
252-
}
253255
};
254256

255257
template <typename STR, typename BIN, typename EXT>

include/msgpack/v1/pack.hpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -1138,11 +1138,11 @@ inline packer<Stream>& packer<Stream>::pack_unsigned_long_long(unsigned long lon
11381138
template <typename Stream>
11391139
inline packer<Stream>& packer<Stream>::pack_float(float d)
11401140
{
1141-
if(d == d) { // check for nan
1141+
if(d == d) { // check for nan
11421142
// compare d to limits to avoid undefined behaviour
11431143
if(d >= 0 && d <= float(std::numeric_limits<uint64_t>::max()) && d == float(uint64_t(d))) {
11441144
pack_imp_uint64(uint64_t(d));
1145-
return *this;
1145+
return *this;
11461146
} else if(d < 0 && d >= float(std::numeric_limits<int64_t>::min()) && d == float(int64_t(d))) {
11471147
pack_imp_int64(int64_t(d));
11481148
return *this;
@@ -1160,11 +1160,11 @@ inline packer<Stream>& packer<Stream>::pack_float(float d)
11601160
template <typename Stream>
11611161
inline packer<Stream>& packer<Stream>::pack_double(double d)
11621162
{
1163-
if(d == d) { // check for nan
1163+
if(d == d) { // check for nan
11641164
// compare d to limits to avoid undefined behaviour
11651165
if(d >= 0 && d <= double(std::numeric_limits<uint64_t>::max()) && d == double(uint64_t(d))) {
11661166
pack_imp_uint64(uint64_t(d));
1167-
return *this;
1167+
return *this;
11681168
} else if(d < 0 && d >= double(std::numeric_limits<int64_t>::min()) && d == double(int64_t(d))) {
11691169
pack_imp_int64(int64_t(d));
11701170
return *this;

test/boost_variant.cpp

+3-113
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_float)
264264
BOOST_CHECK(val2.is_double());
265265
BOOST_CHECK(fabs(12.34 - val2.as_double()) <= kEPS);
266266
BOOST_CHECK_NO_THROW(boost::get<double>(val2));
267-
BOOST_CHECK(fabs(val1.as_double() - val2.as_double()) <= kEPS);
267+
BOOST_CHECK(fabs(val2.as_double() - val2.as_double()) <= kEPS);
268268
}
269269

270270
BOOST_AUTO_TEST_CASE(object_variant_float)
@@ -277,8 +277,7 @@ BOOST_AUTO_TEST_CASE(object_variant_float)
277277
BOOST_CHECK(val2.is_double());
278278
BOOST_CHECK(fabs(12.34 - val2.as_double()) <= kEPS);
279279
BOOST_CHECK_NO_THROW(boost::get<double>(val2));
280-
BOOST_CHECK(fabs(val1.as_double() - val2.as_double()) <= kEPS);
281-
BOOST_CHECK(val1 == val2);
280+
BOOST_CHECK(fabs(val2.as_double() - val2.as_double()) <= kEPS);
282281
}
283282

284283
BOOST_AUTO_TEST_CASE(object_with_zone_variant_float)
@@ -292,116 +291,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_float)
292291
BOOST_CHECK(val2.is_double());
293292
BOOST_CHECK(fabs(12.34 - val2.as_double()) <= kEPS);
294293
BOOST_CHECK_NO_THROW(boost::get<double>(val2));
295-
BOOST_CHECK(fabs(val1.as_double() - val2.as_double()) <= kEPS);
296-
BOOST_CHECK(val1 == val2);
297-
}
298-
299-
BOOST_AUTO_TEST_CASE(pack_convert_variant_float_zero_atdp_positive)
300-
{
301-
std::stringstream ss;
302-
msgpack::type::variant val1 = 12.0;
303-
BOOST_CHECK(val1.is_uint64_t());
304-
BOOST_CHECK_EQUAL(val1.as_uint64_t(), 12);
305-
BOOST_CHECK(fabs(12.0 - val1.as_double()) <= kEPS);
306-
307-
msgpack::pack(ss, val1);
308-
309-
std::string const& str = ss.str();
310-
msgpack::object_handle oh =
311-
msgpack::unpack(str.data(), str.size());
312-
msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
313-
BOOST_CHECK(val2.is_uint64_t());
314-
BOOST_CHECK_EQUAL(val2.as_uint64_t(), 12);
315-
BOOST_CHECK_NO_THROW(boost::get<uint64_t>(val2));
316-
BOOST_CHECK(fabs(12.0 - val2.as_double()) <= kEPS);
317-
BOOST_CHECK_EQUAL(val1.as_uint64_t(), val2.as_uint64_t());
318-
}
319-
320-
BOOST_AUTO_TEST_CASE(object_variant_float_zero_atdp_positive)
321-
{
322-
msgpack::type::variant val1 = 12.0;
323-
BOOST_CHECK(val1.is_uint64_t());
324-
BOOST_CHECK_EQUAL(val1.as_uint64_t(), 12);
325-
BOOST_CHECK(fabs(12.0 - val1.as_double()) <= kEPS);
326-
msgpack::object obj(val1);
327-
msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
328-
BOOST_CHECK(val2.is_uint64_t());
329-
BOOST_CHECK_EQUAL(val2.as_uint64_t(), 12);
330-
BOOST_CHECK_NO_THROW(boost::get<uint64_t>(val2));
331-
BOOST_CHECK(fabs(12.0 - val2.as_double()) <= kEPS);
332-
BOOST_CHECK_EQUAL(val1.as_uint64_t(), val2.as_uint64_t());
333-
BOOST_CHECK(val1 == val2);
334-
}
335-
336-
BOOST_AUTO_TEST_CASE(object_with_zone_variant_float_zero_atdp_positive)
337-
{
338-
msgpack::zone z;
339-
msgpack::type::variant val1 = 12.0;
340-
BOOST_CHECK(val1.is_uint64_t());
341-
BOOST_CHECK_EQUAL(val1.as_uint64_t(), 12);
342-
BOOST_CHECK(fabs(12.0 - val1.as_double()) <= kEPS);
343-
msgpack::object obj(val1, z);
344-
msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
345-
BOOST_CHECK(val2.is_uint64_t());
346-
BOOST_CHECK_EQUAL(val2.as_uint64_t(), 12);
347-
BOOST_CHECK_NO_THROW(boost::get<uint64_t>(val2));
348-
BOOST_CHECK_EQUAL(val1.as_uint64_t(), val2.as_uint64_t());
349-
BOOST_CHECK(fabs(12.0 - val2.as_double()) <= kEPS);
350-
BOOST_CHECK(val1 == val2);
351-
}
352-
353-
BOOST_AUTO_TEST_CASE(pack_convert_variant_float_zero_atdp_negative)
354-
{
355-
std::stringstream ss;
356-
msgpack::type::variant val1 = -12.0;
357-
BOOST_CHECK(val1.is_int64_t());
358-
BOOST_CHECK_EQUAL(val1.as_int64_t(), -12);
359-
BOOST_CHECK(fabs(-12.0 - val1.as_double()) <= kEPS);
360-
361-
msgpack::pack(ss, val1);
362-
363-
std::string const& str = ss.str();
364-
msgpack::object_handle oh =
365-
msgpack::unpack(str.data(), str.size());
366-
msgpack::type::variant val2 = oh.get().as<msgpack::type::variant>();
367-
BOOST_CHECK(val2.is_int64_t());
368-
BOOST_CHECK_EQUAL(val2.as_int64_t(), -12);
369-
BOOST_CHECK_NO_THROW(boost::get<int64_t>(val2));
370-
BOOST_CHECK(fabs(-12.0 - val2.as_double()) <= kEPS);
371-
BOOST_CHECK_EQUAL(val1.as_int64_t(), val2.as_int64_t());
372-
}
373-
374-
BOOST_AUTO_TEST_CASE(object_variant_float_zero_atdp_negative)
375-
{
376-
msgpack::type::variant val1 = -12.0;
377-
BOOST_CHECK(val1.is_int64_t());
378-
BOOST_CHECK_EQUAL(val1.as_int64_t(), -12);
379-
BOOST_CHECK(fabs(-12.0 - val1.as_double()) <= kEPS);
380-
msgpack::object obj(val1);
381-
msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
382-
BOOST_CHECK(val2.is_int64_t());
383-
BOOST_CHECK_EQUAL(val2.as_int64_t(), -12);
384-
BOOST_CHECK_NO_THROW(boost::get<int64_t>(val2));
385-
BOOST_CHECK(fabs(-12.0 - val2.as_double()) <= kEPS);
386-
BOOST_CHECK_EQUAL(val1.as_int64_t(), val2.as_int64_t());
387-
BOOST_CHECK(val1 == val2);
388-
}
389-
390-
BOOST_AUTO_TEST_CASE(object_with_zone_variant_float_zero_atdp_negative)
391-
{
392-
msgpack::zone z;
393-
msgpack::type::variant val1 = -12.0;
394-
BOOST_CHECK(val1.is_int64_t());
395-
BOOST_CHECK_EQUAL(val1.as_int64_t(), -12);
396-
BOOST_CHECK(fabs(-12.0 - val1.as_double()) <= kEPS);
397-
msgpack::object obj(val1, z);
398-
msgpack::type::variant val2 = obj.as<msgpack::type::variant>();
399-
BOOST_CHECK(val2.is_int64_t());
400-
BOOST_CHECK_EQUAL(val2.as_int64_t(), -12);
401-
BOOST_CHECK_NO_THROW(boost::get<int64_t>(val2));
402-
BOOST_CHECK(fabs(-12.0 - val2.as_double()) <= kEPS);
403-
BOOST_CHECK_EQUAL(val1.as_int64_t(), val2.as_int64_t());
404-
BOOST_CHECK(val1 == val2);
294+
BOOST_CHECK(fabs(val2.as_double() - val2.as_double()) <= kEPS);
405295
}
406296

407297
// str

0 commit comments

Comments
 (0)