Skip to content

Commit 6f24d24

Browse files
committed
Supported all msgpack object types.
Fixed cmake warning.
1 parent 985184b commit 6f24d24

File tree

4 files changed

+167
-43
lines changed

4 files changed

+167
-43
lines changed

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ else()
88
ENDIF ()
99
endif()
1010

11+
IF ((CMAKE_VERSION VERSION_GREATER 3.27) OR
12+
(CMAKE_VERSION VERSION_EQUAL 3.27))
13+
CMAKE_POLICY(SET CMP0145 OLD)
14+
ENDIF ()
15+
1116
OPTION (MSGPACK_BUILD_TESTS "Build msgpack tests." OFF)
1217
OPTION (MSGPACK_GEN_COVERAGE "Enable running gcov to get a test coverage report." OFF)
1318

include/msgpack/object.h

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,37 @@ typedef struct msgpack_object_kv {
9898
} msgpack_object_kv;
9999

100100
MSGPACK_DLLEXPORT
101-
bool msgpack_object_init(msgpack_object* d, int type, void* data, size_t size);
101+
void msgpack_object_init_nil(msgpack_object* d);
102+
103+
MSGPACK_DLLEXPORT
104+
void msgpack_object_init_boolean(msgpack_object* d, bool v);
105+
106+
MSGPACK_DLLEXPORT
107+
void msgpack_object_init_unsigned_integer(msgpack_object* d, uint64_t v);
108+
109+
MSGPACK_DLLEXPORT
110+
void msgpack_object_init_signed_integer(msgpack_object* d, int64_t v);
111+
112+
MSGPACK_DLLEXPORT
113+
void msgpack_object_init_float32(msgpack_object* d, float v);
114+
115+
MSGPACK_DLLEXPORT
116+
void msgpack_object_init_float64(msgpack_object* d, double v);
117+
118+
MSGPACK_DLLEXPORT
119+
void msgpack_object_init_str(msgpack_object* d, const char* data, uint32_t size);
120+
121+
MSGPACK_DLLEXPORT
122+
void msgpack_object_init_bin(msgpack_object* d, const char* data, uint32_t size);
123+
124+
MSGPACK_DLLEXPORT
125+
void msgpack_object_init_ext(msgpack_object* d, int8_t type, const char* data, uint32_t size);
126+
127+
MSGPACK_DLLEXPORT
128+
void msgpack_object_init_array(msgpack_object* d, msgpack_object* data, uint32_t size);
129+
130+
MSGPACK_DLLEXPORT
131+
void msgpack_object_init_map(msgpack_object* d, msgpack_object_kv* data, uint32_t size);
102132

103133
#if !defined(_KERNEL_MODE)
104134
MSGPACK_DLLEXPORT

src/objectc.c

Lines changed: 63 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -125,41 +125,70 @@ int msgpack_pack_object(msgpack_packer* pk, msgpack_object d)
125125
}
126126
}
127127

128-
bool msgpack_object_init(msgpack_object* d, int type, void* data, size_t size)
129-
{
130-
switch (type) {
131-
case MSGPACK_OBJECT_STR:
132-
{
133-
d->via.str.ptr = (char *)data;
134-
d->via.str.size = size;
135-
break;
136-
}
137-
case MSGPACK_OBJECT_BIN:
138-
{
139-
d->via.bin.ptr = (char *)data;
140-
d->via.bin.size = size;
141-
break;
142-
}
143-
case MSGPACK_OBJECT_ARRAY:
144-
{
145-
d->via.array.ptr = (msgpack_object *)data;
146-
d->via.array.size = size;
147-
break;
148-
}
149-
case MSGPACK_OBJECT_MAP:
150-
{
151-
d->via.map.ptr = (msgpack_object_kv *)data;
152-
d->via.map.size = size;
153-
break;
154-
}
155-
default:
156-
{
157-
// Other types are not supported and need to be initialized manually.
158-
return false;
159-
}
128+
void msgpack_object_init_nil(msgpack_object* d) {
129+
d->type = MSGPACK_OBJECT_NIL;
130+
}
131+
132+
void msgpack_object_init_boolean(msgpack_object* d, bool v) {
133+
d->type = MSGPACK_OBJECT_BOOLEAN;
134+
d->via.boolean = v;
135+
}
136+
137+
void msgpack_object_init_unsigned_integer(msgpack_object* d, uint64_t v) {
138+
d->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
139+
d->via.u64 = v;
140+
}
141+
142+
void msgpack_object_init_signed_integer(msgpack_object* d, int64_t v) {
143+
if (v < 0) {
144+
d->type = MSGPACK_OBJECT_NEGATIVE_INTEGER;
145+
d->via.i64 = v;
146+
}
147+
else {
148+
d->type = MSGPACK_OBJECT_POSITIVE_INTEGER;
149+
d->via.u64 = v;
160150
}
161-
d->type = type;
162-
return true;
151+
}
152+
153+
void msgpack_object_init_float32(msgpack_object* d, float v) {
154+
d->type = MSGPACK_OBJECT_FLOAT32;
155+
d->via.f64 = v;
156+
}
157+
158+
void msgpack_object_init_float64(msgpack_object* d, double v) {
159+
d->type = MSGPACK_OBJECT_FLOAT64;
160+
d->via.f64 = v;
161+
}
162+
163+
void msgpack_object_init_str(msgpack_object* d, const char* data, uint32_t size) {
164+
d->type = MSGPACK_OBJECT_STR;
165+
d->via.str.ptr = data;
166+
d->via.str.size = size;
167+
}
168+
169+
void msgpack_object_init_bin(msgpack_object* d, const char* data, uint32_t size) {
170+
d->type = MSGPACK_OBJECT_BIN;
171+
d->via.bin.ptr = data;
172+
d->via.bin.size = size;
173+
}
174+
175+
void msgpack_object_init_ext(msgpack_object* d, int8_t type, const char* data, uint32_t size) {
176+
d->type = MSGPACK_OBJECT_EXT;
177+
d->via.ext.type = type;
178+
d->via.ext.ptr = data;
179+
d->via.ext.size = size;
180+
}
181+
182+
void msgpack_object_init_array(msgpack_object* d, msgpack_object* data, uint32_t size) {
183+
d->type = MSGPACK_OBJECT_ARRAY;
184+
d->via.array.ptr = data;
185+
d->via.array.size = size;
186+
}
187+
188+
void msgpack_object_init_map(msgpack_object* d, msgpack_object_kv* data, uint32_t size) {
189+
d->type = MSGPACK_OBJECT_MAP;
190+
d->via.map.ptr = data;
191+
d->via.map.size = size;
163192
}
164193

165194
#if !defined(_KERNEL_MODE)

test/msgpack_c.cpp

Lines changed: 68 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,31 +1612,91 @@ TEST(MSGPACKC, object_bin_print_buffer_overflow) {
16121612
EXPECT_STREQ("\"test\"", buffer);
16131613
}
16141614

1615+
TEST(MSGPACKC, init_msgpack_obj_nil) {
1616+
msgpack_object obj;
1617+
msgpack_object_init_nil(&obj);
1618+
EXPECT_EQ(MSGPACK_OBJECT_NIL, obj.type);
1619+
}
1620+
1621+
TEST(MSGPACKC, init_msgpack_obj_boolean) {
1622+
msgpack_object obj;
1623+
msgpack_object_init_boolean(&obj, true);
1624+
EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type);
1625+
EXPECT_EQ(true, obj.via.boolean);
1626+
}
1627+
1628+
TEST(MSGPACKC, init_msgpack_obj_unsigned_integer) {
1629+
msgpack_object obj;
1630+
msgpack_object_init_unsigned_integer(&obj, 123);
1631+
EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type);
1632+
EXPECT_EQ(static_cast<uint64_t>(123), obj.via.u64);
1633+
}
1634+
1635+
TEST(MSGPACKC, init_msgpack_obj_signed_integer1) {
1636+
msgpack_object obj;
1637+
msgpack_object_init_signed_integer(&obj, -123);
1638+
EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, obj.type);
1639+
EXPECT_EQ(-123, obj.via.i64);
1640+
}
1641+
1642+
TEST(MSGPACKC, init_msgpack_obj_signed_integer2) {
1643+
msgpack_object obj;
1644+
msgpack_object_init_signed_integer(&obj, 123);
1645+
EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type);
1646+
EXPECT_EQ(static_cast<uint64_t>(123), obj.via.u64);
1647+
}
1648+
1649+
TEST(MSGPACKC, init_msgpack_obj_float32) {
1650+
msgpack_object obj;
1651+
float val = 1.23f;
1652+
msgpack_object_init_float32(&obj, val);
1653+
EXPECT_EQ(MSGPACK_OBJECT_FLOAT32, obj.type);
1654+
EXPECT_TRUE(fabs(obj.via.f64 - val) <= kEPS);
1655+
}
1656+
1657+
TEST(MSGPACKC, init_msgpack_obj_float64) {
1658+
msgpack_object obj;
1659+
double val = 1.23;
1660+
msgpack_object_init_float64(&obj, val);
1661+
EXPECT_EQ(MSGPACK_OBJECT_FLOAT64, obj.type);
1662+
EXPECT_TRUE(fabs(obj.via.f64 - val) <= kEPS);
1663+
}
1664+
1665+
16151666
TEST(MSGPACKC, init_msgpack_obj_string) {
16161667
msgpack_object obj;
16171668
char buffer[] = "test";
1618-
msgpack_object_init(&obj, MSGPACK_OBJECT_STR, (void *)buffer, strlen(buffer));
1669+
msgpack_object_init_str(&obj, buffer, (uint32_t)strlen(buffer));
16191670
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
16201671
EXPECT_STREQ(buffer, obj.via.str.ptr);
16211672
}
16221673

16231674
TEST(MSGPACKC, init_msgpack_obj_bin) {
16241675
msgpack_object obj;
16251676
char buffer[] = "test";
1626-
msgpack_object_init(&obj, MSGPACK_OBJECT_BIN, (void *)buffer, strlen(buffer));
1677+
msgpack_object_init_bin(&obj, buffer, (uint32_t)strlen(buffer));
16271678
EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
16281679
EXPECT_STREQ(buffer, obj.via.bin.ptr);
16291680
}
16301681

1682+
TEST(MSGPACKC, init_msgpack_obj_ext) {
1683+
msgpack_object obj;
1684+
char buffer[] = "test";
1685+
msgpack_object_init_ext(&obj, 1, buffer, (uint32_t)strlen(buffer));
1686+
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
1687+
EXPECT_EQ(1, obj.via.ext.type);
1688+
EXPECT_STREQ(buffer, obj.via.ext.ptr);
1689+
}
1690+
16311691
TEST(MSGPACKC, init_msgpack_obj_array) {
16321692
msgpack_object obj;
16331693
char buffer[][7] = {"test_1", "test_2", "test_3", "test_4"};
1634-
size_t buffer_size = 4;
1694+
uint32_t buffer_size = 4;
16351695
msgpack_object array[buffer_size];
16361696
for(size_t i = 0; i < buffer_size; i++) {
1637-
msgpack_object_init(&array[i], MSGPACK_OBJECT_STR, (void *)buffer[i], strlen(buffer[i]));
1697+
msgpack_object_init_str(&array[i], buffer[i], (uint32_t)strlen(buffer[i]));
16381698
}
1639-
msgpack_object_init(&obj, MSGPACK_OBJECT_ARRAY, (void *)array, buffer_size);
1699+
msgpack_object_init_array(&obj, array, buffer_size);
16401700
EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
16411701
for(size_t i = 0; i < buffer_size; i++) {
16421702
EXPECT_STREQ(buffer[i], obj.via.array.ptr[i].via.str.ptr);
@@ -1648,10 +1708,10 @@ TEST(MSGPACKC, init_msgpack_obj_map) {
16481708
char key_str[] = "test_key";
16491709
char value_str[] = "test_value";
16501710
msgpack_object key,value;
1651-
msgpack_object_init(&key, MSGPACK_OBJECT_STR, (void *)key_str, strlen(key_str));
1652-
msgpack_object_init(&value, MSGPACK_OBJECT_STR, (void *)value_str, strlen(value_str));
1711+
msgpack_object_init_str(&key, key_str, (uint32_t)strlen(key_str));
1712+
msgpack_object_init_str(&value, value_str, (uint32_t)strlen(value_str));
16531713
msgpack_object_kv map = { key, value };
1654-
msgpack_object_init(&obj, MSGPACK_OBJECT_MAP, (void *)&map, 1);
1714+
msgpack_object_init_map(&obj, &map, 1);
16551715
EXPECT_EQ(MSGPACK_OBJECT_MAP, obj.type);
16561716
EXPECT_STREQ(key_str, obj.via.map.ptr->key.via.str.ptr);
16571717
EXPECT_STREQ(value_str, obj.via.map.ptr->val.via.str.ptr);

0 commit comments

Comments
 (0)