Skip to content

Commit 7f4a0fe

Browse files
author
me
committed
value::unpack WIP
1 parent c7c7268 commit 7f4a0fe

File tree

3 files changed

+53
-18
lines changed

3 files changed

+53
-18
lines changed

src/msgpack.cpp

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ namespace msgpackcpp
123123

124124
//----------------------------------------------------------------------------------------------------------------
125125

126-
void value::pack(sink_base& out, const value& jv)
126+
void value::pack(sink_base& out) const
127127
{
128128
std::visit(overloaded{
129129
[&](std::nullptr_t) {
@@ -132,33 +132,67 @@ namespace msgpackcpp
132132
[&](const std::vector<value>& v) {
133133
serialize_array_size(out, v.size());
134134
for (const auto& el : v)
135-
value::pack(out, el);
135+
el.pack(out);
136136
},
137137
[&](const std::map<std::string, value>& m) {
138138
serialize_map_size(out, m.size());
139139
for (const auto& [k,v] : m)
140140
{
141141
serialize(out, k);
142-
value::pack(out, v);
142+
v.pack(out);
143143
}
144144
},
145145
[&](const auto& v) {
146146
serialize(out, v);
147147
}
148-
}, jv.val);
148+
}, val);
149149
}
150150

151-
// value value::unpack(source_base& in)
152-
// {
153-
// value jv;
154-
155-
// while (in.remaining())
156-
// {
157-
158-
// }
151+
void value::unpack(source_base& in)
152+
{
153+
while (in.remaining())
154+
{
155+
const uint8_t format = in.peak();
156+
157+
if (format == MSGPACK_NIL)
158+
{
159+
deserialize(in, nullptr);
160+
}
161+
else if (format == MSGPACK_FALSE || format == MSGPACK_TRUE)
162+
{
163+
bool v{};
164+
deserialize(in, v);
165+
val = v;
166+
}
167+
else if (format == MSGPACK_F32 || format == MSGPACK_F64)
168+
{
169+
double v{};
170+
deserialize(in, v);
171+
val = v;
172+
}
173+
else if (format < MSGPACK_FIXINT_POS || format == MSGPACK_U8 || format == MSGPACK_U16 || format == MSGPACK_U32 || format == MSGPACK_U64)
174+
{
175+
uint64_t v{};
176+
deserialize(in, v);
177+
val = v;
178+
}
179+
else if ((format & 0b11100000) == MSGPACK_FIXINT_NEG || format == MSGPACK_I8 || format == MSGPACK_I16 || format == MSGPACK_I32 || format == MSGPACK_I64)
180+
{
181+
int64_t v{};
182+
deserialize(in, v);
183+
val = v;
184+
}
185+
else
186+
throw std::system_error(BAD_FORMAT);
187+
}
188+
}
159189

160-
// return jv;
161-
// }
190+
value value::unpack_static(source_base& in)
191+
{
192+
value jv;
193+
jv.unpack(in);
194+
return jv;
195+
}
162196

163197
//----------------------------------------------------------------------------------------------------------------
164198

src/msgpack.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,9 @@ namespace msgpackcpp
132132
const value& operator[](size_t array_index) const;
133133
value& operator[](size_t array_index);
134134

135-
static void pack(sink_base& out, const value& jv);
136-
static value unpack(source_base& in);
135+
void pack(sink_base& out) const;
136+
void unpack(source_base& in);
137+
static value unpack_static(source_base& in);
137138
};
138139

139140
//----------------------------------------------------------------------------------------------------------------
@@ -519,7 +520,7 @@ namespace msgpackcpp
519520
// positive fixint (7-bit positive integer)
520521
v = format;
521522
}
522-
else if ((format & 0b11100000) == 0b11100000)
523+
else if ((format & 0b11100000) == MSGPACK_FIXINT_NEG)
523524
{
524525
// negative fixing (5-bit negative integer)
525526
v = bit_cast<int8_t>(format);

tests/value.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ TEST_SUITE("[VALUE]")
118118

119119
std::vector<char> buf0;
120120
auto out0 = sink(buf0);
121-
value::pack(out0, jv1);
121+
jv1.pack(out0);
122122
// auto in0 = source(buf0);
123123

124124
// value jv2 = value::unpack(in0);

0 commit comments

Comments
 (0)