clmdep_msgpack::object const& operator()(clmdep_msgpack::object const& o, MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>& v) const { if(o.type != clmdep_msgpack::type::MAP) { throw clmdep_msgpack::type_error(); } clmdep_msgpack::object_kv* p(o.via.map.ptr); clmdep_msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size); MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc> tmp; for(; p != pend; ++p) { std::pair<K, V> value; p->key.convert(value.first); p->val.convert(value.second); tmp.insert(value); } tmp.swap(v); return o; }
void operator()(clmdep_msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>& v) const { o.type = clmdep_msgpack::type::MAP; if(v.empty()) { o.via.map.ptr = nullptr; o.via.map.size = 0; } else { uint32_t size = checked_get_container_size(v.size()); clmdep_msgpack::object_kv* p = static_cast<clmdep_msgpack::object_kv*>(o.zone.allocate_align(sizeof(clmdep_msgpack::object_kv)*size)); clmdep_msgpack::object_kv* const pend = p + size; o.via.map.ptr = p; o.via.map.size = size; typename MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>::const_iterator it(v.begin()); do { p->key = clmdep_msgpack::object(it->first, o.zone); p->val = clmdep_msgpack::object(it->second, o.zone); ++p; ++it; } while(p < pend); } }
inline void operator<< (object::with_zone& o, const MSGPACK_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 MSGPACK_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); } }
inline MSGPACK_STD_TR1::unordered_multimap<K, V> operator>> (object o, MSGPACK_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; }