@@ -18,6 +18,7 @@ namespace msgpackcpp
1818 value::value (const char * v) : val(std::string(v)) {}
1919 value::value (std::string_view v) : val(std::string(v)) {}
2020 value::value (std::string v) : val{std::move (v)} {}
21+ value::value (std::vector<char > v) : val{std::move (v)} {}
2122 value::value (std::vector<value> v) : val{std::move (v)} {}
2223 value::value (std::map<std::string, value> v) : val{std::move (v)} {}
2324
@@ -42,6 +43,7 @@ namespace msgpackcpp
4243 size_t value::size () const noexcept
4344 {
4445 return std::visit (overloaded{
46+ [&](const std::vector<char >& v) {return v.size ();},
4547 [&](const std::vector<value>& v) {return v.size ();},
4648 [&](const std::map<std::string, value>& v) {return v.size ();},
4749 [&](std::nullptr_t ) {return (size_t )0 ;},
@@ -56,6 +58,7 @@ namespace msgpackcpp
5658 bool value::is_int () const noexcept {return std::holds_alternative<int64_t >(val) || std::holds_alternative<uint64_t >(val);}
5759 bool value::is_real () const noexcept {return std::holds_alternative<double >(val);}
5860 bool value::is_str () const noexcept {return std::holds_alternative<std::string>(val);}
61+ bool value::is_binary () const noexcept {return std::holds_alternative<std::vector<char >>(val);}
5962 bool value::is_array () const noexcept {return std::holds_alternative<std::vector<value>>(val);}
6063 bool value::is_object () const noexcept {return std::holds_alternative<std::map<std::string, value>>(val);}
6164
@@ -71,6 +74,8 @@ namespace msgpackcpp
7174 auto value::as_real () -> double& {return std::get<double >(val);}
7275 auto value::as_str () const -> const std::string& {return std::get<std::string>(val);}
7376 auto value::as_str () -> std::string& {return std::get<std::string>(val);}
77+ auto value::as_bin () const -> const std::vector<char>& {return std::get<std::vector<char >>(val);}
78+ auto value::as_bin () -> std::vector<char>& {return std::get<std::vector<char >>(val);}
7479 auto value::as_array () const -> const std::vector<value>& {return std::get<std::vector<value>>(val);}
7580 auto value::as_array () -> std::vector<value>& {return std::get<std::vector<value>>(val);}
7681 auto value::as_object () const -> const std::map<std::string, value>& {return std::get<std::map<std::string, value>>(val);}
@@ -150,41 +155,74 @@ namespace msgpackcpp
150155
151156 void value::unpack (source_base& in)
152157 {
153- while (in.remaining ())
158+ const uint8_t format = in.peak ();
159+
160+ if (format == MSGPACK_NIL)
154161 {
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)
162+ deserialize (in, nullptr );
163+ }
164+ else if (format == MSGPACK_FALSE || format == MSGPACK_TRUE)
165+ {
166+ bool v{};
167+ deserialize (in, v);
168+ val = v;
169+ }
170+ else if (format == MSGPACK_F32 || format == MSGPACK_F64)
171+ {
172+ double v{};
173+ deserialize (in, v);
174+ val = v;
175+ }
176+ else if (format < MSGPACK_FIXINT_POS || format == MSGPACK_U8 || format == MSGPACK_U16 || format == MSGPACK_U32 || format == MSGPACK_U64)
177+ {
178+ uint64_t v{};
179+ deserialize (in, v);
180+ val = v;
181+ }
182+ else if ((format & 0b11100000 ) == MSGPACK_FIXINT_NEG || format == MSGPACK_I8 || format == MSGPACK_I16 || format == MSGPACK_I32 || format == MSGPACK_I64)
183+ {
184+ int64_t v{};
185+ deserialize (in, v);
186+ val = v;
187+ }
188+ else if ((format & 0b11100000 ) == MSGPACK_FIXSTR || format == MSGPACK_STR8 || format == MSGPACK_STR16 || format == MSGPACK_STR32)
189+ {
190+ std::string v;
191+ deserialize (in, v);
192+ val = std::move (v);
193+ }
194+ else if (format == MSGPACK_BIN8 || format == MSGPACK_BIN16 || format == MSGPACK_BIN32)
195+ {
196+ std::vector<char > v;
197+ deserialize (in, v);
198+ val = std::move (v);
199+ }
200+ else if ((format & 0b11110000 ) == MSGPACK_FIXARR || format == MSGPACK_ARR16 || format == MSGPACK_ARR32)
201+ {
202+ uint32_t size{};
203+ deserialize_array_size (in, size);
204+ std::vector<value> v (size);
205+ for (auto & el : v)
206+ el.unpack (in);
207+ val = std::move (v);
208+ }
209+ else if ((format & 0b11110000 ) == MSGPACK_FIXMAP || format == MSGPACK_MAP16 || format == MSGPACK_MAP32)
210+ {
211+ uint32_t size{};
212+ deserialize_map_size (in, size);
213+ std::map<std::string, value> m;
214+ for (size_t i{0 } ; i < size ; ++i)
180215 {
181- int64_t v{};
182- deserialize (in, v);
183- val = v;
216+ std::string k;
217+ value v;
218+ deserialize (in, k);
219+ v.unpack (in);
220+ m.emplace (std::make_pair (std::move (k), std::move (v)));
184221 }
185- else
186- throw std::system_error (BAD_FORMAT);
222+ val = std::move (m);
187223 }
224+ else
225+ throw std::system_error (BAD_FORMAT);
188226 }
189227
190228 value value::unpack_static (source_base& in)
0 commit comments