diff options
| author | frsyuki <frsyuki@users.sourceforge.jp> | 2010-04-25 06:39:12 +0900 |
|---|---|---|
| committer | frsyuki <frsyuki@users.sourceforge.jp> | 2010-04-25 06:39:12 +0900 |
| commit | 9df6916029e2eba4ca0f93578f631d34208e6415 (patch) | |
| tree | c720852541a0ffc3a6526ee8a94c0380043d158b /cpp/msgpack | |
| parent | 9bfa2354ff9e667436fc4e6ced2274a5c0e55aab (diff) | |
| download | msgpack-python-9df6916029e2eba4ca0f93578f631d34208e6415.tar.gz | |
cpp: object::object(const T& v, zone* z) 2
Diffstat (limited to 'cpp/msgpack')
| -rw-r--r-- | cpp/msgpack/object.hpp | 6 | ||||
| -rw-r--r-- | cpp/msgpack/type/deque.hpp | 25 | ||||
| -rw-r--r-- | cpp/msgpack/type/list.hpp | 25 | ||||
| -rw-r--r-- | cpp/msgpack/type/map.hpp | 66 | ||||
| -rw-r--r-- | cpp/msgpack/type/set.hpp | 50 | ||||
| -rw-r--r-- | cpp/msgpack/type/tr1/unordered_map.hpp | 44 | ||||
| -rw-r--r-- | cpp/msgpack/type/tr1/unordered_set.hpp | 42 | ||||
| -rw-r--r-- | cpp/msgpack/type/vector.hpp | 25 |
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); + } } |
