summaryrefslogtreecommitdiff
path: root/cpp/object.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/object.hpp')
-rw-r--r--cpp/object.hpp132
1 files changed, 76 insertions, 56 deletions
diff --git a/cpp/object.hpp b/cpp/object.hpp
index 1f0dcdf..c6f1e4a 100644
--- a/cpp/object.hpp
+++ b/cpp/object.hpp
@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
-// Copyright (C) 2008 FURUHASHI Sadayuki
+// Copyright (C) 2008-2009 FURUHASHI Sadayuki
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -32,14 +32,16 @@ class type_error : public std::bad_cast { };
namespace type {
- static const unsigned char NIL = 0x01;
- static const unsigned char BOOLEAN = 0x02;
- static const unsigned char POSITIVE_INTEGER = 0x03;
- static const unsigned char NEGATIVE_INTEGER = 0x04;
- static const unsigned char DOUBLE = 0x05;
- static const unsigned char RAW = 0x06;
- static const unsigned char ARRAY = 0x07;
- static const unsigned char MAP = 0x08;
+ enum object_type {
+ NIL = 0x01,
+ BOOLEAN = 0x02,
+ POSITIVE_INTEGER = 0x03,
+ NEGATIVE_INTEGER = 0x04,
+ DOUBLE = 0x05,
+ RAW = 0x06,
+ ARRAY = 0x07,
+ MAP = 0x08,
+ };
}
@@ -59,7 +61,7 @@ struct object {
} ref;
};
- unsigned char type;
+ type::object_type type;
union_type via;
bool is_nil() { return type == type::NIL; }
@@ -68,7 +70,7 @@ struct object {
T as();
template <typename T>
- void convert(T& v);
+ void convert(T* v);
private:
struct implicit_type;
@@ -77,6 +79,21 @@ public:
implicit_type convert();
};
+bool operator==(const object x, const object y);
+bool operator!=(const object x, const object y);
+
+std::ostream& operator<< (std::ostream& s, const object o);
+
+
+template <typename Stream, typename T>
+inline void pack(Stream& s, const T& v);
+
+template <typename Stream, typename T>
+packer<Stream>& operator<< (packer<Stream>& o, const T& v);
+
+template <typename T>
+T& operator>> (object o, T& v);
+
struct object::implicit_type {
implicit_type(object o) : obj(o) { }
@@ -89,39 +106,41 @@ private:
object obj;
};
-std::ostream& operator<< (std::ostream& s, const object o);
-bool operator==(const object x, const object y);
-inline bool operator!=(const object x, const object y) { return !(x == y); }
+template <typename Type>
+class define : public Type {
+public:
+ typedef Type msgpack_type;
+ typedef define<Type> define_type;
-inline object& operator>> (object o, object& v)
-{
- v = o;
- return v;
-}
+ define() {}
+ define(const msgpack_type& v) : msgpack_type(v) {}
-template <typename Stream>
-packer<Stream>& operator<< (packer<Stream>& o, const object& v);
+ template <typename Packer>
+ void msgpack_pack(Packer& o) const
+ {
+ o << static_cast<const msgpack_type&>(*this);
+ }
+ void msgpack_unpack(object o)
+ {
+ o >> static_cast<msgpack_type&>(*this);
+ }
+};
+template <typename Stream>
template <typename T>
-inline void convert(T& v, object o)
-{
- o >> v;
-}
-
-template <typename Stream, typename T>
-inline void pack(packer<Stream>& o, const T& v)
+inline packer<Stream>& packer<Stream>::pack(const T& v)
{
- o << v;
+ *this << v;
+ return *this;
}
template <typename Stream, typename T>
inline void pack(Stream& s, const T& v)
{
- packer<Stream> pk(s);
- pack(pk, v);
+ packer<Stream>(s).pack(v);
}
template <typename Stream, typename T>
@@ -130,7 +149,11 @@ inline void pack_copy(packer<Stream>& o, T v)
pack(o, v);
}
-
+inline object& operator>> (object o, object& v)
+{
+ v = o;
+ return v;
+}
template <typename T>
inline T& operator>> (object o, T& v)
@@ -147,27 +170,8 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const T& v)
}
-template <typename Type>
-class define : public Type {
-public:
- typedef Type msgpack_type;
- typedef define<Type> define_type;
-
- define() {}
- define(msgpack_type v) : msgpack_type(v) {}
-
- template <typename Packer>
- void msgpack_pack(Packer& o) const
- {
- o << static_cast<const msgpack_type&>(*this);
- }
-
- void msgpack_unpack(object o)
- {
- o >> static_cast<msgpack_type&>(*this);
- }
-};
-
+inline bool operator!=(const object x, const object y)
+{ return !(x == y); }
inline object::implicit_type object::convert()
@@ -179,16 +183,32 @@ template <typename T>
inline T object::as()
{
T v;
- msgpack::convert(v, *this);
+ convert(&v);
return v;
}
template <typename T>
-void object::convert(T& v)
+inline void object::convert(T* v)
+{
+ *this >> *v;
+}
+
+
+// obsolete
+template <typename T>
+inline void convert(T& v, object o)
+{
+ o.convert(&v);
+}
+
+// obsolete
+template <typename Stream, typename T>
+inline void pack(packer<Stream>& o, const T& v)
{
- msgpack::convert(v, *this);
+ o.pack(v);
}
+
template <typename Stream>
packer<Stream>& operator<< (packer<Stream>& o, const object& v)
{