11//
22// MessagePack for C++ static resolution routine
33//
4- // Copyright (C) 2014 KONDO Takatoshi
4+ // Copyright (C) 2014-2015 KONDO Takatoshi
55//
66// Licensed under the Apache License, Version 2.0 (the "License");
77// you may not use this file except in compliance with the License.
2020
2121#include " msgpack/versioning.hpp"
2222#include " msgpack/object_fwd.hpp"
23+ #include " msgpack/adaptor/check_container_size.hpp"
2324
2425#include < unordered_map>
2526
@@ -46,9 +47,10 @@ inline object const& operator>> (object const& o, std::unordered_map<K, V>& v)
4647template <typename Stream, typename K, typename V>
4748inline packer<Stream>& operator << (packer<Stream>& o, const std::unordered_map<K,V>& v)
4849{
49- o.pack_map (v.size ());
50+ uint32_t size = checked_get_container_size (v.size ());
51+ o.pack_map (size);
5052 for (typename std::unordered_map<K,V>::const_iterator it (v.begin ()), it_end (v.end ());
51- it != it_end; ++it) {
53+ it != it_end; ++it) {
5254 o.pack (it->first );
5355 o.pack (it->second );
5456 }
@@ -63,10 +65,11 @@ inline void operator<< (object::with_zone& o, const std::unordered_map<K,V>& v)
6365 o.via .map .ptr = nullptr ;
6466 o.via .map .size = 0 ;
6567 } else {
66- object_kv* p = static_cast <object_kv*>(o.zone .allocate_align (sizeof (object_kv)*v.size ()));
67- object_kv* const pend = p + v.size ();
68+ uint32_t size = checked_get_container_size (v.size ());
69+ object_kv* p = static_cast <object_kv*>(o.zone .allocate_align (sizeof (object_kv)*size));
70+ object_kv* const pend = p + size;
6871 o.via .map .ptr = p;
69- o.via .map .size = v. size () ;
72+ o.via .map .size = size;
7073 typename std::unordered_map<K,V>::const_iterator it (v.begin ());
7174 do {
7275 p->key = object (it->first , o.zone );
@@ -98,9 +101,10 @@ inline object const& operator>> (object const& o, std::unordered_multimap<K, V>&
98101template <typename Stream, typename K, typename V>
99102inline packer<Stream>& operator << (packer<Stream>& o, const std::unordered_multimap<K,V>& v)
100103{
101- o.pack_map (v.size ());
104+ uint32_t size = checked_get_container_size (v.size ());
105+ o.pack_map (size);
102106 for (typename std::unordered_multimap<K,V>::const_iterator it (v.begin ()), it_end (v.end ());
103- it != it_end; ++it) {
107+ it != it_end; ++it) {
104108 o.pack (it->first );
105109 o.pack (it->second );
106110 }
@@ -115,10 +119,11 @@ inline void operator<< (object::with_zone& o, const std::unordered_multimap<K,V>
115119 o.via .map .ptr = nullptr ;
116120 o.via .map .size = 0 ;
117121 } else {
118- object_kv* p = static_cast <object_kv*>(o.zone .allocate_align (sizeof (object_kv)*v.size ()));
119- object_kv* const pend = p + v.size ();
122+ uint32_t size = checked_get_container_size (v.size ());
123+ object_kv* p = static_cast <object_kv*>(o.zone .allocate_align (sizeof (object_kv)*size));
124+ object_kv* const pend = p + size;
120125 o.via .map .ptr = p;
121- o.via .map .size = v. size () ;
126+ o.via .map .size = size;
122127 typename std::unordered_multimap<K,V>::const_iterator it (v.begin ());
123128 do {
124129 p->key = object (it->first , o.zone );
0 commit comments