summaryrefslogtreecommitdiff
path: root/cpp/msgpack
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-04-25 01:57:05 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-04-25 01:57:05 +0900
commit05e28752f111f6faa8b61432a7063a30b9f51ebf (patch)
tree9046e5900a70076ce39420c2494a92166bb5bf16 /cpp/msgpack
parent01b6673528127538457fdf445531f3574dc0c20a (diff)
downloadmsgpack-python-05e28752f111f6faa8b61432a7063a30b9f51ebf.tar.gz
cpp: MSGPACK_DEFINE defines T::msgpack_object(object*, zone*)
Diffstat (limited to 'cpp/msgpack')
-rw-r--r--cpp/msgpack/object.hpp22
-rw-r--r--cpp/msgpack/type/bool.hpp3
-rw-r--r--cpp/msgpack/type/define.hpp.erb18
-rw-r--r--cpp/msgpack/type/deque.hpp2
-rw-r--r--cpp/msgpack/type/float.hpp6
-rw-r--r--cpp/msgpack/type/int.hpp32
-rw-r--r--cpp/msgpack/type/list.hpp2
-rw-r--r--cpp/msgpack/type/nil.hpp3
-rw-r--r--cpp/msgpack/type/pair.hpp2
-rw-r--r--cpp/msgpack/type/raw.hpp3
-rw-r--r--cpp/msgpack/type/set.hpp4
-rw-r--r--cpp/msgpack/type/string.hpp2
-rw-r--r--cpp/msgpack/type/tuple.hpp.erb4
-rw-r--r--cpp/msgpack/type/vector.hpp2
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());