@@ -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
0 commit comments