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; }
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); } }