mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-31 07:58:20 +02:00
cpp: add msgpack/type/tr1/unordered_{map,set}.hpp
This commit is contained in:
parent
d76093b148
commit
55cfbf378e
@ -1,6 +1,6 @@
|
|||||||
AC_INIT(msgpack/unpack_template.h)
|
AC_INIT(msgpack/unpack_template.h)
|
||||||
AC_CONFIG_AUX_DIR(ac)
|
AC_CONFIG_AUX_DIR(ac)
|
||||||
AM_INIT_AUTOMAKE(msgpack, 0.3.9)
|
AM_INIT_AUTOMAKE(msgpack, 0.3.10)
|
||||||
AC_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
AC_SUBST(CFLAGS)
|
AC_SUBST(CFLAGS)
|
||||||
|
@ -25,7 +25,9 @@ nobase_include_HEADERS = \
|
|||||||
msgpack/type/string.hpp \
|
msgpack/type/string.hpp \
|
||||||
msgpack/type/vector.hpp \
|
msgpack/type/vector.hpp \
|
||||||
msgpack/type/tuple.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
|
libmsgpack_la_LIBADD = -L../c -lmsgpackc
|
||||||
|
|
||||||
|
@ -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
|
} // namespace msgpack
|
||||||
|
|
||||||
#endif /* msgpack/type/set.hpp */
|
#endif /* msgpack/type/set.hpp */
|
||||||
|
85
cpp/type/tr1/unordered_map.hpp
Normal file
85
cpp/type/tr1/unordered_map.hpp
Normal file
@ -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 */
|
||||||
|
|
80
cpp/type/tr1/unordered_set.hpp
Normal file
80
cpp/type/tr1/unordered_set.hpp
Normal file
@ -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 */
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user