summaryrefslogtreecommitdiff
path: root/cpp/object.hpp
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:09:56 +0000
committerfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:09:56 +0000
commitf41c20a2503411393012d01e3f3c3ea0e9c7dde8 (patch)
tree32260b706400e4359bb707a690ade418185857e9 /cpp/object.hpp
parent9b95875d85fb802f6dd0fc1fe0544bef4be1fbc5 (diff)
downloadmsgpack-python-f41c20a2503411393012d01e3f3c3ea0e9c7dde8.tar.gz
lang/c/msgpack: added C++ binding msgpack::pack
git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@53 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
Diffstat (limited to 'cpp/object.hpp')
-rw-r--r--cpp/object.hpp49
1 files changed, 30 insertions, 19 deletions
diff --git a/cpp/object.hpp b/cpp/object.hpp
index 992ac1e..3f22dfc 100644
--- a/cpp/object.hpp
+++ b/cpp/object.hpp
@@ -1,6 +1,5 @@
#ifndef MSGPACK_OBJECT_HPP__
#define MSGPACK_OBJECT_HPP__
-#include <iostream>
#include <cstddef>
#include <stdexcept>
@@ -47,6 +46,8 @@ struct object;
typedef std::map<object, object> map;
typedef std::vector<object> array;
+class dynamic_packer;
+
struct object_class {
virtual ~object_class() {}
@@ -72,6 +73,7 @@ struct object_class {
bool operator!= (const object_class* x) const { return !(this->operator==(x)); }
virtual bool operator< (const object_class* x) const { throw cast_error(); }
virtual bool operator> (const object_class* x) const { throw cast_error(); }
+ virtual void pack(dynamic_packer& p) const = 0;
operator bool() const { return xbool(); } // FIXME !isnil();
operator uint8_t() const { return xu8(); }
operator uint16_t() const { return xu16(); }
@@ -128,6 +130,7 @@ struct object {
bool operator!= (object x) const { return val->operator!= (x.val); }
bool operator< (object x) const { return val->operator< (x.val); }
bool operator> (object x) const { return val->operator> (x.val); }
+ void pack(dynamic_packer& p) const { val->pack(p); }
operator bool() const { return val->operator bool(); }
operator uint8_t() const { return val->operator uint8_t(); }
operator uint16_t() const { return val->operator uint16_t(); }
@@ -160,18 +163,21 @@ inline std::ostream& operator<< (std::ostream& s, const object& o)
struct object_nil : object_class {
bool isnil() const;
bool operator== (const object_class* x) const;
+ void pack(dynamic_packer& p) const;
const object_class* inspect(std::ostream& s) const;
};
struct object_true : object_class {
bool xbool() const;
bool operator== (const object_class* x) const;
+ void pack(dynamic_packer& p) const;
const object_class* inspect(std::ostream& s) const;
};
struct object_false : object_class {
bool xbool() const;
bool operator== (const object_class* x) const;
+ void pack(dynamic_packer& p) const;
const object_class* inspect(std::ostream& s) const;
};
@@ -191,6 +197,7 @@ struct object_##NAME : object_class { \
bool operator== (const object_class* x) const; \
bool operator< (const object_class* x) const; \
bool operator> (const object_class* x) const; \
+ void pack(dynamic_packer& p) const; \
const object_class* inspect(std::ostream& s) const; \
private: \
TYPE val; \
@@ -209,24 +216,25 @@ INTEGER_CLASS(int64_t, i64)
#define FLOAT_CLASS(TYPE, NAME) \
-struct object_##NAME : object_class { \
- object_##NAME(TYPE v) : val(v) {} \
- uint8_t xu8 () const; \
- uint16_t xu16 () const; \
- uint32_t xu32 () const; \
- uint64_t xu64 () const; \
- int8_t xi8 () const; \
- int16_t xi16 () const; \
- int32_t xi32 () const; \
- int64_t xi64 () const; \
- float xfloat () const; \
- double xdouble() const; \
- bool operator== (const object_class* x) const; \
- bool operator< (const object_class* x) const; \
- bool operator> (const object_class* x) const; \
- const object_class* inspect(std::ostream& s) const; \
-private: \
- TYPE val; \
+struct object_##NAME : object_class { \
+ object_##NAME(TYPE v) : val(v) {} \
+ uint8_t xu8 () const; \
+ uint16_t xu16 () const; \
+ uint32_t xu32 () const; \
+ uint64_t xu64 () const; \
+ int8_t xi8 () const; \
+ int16_t xi16 () const; \
+ int32_t xi32 () const; \
+ int64_t xi64 () const; \
+ float xfloat () const; \
+ double xdouble() const; \
+ bool operator== (const object_class* x) const; \
+ bool operator< (const object_class* x) const; \
+ bool operator> (const object_class* x) const; \
+ void pack(dynamic_packer& p) const; \
+ const object_class* inspect(std::ostream& s) const; \
+private: \
+ TYPE val; \
};
FLOAT_CLASS(float, float)
@@ -242,6 +250,7 @@ struct object_##NAME : object_class { \
bool operator== (const object_class* x) const; \
bool operator< (const object_class* x) const; \
bool operator> (const object_class* x) const; \
+ void pack(dynamic_packer& p) const; \
const object_class* inspect(std::ostream& s) const; \
private: \
TYPE ptr; \
@@ -261,6 +270,7 @@ struct object_array : object_class, object_container_mixin {
const array& xarray() const;
bool operator== (const object_class* x) const;
// FIXME operator<, operator>
+ void pack(dynamic_packer& p) const;
const object_class* inspect(std::ostream& s) const;
public:
void push_back(object o) { val.push_back(o); }
@@ -276,6 +286,7 @@ struct object_map : object_class, object_container_mixin {
const map& xmap() const;
bool operator== (const object_class* x) const;
// FIXME operator<, operator>
+ void pack(dynamic_packer& p) const;
const object_class* inspect(std::ostream& s) const;
public:
void store(object k, object v) { val[k] = v; }