bool start_map(uint32_t num_kv_pairs) {
     if (num_kv_pairs > m_limit.map()) throw msgpack::map_size_overflow("map size overflow");
     if (m_stack.size() > m_limit.depth()) throw msgpack::depth_size_overflow("depth size overflow");
     msgpack::object* obj = m_stack.back();
     obj->type = msgpack::type::MAP;
     obj->via.map.size = num_kv_pairs;
     if (num_kv_pairs == 0) {
         obj->via.map.ptr = MSGPACK_NULLPTR;
     }
     else {
         size_t size = num_kv_pairs*sizeof(msgpack::object_kv);
         if (size / sizeof(msgpack::object_kv) != num_kv_pairs) {
             throw msgpack::map_size_overflow("map size overflow");
         }
         obj->via.map.ptr =
             static_cast<msgpack::object_kv*>(m_zone->allocate_align(size, MSGPACK_ZONE_ALIGNOF(msgpack::object_kv)));
     }
     m_stack.push_back(reinterpret_cast<msgpack::object*>(obj->via.map.ptr));
     return true;
 }
 bool start_array(uint32_t num_elements) {
     if (num_elements > m_limit.array()) throw msgpack::array_size_overflow("array size overflow");
     if (m_stack.size() > m_limit.depth()) throw msgpack::depth_size_overflow("depth size overflow");
     msgpack::object* obj = m_stack.back();
     obj->type = msgpack::type::ARRAY;
     obj->via.array.size = num_elements;
     if (num_elements == 0) {
         obj->via.array.ptr = MSGPACK_NULLPTR;
     }
     else {
         size_t size = num_elements*sizeof(msgpack::object);
         if (size / sizeof(msgpack::object) != num_elements) {
             throw msgpack::array_size_overflow("array size overflow");
         }
         obj->via.array.ptr =
             static_cast<msgpack::object*>(m_zone->allocate_align(size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
     }
     m_stack.push_back(obj->via.array.ptr);
     return true;
 }
Exemple #3
0
 void operator()(clmdep_msgpack::object::with_zone& o, const std::deque<T, Alloc>& v) const {
     o.type = clmdep_msgpack::type::ARRAY;
     if(v.empty()) {
         o.via.array.ptr = MSGPACK_NULLPTR;
         o.via.array.size = 0;
     } else {
         uint32_t size = checked_get_container_size(v.size());
         clmdep_msgpack::object* p = static_cast<clmdep_msgpack::object*>(o.zone.allocate_align(sizeof(clmdep_msgpack::object)*size, MSGPACK_ZONE_ALIGNOF(clmdep_msgpack::object)));
         clmdep_msgpack::object* const pend = p + size;
         o.via.array.ptr = p;
         o.via.array.size = size;
         typename std::deque<T, Alloc>::const_iterator it(v.begin());
         do {
             *p = clmdep_msgpack::object(*it, o.zone);
             ++p;
             ++it;
         } while(p < pend);
     }
 }