summaryrefslogtreecommitdiff
path: root/cpp/msgpack
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-04-25 06:39:12 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-04-25 06:39:12 +0900
commit9df6916029e2eba4ca0f93578f631d34208e6415 (patch)
treec720852541a0ffc3a6526ee8a94c0380043d158b /cpp/msgpack
parent9bfa2354ff9e667436fc4e6ced2274a5c0e55aab (diff)
downloadmsgpack-python-9df6916029e2eba4ca0f93578f631d34208e6415.tar.gz
cpp: object::object(const T& v, zone* z) 2
Diffstat (limited to 'cpp/msgpack')
-rw-r--r--cpp/msgpack/object.hpp6
-rw-r--r--cpp/msgpack/type/deque.hpp25
-rw-r--r--cpp/msgpack/type/list.hpp25
-rw-r--r--cpp/msgpack/type/map.hpp66
-rw-r--r--cpp/msgpack/type/set.hpp50
-rw-r--r--cpp/msgpack/type/tr1/unordered_map.hpp44
-rw-r--r--cpp/msgpack/type/tr1/unordered_set.hpp42
-rw-r--r--cpp/msgpack/type/vector.hpp25
8 files changed, 229 insertions, 54 deletions
diff --git a/cpp/msgpack/object.hpp b/cpp/msgpack/object.hpp
index 37c1926..a72913a 100644
--- a/cpp/msgpack/object.hpp
+++ b/cpp/msgpack/object.hpp
@@ -103,14 +103,12 @@ struct object {
operator msgpack_object();
+ struct with_zone;
+
private:
struct implicit_type;
public:
- // FIXME private?
- struct with_zone;
-
-public:
implicit_type convert() const;
};
diff --git a/cpp/msgpack/type/deque.hpp b/cpp/msgpack/type/deque.hpp
index 6ae00a8..d21ceea 100644
--- a/cpp/msgpack/type/deque.hpp
+++ b/cpp/msgpack/type/deque.hpp
@@ -53,16 +53,21 @@ template <typename T>
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());
- object* const pend = p + v.size();
- o.via.array.ptr = p;
- o.via.array.size = v.size();
- typename std::deque<T>::const_iterator it(v.begin());
- do {
- *p = object(*it, o.zone);
- ++p;
- ++it;
- } while(p < pend);
+ if(v.empty()) {
+ o.via.array.ptr = NULL;
+ o.via.array.size = 0;
+ } else {
+ object* p = (object*)o.zone->malloc(sizeof(object)*v.size());
+ object* const pend = p + v.size();
+ o.via.array.ptr = p;
+ o.via.array.size = v.size();
+ typename std::deque<T>::const_iterator it(v.begin());
+ do {
+ *p = object(*it, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
}
diff --git a/cpp/msgpack/type/list.hpp b/cpp/msgpack/type/list.hpp
index 6807345..c0f8ce6 100644
--- a/cpp/msgpack/type/list.hpp
+++ b/cpp/msgpack/type/list.hpp
@@ -53,16 +53,21 @@ template <typename T>
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());
- object* const pend = p + v.size();
- o.via.array.ptr = p;
- o.via.array.size = v.size();
- typename std::list<T>::const_iterator it(v.begin());
- do {
- *p = object(*it, o.zone);
- ++p;
- ++it;
- } while(p < pend);
+ if(v.empty()) {
+ o.via.array.ptr = NULL;
+ o.via.array.size = 0;
+ } else {
+ object* p = (object*)o.zone->malloc(sizeof(object)*v.size());
+ object* const pend = p + v.size();
+ o.via.array.ptr = p;
+ o.via.array.size = v.size();
+ typename std::list<T>::const_iterator it(v.begin());
+ do {
+ *p = object(*it, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
}
diff --git a/cpp/msgpack/type/map.hpp b/cpp/msgpack/type/map.hpp
index 552de57..958447d 100644
--- a/cpp/msgpack/type/map.hpp
+++ b/cpp/msgpack/type/map.hpp
@@ -70,6 +70,28 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const type::assoc_vector<K
return o;
}
+template <typename K, typename V>
+inline void operator<< (object::with_zone& o, const type::assoc_vector<K,V>& v)
+{
+ o.type = type::MAP;
+ if(v.empty()) {
+ o.via.map.ptr = NULL;
+ o.via.map.size = 0;
+ } else {
+ object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size());
+ object_kv* const pend = p + v.size();
+ o.via.map.ptr = p;
+ o.via.map.size = v.size();
+ typename type::assoc_vector<K,V>::const_iterator it(v.begin());
+ do {
+ p->key = object(it->first, o.zone);
+ p->val = object(it->second, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
+}
+
template <typename K, typename V>
inline std::map<K, V> operator>> (object o, std::map<K, V>& v)
@@ -104,6 +126,28 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::map<K,V>& v)
return o;
}
+template <typename K, typename V>
+inline void operator<< (object::with_zone& o, const std::map<K,V>& v)
+{
+ o.type = type::MAP;
+ if(v.empty()) {
+ o.via.map.ptr = NULL;
+ o.via.map.size = 0;
+ } else {
+ object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size());
+ object_kv* const pend = p + v.size();
+ o.via.map.ptr = p;
+ o.via.map.size = v.size();
+ typename std::map<K,V>::const_iterator it(v.begin());
+ do {
+ p->key = object(it->first, o.zone);
+ p->val = object(it->second, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
+}
+
template <typename K, typename V>
inline std::multimap<K, V> operator>> (object o, std::multimap<K, V>& v)
@@ -132,6 +176,28 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::multimap<K,V>&
return o;
}
+template <typename K, typename V>
+inline void operator<< (object::with_zone& o, const std::multimap<K,V>& v)
+{
+ o.type = type::MAP;
+ if(v.empty()) {
+ o.via.map.ptr = NULL;
+ o.via.map.size = 0;
+ } else {
+ object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size());
+ object_kv* const pend = p + v.size();
+ o.via.map.ptr = p;
+ o.via.map.size = v.size();
+ typename std::multimap<K,V>::const_iterator it(v.begin());
+ do {
+ p->key = object(it->first, o.zone);
+ p->val = object(it->second, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
+}
+
} // namespace msgpack
diff --git a/cpp/msgpack/type/set.hpp b/cpp/msgpack/type/set.hpp
index 2a6e7a4..bcf1030 100644
--- a/cpp/msgpack/type/set.hpp
+++ b/cpp/msgpack/type/set.hpp
@@ -52,16 +52,21 @@ template <typename T>
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());
- object* const pend = p + v.size();
- o.via.array.ptr = p;
- o.via.array.size = v.size();
- typename std::set<T>::const_iterator it(v.begin());
- do {
- *p = object(*it, o.zone);
- ++p;
- ++it;
- } while(p < pend);
+ if(v.empty()) {
+ o.via.array.ptr = NULL;
+ o.via.array.size = 0;
+ } else {
+ object* p = (object*)o.zone->malloc(sizeof(object)*v.size());
+ object* const pend = p + v.size();
+ o.via.array.ptr = p;
+ o.via.array.size = v.size();
+ typename std::set<T>::const_iterator it(v.begin());
+ do {
+ *p = object(*it, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
}
@@ -93,16 +98,21 @@ template <typename T>
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());
- object* const pend = p + v.size();
- o.via.array.ptr = p;
- o.via.array.size = v.size();
- typename std::multiset<T>::const_iterator it(v.begin());
- do {
- *p = object(*it, o.zone);
- ++p;
- ++it;
- } while(p < pend);
+ if(v.empty()) {
+ o.via.array.ptr = NULL;
+ o.via.array.size = 0;
+ } else {
+ object* p = (object*)o.zone->malloc(sizeof(object)*v.size());
+ object* const pend = p + v.size();
+ o.via.array.ptr = p;
+ o.via.array.size = v.size();
+ typename std::multiset<T>::const_iterator it(v.begin());
+ do {
+ *p = object(*it, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
}
diff --git a/cpp/msgpack/type/tr1/unordered_map.hpp b/cpp/msgpack/type/tr1/unordered_map.hpp
index 1996cfd..4b29f0c 100644
--- a/cpp/msgpack/type/tr1/unordered_map.hpp
+++ b/cpp/msgpack/type/tr1/unordered_map.hpp
@@ -50,6 +50,28 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_
return o;
}
+template <typename K, typename V>
+inline void operator<< (object::with_zone& o, const std::tr1::unordered_map<K,V>& v)
+{
+ o.type = type::MAP;
+ if(v.empty()) {
+ o.via.map.ptr = NULL;
+ o.via.map.size = 0;
+ } else {
+ object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size());
+ object_kv* const pend = p + v.size();
+ o.via.map.ptr = p;
+ o.via.map.size = v.size();
+ typename std::tr1::unordered_map<K,V>::const_iterator it(v.begin());
+ do {
+ p->key = object(it->first, o.zone);
+ p->val = object(it->second, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
+}
+
template <typename K, typename V>
inline std::tr1::unordered_multimap<K, V> operator>> (object o, std::tr1::unordered_multimap<K, V>& v)
@@ -78,6 +100,28 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_
return o;
}
+template <typename K, typename V>
+inline void operator<< (object::with_zone& o, const std::tr1::unordered_multimap<K,V>& v)
+{
+ o.type = type::MAP;
+ if(v.empty()) {
+ o.via.map.ptr = NULL;
+ o.via.map.size = 0;
+ } else {
+ object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size());
+ object_kv* const pend = p + v.size();
+ o.via.map.ptr = p;
+ o.via.map.size = v.size();
+ typename std::tr1::unordered_multimap<K,V>::const_iterator it(v.begin());
+ do {
+ p->key = object(it->first, o.zone);
+ p->val = object(it->second, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
+}
+
} // namespace msgpack
diff --git a/cpp/msgpack/type/tr1/unordered_set.hpp b/cpp/msgpack/type/tr1/unordered_set.hpp
index eb127b5..4af6801 100644
--- a/cpp/msgpack/type/tr1/unordered_set.hpp
+++ b/cpp/msgpack/type/tr1/unordered_set.hpp
@@ -48,6 +48,27 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_
return o;
}
+template <typename T>
+inline void operator<< (object::with_zone& o, const std::tr1::unordered_set<T>& v)
+{
+ o.type = type::ARRAY;
+ if(v.empty()) {
+ o.via.array.ptr = NULL;
+ o.via.array.size = 0;
+ } else {
+ object* p = (object*)o.zone->malloc(sizeof(object)*v.size());
+ object* const pend = p + v.size();
+ o.via.array.ptr = p;
+ o.via.array.size = v.size();
+ typename std::tr1::unordered_set<T>::const_iterator it(v.begin());
+ do {
+ *p = object(*it, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
+}
+
template <typename T>
inline std::tr1::unordered_multiset<T>& operator>> (object o, std::tr1::unordered_multiset<T>& v)
@@ -73,6 +94,27 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_
return o;
}
+template <typename T>
+inline void operator<< (object::with_zone& o, const std::tr1::unordered_multiset<T>& v)
+{
+ o.type = type::ARRAY;
+ if(v.empty()) {
+ o.via.array.ptr = NULL;
+ o.via.array.size = 0;
+ } else {
+ object* p = (object*)o.zone->malloc(sizeof(object)*v.size());
+ object* const pend = p + v.size();
+ o.via.array.ptr = p;
+ o.via.array.size = v.size();
+ typename std::tr1::unordered_multiset<T>::const_iterator it(v.begin());
+ do {
+ *p = object(*it, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
+}
+
} // namespace msgpack
diff --git a/cpp/msgpack/type/vector.hpp b/cpp/msgpack/type/vector.hpp
index 382f501..bd073ef 100644
--- a/cpp/msgpack/type/vector.hpp
+++ b/cpp/msgpack/type/vector.hpp
@@ -57,16 +57,21 @@ template <typename T>
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());
- object* const pend = p + v.size();
- o.via.array.ptr = p;
- o.via.array.size = v.size();
- typename std::vector<T>::const_iterator it(v.begin());
- do {
- *p = object(*it, o.zone);
- ++p;
- ++it;
- } while(p < pend);
+ if(v.empty()) {
+ o.via.array.ptr = NULL;
+ o.via.array.size = 0;
+ } else {
+ object* p = (object*)o.zone->malloc(sizeof(object)*v.size());
+ object* const pend = p + v.size();
+ o.via.array.ptr = p;
+ o.via.array.size = v.size();
+ typename std::vector<T>::const_iterator it(v.begin());
+ do {
+ *p = object(*it, o.zone);
+ ++p;
+ ++it;
+ } while(p < pend);
+ }
}