Skip to content

Commit 260ce4a

Browse files
committed
Added object that has integer to float and double converter.
1 parent 8bc827e commit 260ce4a

File tree

2 files changed

+128
-4
lines changed

2 files changed

+128
-4
lines changed

src/msgpack/type/float.hpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,18 @@ namespace msgpack {
2929

3030
inline float& operator>> (object o, float& v)
3131
{
32-
if(o.type != type::DOUBLE) { throw type_error(); }
33-
v = (float)o.via.dec;
32+
if(o.type == type::DOUBLE) {
33+
v = (float)o.via.dec;
34+
}
35+
else if (o.type == type::POSITIVE_INTEGER) {
36+
v = (float)o.via.u64;
37+
}
38+
else if (o.type == type::NEGATIVE_INTEGER) {
39+
v = (float)o.via.i64;
40+
}
41+
else {
42+
throw type_error();
43+
}
3444
return v;
3545
}
3646

@@ -44,8 +54,18 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const float& v)
4454

4555
inline double& operator>> (object o, double& v)
4656
{
47-
if(o.type != type::DOUBLE) { throw type_error(); }
48-
v = o.via.dec;
57+
if(o.type == type::DOUBLE) {
58+
v = o.via.dec;
59+
}
60+
else if (o.type == type::POSITIVE_INTEGER) {
61+
v = (double)o.via.u64;
62+
}
63+
else if (o.type == type::NEGATIVE_INTEGER) {
64+
v = (double)o.via.i64;
65+
}
66+
else {
67+
throw type_error();
68+
}
4969
return v;
5070
}
5171

test/msgpack_test.cpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,110 @@ TEST(MSGPACK, simple_buffer_float)
178178
}
179179
}
180180

181+
TEST(MSGPACK, simple_buffer_float_from_signed_long_long)
182+
{
183+
vector<signed long long> v;
184+
v.push_back(0);
185+
v.push_back(1);
186+
v.push_back(-1);
187+
v.push_back(numeric_limits<signed long long>::min());
188+
v.push_back(numeric_limits<signed long long>::max());
189+
for (unsigned int i = 0; i < kLoop; i++) {
190+
v.push_back(rand());
191+
}
192+
for (unsigned int i = 0; i < v.size() ; i++) {
193+
msgpack::sbuffer sbuf;
194+
signed long long val1 = v[i];
195+
msgpack::pack(sbuf, val1);
196+
msgpack::zone z;
197+
msgpack::object obj;
198+
msgpack::unpack_return ret =
199+
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
200+
EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
201+
float val2;
202+
obj.convert(&val2);
203+
EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
204+
}
205+
}
206+
207+
TEST(MSGPACK, simple_buffer_float_from_unsigned_long_long)
208+
{
209+
vector<unsigned long long> v;
210+
v.push_back(0);
211+
v.push_back(1);
212+
v.push_back(2);
213+
v.push_back(numeric_limits<unsigned long long>::min());
214+
v.push_back(numeric_limits<unsigned long long>::max());
215+
for (unsigned int i = 0; i < kLoop; i++) {
216+
v.push_back(rand());
217+
}
218+
for (unsigned int i = 0; i < v.size() ; i++) {
219+
msgpack::sbuffer sbuf;
220+
unsigned long long val1 = v[i];
221+
msgpack::pack(sbuf, val1);
222+
msgpack::zone z;
223+
msgpack::object obj;
224+
msgpack::unpack_return ret =
225+
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
226+
EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
227+
float val2;
228+
obj.convert(&val2);
229+
EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
230+
}
231+
}
232+
233+
TEST(MSGPACK, simple_buffer_double_from_signed_long_long)
234+
{
235+
vector<signed long long> v;
236+
v.push_back(0);
237+
v.push_back(1);
238+
v.push_back(-1);
239+
v.push_back(numeric_limits<signed long long>::min());
240+
v.push_back(numeric_limits<signed long long>::max());
241+
for (unsigned int i = 0; i < kLoop; i++) {
242+
v.push_back(rand());
243+
}
244+
for (unsigned int i = 0; i < v.size() ; i++) {
245+
msgpack::sbuffer sbuf;
246+
signed long long val1 = v[i];
247+
msgpack::pack(sbuf, val1);
248+
msgpack::zone z;
249+
msgpack::object obj;
250+
msgpack::unpack_return ret =
251+
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
252+
EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
253+
double val2;
254+
obj.convert(&val2);
255+
EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
256+
}
257+
}
258+
259+
TEST(MSGPACK, simple_buffer_double_from_unsigned_long_long)
260+
{
261+
vector<unsigned long long> v;
262+
v.push_back(0);
263+
v.push_back(1);
264+
v.push_back(2);
265+
v.push_back(numeric_limits<unsigned long long>::min());
266+
v.push_back(numeric_limits<unsigned long long>::max());
267+
for (unsigned int i = 0; i < kLoop; i++) {
268+
v.push_back(rand());
269+
}
270+
for (unsigned int i = 0; i < v.size() ; i++) {
271+
msgpack::sbuffer sbuf;
272+
unsigned long long val1 = v[i];
273+
msgpack::pack(sbuf, val1);
274+
msgpack::zone z;
275+
msgpack::object obj;
276+
msgpack::unpack_return ret =
277+
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);
278+
EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
279+
double val2;
280+
obj.convert(&val2);
281+
EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
282+
}
283+
}
284+
181285
TEST(MSGPACK, simple_buffer_double)
182286
{
183287
vector<double> v;

0 commit comments

Comments
 (0)