summaryrefslogtreecommitdiff
path: root/cpp/msgpack/object.hpp
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/object.hpp
parent01b6673528127538457fdf445531f3574dc0c20a (diff)
downloadmsgpack-python-05e28752f111f6faa8b61432a7063a30b9f51ebf.tar.gz
cpp: MSGPACK_DEFINE defines T::msgpack_object(object*, zone*)
Diffstat (limited to 'cpp/msgpack/object.hpp')
-rw-r--r--cpp/msgpack/object.hpp22
1 files changed, 16 insertions, 6 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;