summaryrefslogtreecommitdiff
path: root/cpp/msgpack/object.hpp
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-04-25 00:03:09 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-04-25 00:03:09 +0900
commit120e8bffd7917e9529229e796b21ececc51df016 (patch)
treeae198fbb4a6b09621c730af308af4b9954bc1f52 /cpp/msgpack/object.hpp
parent8335823748973b07dd628d3a94d49bdb615600ee (diff)
downloadmsgpack-python-120e8bffd7917e9529229e796b21ececc51df016.tar.gz
cpp: object::object(const T& v) and object::operator=(const T& v)
Diffstat (limited to 'cpp/msgpack/object.hpp')
-rw-r--r--cpp/msgpack/object.hpp85
1 files changed, 33 insertions, 52 deletions
diff --git a/cpp/msgpack/object.hpp b/cpp/msgpack/object.hpp
index 3b42a8e..0125d0a 100644
--- a/cpp/msgpack/object.hpp
+++ b/cpp/msgpack/object.hpp
@@ -87,15 +87,15 @@ struct object {
template <typename T>
void convert(T* v) const;
- operator msgpack_object();
- object(msgpack_object obj);
-
object();
- object(bool v);
- object(uint64_t v);
- object(int64_t v);
- object(double v);
- object(const char* ptr, size_t size);
+
+ template <typename T>
+ object(const T& v);
+
+ template <typename T>
+ object& operator=(const T& v);
+
+ operator msgpack_object();
private:
struct implicit_type;
@@ -115,9 +115,11 @@ bool operator!=(const object x, const object y);
std::ostream& operator<< (std::ostream& s, const object o);
+// serialize operator
template <typename Stream, typename T>
packer<Stream>& operator<< (packer<Stream>& o, const T& v);
+// convert operator
template <typename T>
T& operator>> (object o, T& v);
@@ -190,53 +192,45 @@ inline bool operator!=(const object x, const object y)
{ return !(x == y); }
-inline object::object()
+inline object::implicit_type object::convert() const
{
- type = type::NIL;
+ return implicit_type(*this);
}
-inline object::object(bool v)
+template <typename T>
+inline void object::convert(T* v) const
{
- type = type::BOOLEAN;
- via.boolean = v;
+ *this >> *v;
}
-inline object::object(uint64_t v)
+template <typename T>
+inline T object::as() const
{
- type = type::POSITIVE_INTEGER;
- via.u64 = v;
+ T v;
+ convert(&v);
+ return v;
}
-inline object::object(int64_t v)
-{
- if(v >= 0) {
- type = type::POSITIVE_INTEGER;
- via.u64 = v;
- } else {
- type = type::NEGATIVE_INTEGER;
- via.i64 = v;
- }
-}
-inline object::object(double v)
+inline object::object()
{
- type = type::DOUBLE;
- via.dec = v;
+ type = type::NIL;
}
-inline object::object(const char* ptr, size_t size)
+template <typename T>
+inline object::object(const T& v)
{
- type = type::RAW;
- via.raw.size = size;
- via.raw.ptr = ptr;
+ *this << v;
}
-inline object::object(msgpack_object obj)
+template <typename T>
+inline object& object::operator=(const T& v)
{
- // FIXME beter way?
- ::memcpy(this, &obj, sizeof(obj));
+ *this << v;
+ return *this;
}
+
inline object::operator msgpack_object()
{
// FIXME beter way?
@@ -245,23 +239,10 @@ inline object::operator msgpack_object()
return obj;
}
-inline object::implicit_type object::convert() const
-{
- return implicit_type(*this);
-}
-
-template <typename T>
-inline void object::convert(T* v) const
-{
- *this >> *v;
-}
-
-template <typename T>
-inline T object::as() const
+inline void operator<< (object& o, msgpack_object v)
{
- T v;
- convert(&v);
- return v;
+ // FIXME beter way?
+ ::memcpy(&o, &v, sizeof(v));
}