diff --git a/cpp/msgpack/object.hpp b/cpp/msgpack/object.hpp index df1079b4..bfbaeb16 100644 --- a/cpp/msgpack/object.hpp +++ b/cpp/msgpack/object.hpp @@ -106,7 +106,7 @@ private: public: // FIXME private? - struct object_zone; + struct with_zone; public: implicit_type convert() const; @@ -117,11 +117,11 @@ struct object_kv { object val; }; -struct object::object_zone : object { - object_zone(msgpack::zone* zone) : zone(zone) { } +struct object::with_zone : object { + with_zone(msgpack::zone* zone) : zone(zone) { } msgpack::zone* zone; private: - object_zone(); + with_zone(); }; @@ -142,6 +142,10 @@ packer& operator<< (packer& o, const T& v); template T& operator>> (object o, T& v); +// deconvert operator +template +void operator<< (object::with_zone& o, const T& v); + struct object::implicit_type { implicit_type(object o) : obj(o) { } @@ -206,6 +210,12 @@ inline packer& operator<< (packer& o, const T& v) return o; } +template +void operator<< (object::with_zone& o, const T& v) +{ + v.msgpack_object(static_cast(&o), o.zone); +} + inline bool operator!=(const object x, const object y) { return !(x == y); } @@ -253,14 +263,14 @@ inline object::object(const T& v) template inline object& object::operator=(const T& v) { - *this << v; + *this = object(v); return *this; } template object::object(const T& v, zone* z) { - object_zone oz(z); + with_zone oz(z); oz << v; type = oz.type; via = oz.via; diff --git a/cpp/msgpack/type/bool.hpp b/cpp/msgpack/type/bool.hpp index 9d634352..9433a982 100644 --- a/cpp/msgpack/type/bool.hpp +++ b/cpp/msgpack/type/bool.hpp @@ -45,6 +45,9 @@ inline void operator<< (object& o, bool v) o.via.boolean = v; } +inline void operator<< (object::with_zone& o, bool v) + { static_cast(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/define.hpp.erb b/cpp/msgpack/type/define.hpp.erb index 2eac4f4c..369e12fc 100644 --- a/cpp/msgpack/type/define.hpp.erb +++ b/cpp/msgpack/type/define.hpp.erb @@ -27,6 +27,10 @@ void msgpack_unpack(msgpack::object o) \ { \ msgpack::type::make_define(__VA_ARGS__).msgpack_unpack(o); \ + }\ + void msgpack_object(msgpack::object* o, msgpack::zone* z) const \ + { \ + msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \ } namespace msgpack { @@ -51,6 +55,12 @@ struct define<> { { if(o.type != type::ARRAY) { throw type_error(); } } + void msgpack_object(msgpack::object* o, msgpack::zone* z) const + { + o->type = type::ARRAY; + o->via.array.ptr = NULL; + o->via.array.size = 0; + } }; <%0.upto(GENERATION_LIMIT) {|i|%> template , typename A<%=j%><%}%>> @@ -73,6 +83,14 @@ struct define, A<%=j%><%}%>> { <%0.upto(i) {|j|%> if(size <= <%=j%>) { return; } o.via.array.ptr[<%=j%>].convert(&a<%=j%>);<%}%> } + void msgpack_object(msgpack::object* o, msgpack::zone* z) const + { + o->type = type::ARRAY; + o->via.array.ptr = (object*)z->malloc(sizeof(object)*<%=i+1%>); + o->via.array.size = <%=i+1%>; + <%0.upto(i) {|j|%> + o->via.array.ptr[<%=j%>] = object(a<%=j%>, z);<%}%> + } <%0.upto(i) {|j|%> A<%=j%>& a<%=j%>;<%}%> }; diff --git a/cpp/msgpack/type/deque.hpp b/cpp/msgpack/type/deque.hpp index 5e919a85..6ae00a87 100644 --- a/cpp/msgpack/type/deque.hpp +++ b/cpp/msgpack/type/deque.hpp @@ -50,7 +50,7 @@ inline packer& operator<< (packer& o, const std::deque& v) } template -inline void operator<< (object::object_zone& o, const std::deque& v) +inline void operator<< (object::with_zone& o, const std::deque& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); diff --git a/cpp/msgpack/type/float.hpp b/cpp/msgpack/type/float.hpp index 28131d12..a60ef0bf 100644 --- a/cpp/msgpack/type/float.hpp +++ b/cpp/msgpack/type/float.hpp @@ -69,6 +69,12 @@ inline void operator<< (object& o, double v) o.via.dec = v; } +inline void operator<< (object::with_zone& o, float v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, double v) + { static_cast(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/int.hpp b/cpp/msgpack/type/int.hpp index 2dab78b6..e2d18209 100644 --- a/cpp/msgpack/type/int.hpp +++ b/cpp/msgpack/type/int.hpp @@ -173,6 +173,38 @@ inline void operator<< (object& o, unsigned long long v) { o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } +inline void operator<< (object::with_zone& o, signed char v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, signed short v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, signed int v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, signed long v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, signed long long v) + { static_cast(o) << v; } + + +inline void operator<< (object::with_zone& o, unsigned char v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned short v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned int v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned long v) + { static_cast(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned long long v) + { static_cast(o) << v; } + + } // namespace msgpack #endif /* msgpack/type/int.hpp */ diff --git a/cpp/msgpack/type/list.hpp b/cpp/msgpack/type/list.hpp index 53186391..68073459 100644 --- a/cpp/msgpack/type/list.hpp +++ b/cpp/msgpack/type/list.hpp @@ -50,7 +50,7 @@ inline packer& operator<< (packer& o, const std::list& v) } template -inline void operator<< (object::object_zone& o, const std::list& v) +inline void operator<< (object::with_zone& o, const std::list& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); diff --git a/cpp/msgpack/type/nil.hpp b/cpp/msgpack/type/nil.hpp index ed583840..e58bc9d4 100644 --- a/cpp/msgpack/type/nil.hpp +++ b/cpp/msgpack/type/nil.hpp @@ -47,6 +47,9 @@ inline void operator<< (object& o, type::nil v) o.type = type::NIL; } +inline void operator<< (object::with_zone& o, type::nil v) + { static_cast(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/pair.hpp b/cpp/msgpack/type/pair.hpp index 6c682883..296a8b64 100644 --- a/cpp/msgpack/type/pair.hpp +++ b/cpp/msgpack/type/pair.hpp @@ -44,7 +44,7 @@ inline packer& operator<< (packer& o, const std::pair& v } template -inline void operator<< (object::object_zone& o, const std::pair& v) +inline void operator<< (object::with_zone& o, const std::pair& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*2); diff --git a/cpp/msgpack/type/raw.hpp b/cpp/msgpack/type/raw.hpp index d854d28e..21d9a0d9 100644 --- a/cpp/msgpack/type/raw.hpp +++ b/cpp/msgpack/type/raw.hpp @@ -84,6 +84,9 @@ inline void operator<< (object& o, const type::raw_ref& v) o.via.raw.size = v.size; } +inline void operator<< (object::with_zone& o, const type::raw_ref& v) + { static_cast(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/set.hpp b/cpp/msgpack/type/set.hpp index 6f5fb184..2a6e7a44 100644 --- a/cpp/msgpack/type/set.hpp +++ b/cpp/msgpack/type/set.hpp @@ -49,7 +49,7 @@ inline packer& operator<< (packer& o, const std::set& v) } template -inline void operator<< (object::object_zone& o, const std::set& v) +inline void operator<< (object::with_zone& o, const std::set& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); @@ -90,7 +90,7 @@ inline packer& operator<< (packer& o, const std::multiset& v) } template -inline void operator<< (object::object_zone& o, const std::multiset& v) +inline void operator<< (object::with_zone& o, const std::multiset& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); diff --git a/cpp/msgpack/type/string.hpp b/cpp/msgpack/type/string.hpp index 8ca27242..f11a5e68 100644 --- a/cpp/msgpack/type/string.hpp +++ b/cpp/msgpack/type/string.hpp @@ -39,7 +39,7 @@ inline packer& operator<< (packer& o, const std::string& v) return o; } -inline void operator<< (object::object_zone& o, const std::string& v) +inline void operator<< (object::with_zone& o, const std::string& v) { o.type = type::RAW; char* ptr = (char*)o.zone->malloc(v.size()); diff --git a/cpp/msgpack/type/tuple.hpp.erb b/cpp/msgpack/type/tuple.hpp.erb index e57fe985..1b0c172c 100644 --- a/cpp/msgpack/type/tuple.hpp.erb +++ b/cpp/msgpack/type/tuple.hpp.erb @@ -166,7 +166,7 @@ const packer& operator<< ( <%}%> inline void operator<< ( - object::object_zone& o, + object::with_zone& o, const type::tuple<>& v) { o.type = type::ARRAY; o.via.array.ptr = NULL; @@ -175,7 +175,7 @@ inline void operator<< ( <%0.upto(GENERATION_LIMIT) {|i|%> template , typename A<%=j%><%}%>> inline void operator<< ( - object::object_zone& o, + object::with_zone& o, const type::tuple, A<%=j%><%}%>>& v) { o.type = type::ARRAY; o.via.array.ptr = (object*)o.zone->malloc(sizeof(object)*<%=i+1%>); diff --git a/cpp/msgpack/type/vector.hpp b/cpp/msgpack/type/vector.hpp index f9e709bc..382f501f 100644 --- a/cpp/msgpack/type/vector.hpp +++ b/cpp/msgpack/type/vector.hpp @@ -54,7 +54,7 @@ inline packer& operator<< (packer& o, const std::vector& v) } template -inline void operator<< (object::object_zone& o, const std::vector& v) +inline void operator<< (object::with_zone& o, const std::vector& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*v.size());