diff options
| author | frsyuki <frsyuki@users.sourceforge.jp> | 2010-04-25 01:57:05 +0900 |
|---|---|---|
| committer | frsyuki <frsyuki@users.sourceforge.jp> | 2010-04-25 01:57:05 +0900 |
| commit | 05e28752f111f6faa8b61432a7063a30b9f51ebf (patch) | |
| tree | 9046e5900a70076ce39420c2494a92166bb5bf16 /cpp/msgpack | |
| parent | 01b6673528127538457fdf445531f3574dc0c20a (diff) | |
| download | msgpack-python-05e28752f111f6faa8b61432a7063a30b9f51ebf.tar.gz | |
cpp: MSGPACK_DEFINE defines T::msgpack_object(object*, zone*)
Diffstat (limited to 'cpp/msgpack')
| -rw-r--r-- | cpp/msgpack/object.hpp | 22 | ||||
| -rw-r--r-- | cpp/msgpack/type/bool.hpp | 3 | ||||
| -rw-r--r-- | cpp/msgpack/type/define.hpp.erb | 18 | ||||
| -rw-r--r-- | cpp/msgpack/type/deque.hpp | 2 | ||||
| -rw-r--r-- | cpp/msgpack/type/float.hpp | 6 | ||||
| -rw-r--r-- | cpp/msgpack/type/int.hpp | 32 | ||||
| -rw-r--r-- | cpp/msgpack/type/list.hpp | 2 | ||||
| -rw-r--r-- | cpp/msgpack/type/nil.hpp | 3 | ||||
| -rw-r--r-- | cpp/msgpack/type/pair.hpp | 2 | ||||
| -rw-r--r-- | cpp/msgpack/type/raw.hpp | 3 | ||||
| -rw-r--r-- | cpp/msgpack/type/set.hpp | 4 | ||||
| -rw-r--r-- | cpp/msgpack/type/string.hpp | 2 | ||||
| -rw-r--r-- | cpp/msgpack/type/tuple.hpp.erb | 4 | ||||
| -rw-r--r-- | cpp/msgpack/type/vector.hpp | 2 |
14 files changed, 90 insertions, 15 deletions
diff --git a/cpp/msgpack/object.hpp b/cpp/msgpack/object.hpp index df1079b..bfbaeb1 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<Stream>& operator<< (packer<Stream>& o, const T& v); template <typename T> T& operator>> (object o, T& v); +// deconvert operator +template <typename T> +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<Stream>& operator<< (packer<Stream>& o, const T& v) return o; } +template <typename T> +void operator<< (object::with_zone& o, const T& v) +{ + v.msgpack_object(static_cast<object*>(&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 <typename T> inline object& object::operator=(const T& v) { - *this << v; + *this = object(v); return *this; } template <typename T> 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 9d63435..9433a98 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<object&>(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/define.hpp.erb b/cpp/msgpack/type/define.hpp.erb index 2eac4f4..369e12f 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 A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> @@ -73,6 +83,14 @@ struct define<A0<%1.upto(i) {|j|%>, 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 5e919a8..6ae00a8 100644 --- a/cpp/msgpack/type/deque.hpp +++ b/cpp/msgpack/type/deque.hpp @@ -50,7 +50,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::deque<T>& v) } template <typename T> -inline void operator<< (object::object_zone& o, const std::deque<T>& v) +inline void operator<< (object::with_zone& o, const std::deque<T>& 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 28131d1..a60ef0b 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<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, double v) + { static_cast<object&>(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/int.hpp b/cpp/msgpack/type/int.hpp index 2dab78b..e2d1820 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<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, signed short v) + { static_cast<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, signed int v) + { static_cast<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, signed long v) + { static_cast<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, signed long long v) + { static_cast<object&>(o) << v; } + + +inline void operator<< (object::with_zone& o, unsigned char v) + { static_cast<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned short v) + { static_cast<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned int v) + { static_cast<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned long v) + { static_cast<object&>(o) << v; } + +inline void operator<< (object::with_zone& o, unsigned long long v) + { static_cast<object&>(o) << v; } + + } // namespace msgpack #endif /* msgpack/type/int.hpp */ diff --git a/cpp/msgpack/type/list.hpp b/cpp/msgpack/type/list.hpp index 5318639..6807345 100644 --- a/cpp/msgpack/type/list.hpp +++ b/cpp/msgpack/type/list.hpp @@ -50,7 +50,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::list<T>& v) } template <typename T> -inline void operator<< (object::object_zone& o, const std::list<T>& v) +inline void operator<< (object::with_zone& o, const std::list<T>& 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 ed58384..e58bc9d 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<object&>(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/pair.hpp b/cpp/msgpack/type/pair.hpp index 6c68288..296a8b6 100644 --- a/cpp/msgpack/type/pair.hpp +++ b/cpp/msgpack/type/pair.hpp @@ -44,7 +44,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::pair<T1, T2>& v } template <typename T1, typename T2> -inline void operator<< (object::object_zone& o, const std::pair<T1, T2>& v) +inline void operator<< (object::with_zone& o, const std::pair<T1, T2>& 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 d854d28..21d9a0d 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<object&>(o) << v; } + } // namespace msgpack diff --git a/cpp/msgpack/type/set.hpp b/cpp/msgpack/type/set.hpp index 6f5fb18..2a6e7a4 100644 --- a/cpp/msgpack/type/set.hpp +++ b/cpp/msgpack/type/set.hpp @@ -49,7 +49,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::set<T>& v) } template <typename T> -inline void operator<< (object::object_zone& o, const std::set<T>& v) +inline void operator<< (object::with_zone& o, const std::set<T>& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); @@ -90,7 +90,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::multiset<T>& v) } template <typename T> -inline void operator<< (object::object_zone& o, const std::multiset<T>& v) +inline void operator<< (object::with_zone& o, const std::multiset<T>& 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 8ca2724..f11a5e6 100644 --- a/cpp/msgpack/type/string.hpp +++ b/cpp/msgpack/type/string.hpp @@ -39,7 +39,7 @@ inline packer<Stream>& operator<< (packer<Stream>& 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 e57fe98..1b0c172 100644 --- a/cpp/msgpack/type/tuple.hpp.erb +++ b/cpp/msgpack/type/tuple.hpp.erb @@ -166,7 +166,7 @@ const packer<Stream>& 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 A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> inline void operator<< ( - object::object_zone& o, + object::with_zone& o, const type::tuple<A0<%1.upto(i) {|j|%>, 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 f9e709b..382f501 100644 --- a/cpp/msgpack/type/vector.hpp +++ b/cpp/msgpack/type/vector.hpp @@ -54,7 +54,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::vector<T>& v) } template <typename T> -inline void operator<< (object::object_zone& o, const std::vector<T>& v) +inline void operator<< (object::with_zone& o, const std::vector<T>& v) { o.type = type::ARRAY; object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); |
