cpp: MSGPACK_DEFINE defines T::msgpack_object(object*, zone*)

This commit is contained in:
frsyuki 2010-04-25 01:57:05 +09:00
parent 01b6673528
commit 05e28752f1
14 changed files with 90 additions and 15 deletions

View File

@ -106,7 +106,7 @@ private:
public: public:
// FIXME private? // FIXME private?
struct object_zone; struct with_zone;
public: public:
implicit_type convert() const; implicit_type convert() const;
@ -117,11 +117,11 @@ struct object_kv {
object val; object val;
}; };
struct object::object_zone : object { struct object::with_zone : object {
object_zone(msgpack::zone* zone) : zone(zone) { } with_zone(msgpack::zone* zone) : zone(zone) { }
msgpack::zone* zone; msgpack::zone* zone;
private: private:
object_zone(); with_zone();
}; };
@ -142,6 +142,10 @@ packer<Stream>& operator<< (packer<Stream>& o, const T& v);
template <typename T> template <typename T>
T& operator>> (object o, T& v); T& operator>> (object o, T& v);
// deconvert operator
template <typename T>
void operator<< (object::with_zone& o, const T& v);
struct object::implicit_type { struct object::implicit_type {
implicit_type(object o) : obj(o) { } implicit_type(object o) : obj(o) { }
@ -206,6 +210,12 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const T& v)
return o; 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) inline bool operator!=(const object x, const object y)
{ return !(x == y); } { return !(x == y); }
@ -253,14 +263,14 @@ inline object::object(const T& v)
template <typename T> template <typename T>
inline object& object::operator=(const T& v) inline object& object::operator=(const T& v)
{ {
*this << v; *this = object(v);
return *this; return *this;
} }
template <typename T> template <typename T>
object::object(const T& v, zone* z) object::object(const T& v, zone* z)
{ {
object_zone oz(z); with_zone oz(z);
oz << v; oz << v;
type = oz.type; type = oz.type;
via = oz.via; via = oz.via;

View File

@ -45,6 +45,9 @@ inline void operator<< (object& o, bool v)
o.via.boolean = v; o.via.boolean = v;
} }
inline void operator<< (object::with_zone& o, bool v)
{ static_cast<object&>(o) << v; }
} // namespace msgpack } // namespace msgpack

View File

@ -27,6 +27,10 @@
void msgpack_unpack(msgpack::object o) \ void msgpack_unpack(msgpack::object o) \
{ \ { \
msgpack::type::make_define(__VA_ARGS__).msgpack_unpack(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 { namespace msgpack {
@ -51,6 +55,12 @@ struct define<> {
{ {
if(o.type != type::ARRAY) { throw type_error(); } 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|%> <%0.upto(GENERATION_LIMIT) {|i|%>
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> 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|%> <%0.upto(i) {|j|%>
if(size <= <%=j%>) { return; } o.via.array.ptr[<%=j%>].convert(&a<%=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|%> <%0.upto(i) {|j|%>
A<%=j%>& a<%=j%>;<%}%> A<%=j%>& a<%=j%>;<%}%>
}; };

View File

@ -50,7 +50,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::deque<T>& v)
} }
template <typename T> 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; o.type = type::ARRAY;
object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); object* p = (object*)o.zone->malloc(sizeof(object)*v.size());

View File

@ -69,6 +69,12 @@ inline void operator<< (object& o, double v)
o.via.dec = 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 } // namespace msgpack

View File

@ -173,6 +173,38 @@ inline void operator<< (object& o, unsigned long long v)
{ o.type = type::POSITIVE_INTEGER, o.via.u64 = 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 } // namespace msgpack
#endif /* msgpack/type/int.hpp */ #endif /* msgpack/type/int.hpp */

View File

@ -50,7 +50,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::list<T>& v)
} }
template <typename T> 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; o.type = type::ARRAY;
object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); object* p = (object*)o.zone->malloc(sizeof(object)*v.size());

View File

@ -47,6 +47,9 @@ inline void operator<< (object& o, type::nil v)
o.type = type::NIL; o.type = type::NIL;
} }
inline void operator<< (object::with_zone& o, type::nil v)
{ static_cast<object&>(o) << v; }
} // namespace msgpack } // namespace msgpack

View File

@ -44,7 +44,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::pair<T1, T2>& v
} }
template <typename T1, typename T2> 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; o.type = type::ARRAY;
object* p = (object*)o.zone->malloc(sizeof(object)*2); object* p = (object*)o.zone->malloc(sizeof(object)*2);

View File

@ -84,6 +84,9 @@ inline void operator<< (object& o, const type::raw_ref& v)
o.via.raw.size = v.size; 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 } // namespace msgpack

View File

@ -49,7 +49,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::set<T>& v)
} }
template <typename T> 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; o.type = type::ARRAY;
object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); 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> 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; o.type = type::ARRAY;
object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); object* p = (object*)o.zone->malloc(sizeof(object)*v.size());

View File

@ -39,7 +39,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::string& v)
return o; 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; o.type = type::RAW;
char* ptr = (char*)o.zone->malloc(v.size()); char* ptr = (char*)o.zone->malloc(v.size());

View File

@ -166,7 +166,7 @@ const packer<Stream>& operator<< (
<%}%> <%}%>
inline void operator<< ( inline void operator<< (
object::object_zone& o, object::with_zone& o,
const type::tuple<>& v) { const type::tuple<>& v) {
o.type = type::ARRAY; o.type = type::ARRAY;
o.via.array.ptr = NULL; o.via.array.ptr = NULL;
@ -175,7 +175,7 @@ inline void operator<< (
<%0.upto(GENERATION_LIMIT) {|i|%> <%0.upto(GENERATION_LIMIT) {|i|%>
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
inline void operator<< ( inline void operator<< (
object::object_zone& o, object::with_zone& o,
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) { const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
o.type = type::ARRAY; o.type = type::ARRAY;
o.via.array.ptr = (object*)o.zone->malloc(sizeof(object)*<%=i+1%>); o.via.array.ptr = (object*)o.zone->malloc(sizeof(object)*<%=i+1%>);

View File

@ -54,7 +54,7 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::vector<T>& v)
} }
template <typename T> 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; o.type = type::ARRAY;
object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); object* p = (object*)o.zone->malloc(sizeof(object)*v.size());