diff options
| author | frsyuki <frsyuki@users.sourceforge.jp> | 2010-01-14 21:20:32 +0900 |
|---|---|---|
| committer | frsyuki <frsyuki@users.sourceforge.jp> | 2010-01-14 21:20:32 +0900 |
| commit | 55cfbf378e5fcf91d0dffe73f9cab3f3f7414233 (patch) | |
| tree | 413fa1a380722dd159714570af0f48fa83a45895 /cpp | |
| parent | d76093b148c1082a1465041263810595f3fd5b3b (diff) | |
| download | msgpack-python-55cfbf378e5fcf91d0dffe73f9cab3f3f7414233.tar.gz | |
cpp: add msgpack/type/tr1/unordered_{map,set}.hpp
Diffstat (limited to 'cpp')
| -rw-r--r-- | cpp/Makefile.am | 4 | ||||
| -rw-r--r-- | cpp/type/set.hpp | 25 | ||||
| -rw-r--r-- | cpp/type/tr1/unordered_map.hpp | 85 | ||||
| -rw-r--r-- | cpp/type/tr1/unordered_set.hpp | 80 |
4 files changed, 193 insertions, 1 deletions
diff --git a/cpp/Makefile.am b/cpp/Makefile.am index 42d6d2a..0923362 100644 --- a/cpp/Makefile.am +++ b/cpp/Makefile.am @@ -25,7 +25,9 @@ nobase_include_HEADERS = \ msgpack/type/string.hpp \ msgpack/type/vector.hpp \ msgpack/type/tuple.hpp \ - msgpack/type/define.hpp + msgpack/type/define.hpp \ + msgpack/type/tr1/unordered_map.hpp \ + msgpack/type/tr1/unordered_set.hpp libmsgpack_la_LIBADD = -L../c -lmsgpackc diff --git a/cpp/type/set.hpp b/cpp/type/set.hpp index 11db2b3..f2c5bfb 100644 --- a/cpp/type/set.hpp +++ b/cpp/type/set.hpp @@ -49,6 +49,31 @@ inline packer<Stream>& operator<< (packer<Stream>& o, const std::set<T>& v) } +template <typename T> +inline std::multiset<T>& operator>> (object o, std::multiset<T>& v) +{ + if(o.type != type::ARRAY) { throw type_error(); } + object* p = o.via.array.ptr + o.via.array.size; + object* const pbegin = o.via.array.ptr; + while(p > pbegin) { + --p; + v.insert(p->as<T>()); + } + return v; +} + +template <typename Stream, typename T> +inline packer<Stream>& operator<< (packer<Stream>& o, const std::multiset<T>& v) +{ + o.pack_array(v.size()); + for(typename std::multiset<T>::const_iterator it(v.begin()), it_end(v.end()); + it != it_end; ++it) { + o.pack(*it); + } + return o; +} + + } // namespace msgpack #endif /* msgpack/type/set.hpp */ diff --git a/cpp/type/tr1/unordered_map.hpp b/cpp/type/tr1/unordered_map.hpp new file mode 100644 index 0000000..1996cfd --- /dev/null +++ b/cpp/type/tr1/unordered_map.hpp @@ -0,0 +1,85 @@ +// +// MessagePack for C++ static resolution routine +// +// 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. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP__ +#define MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP__ + +#include "msgpack/object.hpp" +#include <tr1/unordered_map> + +namespace msgpack { + + +template <typename K, typename V> +inline std::tr1::unordered_map<K, V> operator>> (object o, std::tr1::unordered_map<K, V>& v) +{ + if(o.type != type::MAP) { throw type_error(); } + object_kv* p(o.via.map.ptr); + object_kv* const pend(o.via.map.ptr + o.via.map.size); + for(; p != pend; ++p) { + K key; + p->key.convert(&key); + p->val.convert(&v[key]); + } + return v; +} + +template <typename Stream, typename K, typename V> +inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_map<K,V>& v) +{ + o.pack_map(v.size()); + for(typename std::tr1::unordered_map<K,V>::const_iterator it(v.begin()), it_end(v.end()); + it != it_end; ++it) { + o.pack(it->first); + o.pack(it->second); + } + return o; +} + + +template <typename K, typename V> +inline std::tr1::unordered_multimap<K, V> operator>> (object o, std::tr1::unordered_multimap<K, V>& v) +{ + if(o.type != type::MAP) { throw type_error(); } + object_kv* p(o.via.map.ptr); + object_kv* const pend(o.via.map.ptr + o.via.map.size); + for(; p != pend; ++p) { + std::pair<K, V> value; + p->key.convert(&value.first); + p->val.convert(&value.second); + v.insert(value); + } + return v; +} + +template <typename Stream, typename K, typename V> +inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_multimap<K,V>& v) +{ + o.pack_map(v.size()); + for(typename std::tr1::unordered_multimap<K,V>::const_iterator it(v.begin()), it_end(v.end()); + it != it_end; ++it) { + o.pack(it->first); + o.pack(it->second); + } + return o; +} + + +} // namespace msgpack + +#endif /* msgpack/type/map.hpp */ + diff --git a/cpp/type/tr1/unordered_set.hpp b/cpp/type/tr1/unordered_set.hpp new file mode 100644 index 0000000..eb127b5 --- /dev/null +++ b/cpp/type/tr1/unordered_set.hpp @@ -0,0 +1,80 @@ +// +// MessagePack for C++ static resolution routine +// +// 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. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef MSGPACK_TYPE_TR1_UNORDERED_SET_HPP__ +#define MSGPACK_TYPE_TR1_UNORDERED_SET_HPP__ + +#include "msgpack/object.hpp" +#include <tr1/unordered_set> + +namespace msgpack { + + +template <typename T> +inline std::tr1::unordered_set<T>& operator>> (object o, std::tr1::unordered_set<T>& v) +{ + if(o.type != type::ARRAY) { throw type_error(); } + object* p = o.via.array.ptr + o.via.array.size; + object* const pbegin = o.via.array.ptr; + while(p > pbegin) { + --p; + v.insert(p->as<T>()); + } + return v; +} + +template <typename Stream, typename T> +inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_set<T>& v) +{ + o.pack_array(v.size()); + for(typename std::tr1::unordered_set<T>::const_iterator it(v.begin()), it_end(v.end()); + it != it_end; ++it) { + o.pack(*it); + } + return o; +} + + +template <typename T> +inline std::tr1::unordered_multiset<T>& operator>> (object o, std::tr1::unordered_multiset<T>& v) +{ + if(o.type != type::ARRAY) { throw type_error(); } + object* p = o.via.array.ptr + o.via.array.size; + object* const pbegin = o.via.array.ptr; + while(p > pbegin) { + --p; + v.insert(p->as<T>()); + } + return v; +} + +template <typename Stream, typename T> +inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_multiset<T>& v) +{ + o.pack_array(v.size()); + for(typename std::tr1::unordered_multiset<T>::const_iterator it(v.begin()), it_end(v.end()); + it != it_end; ++it) { + o.pack(*it); + } + return o; +} + + +} // namespace msgpack + +#endif /* msgpack/type/set.hpp */ + |
