[info] type_name = "folly::sorted_vector_map" ctype = "MAP_SEQ_TYPE" header = "folly/sorted_vector_types.h" stub_template_params = [2,3] # Old: typeName = "folly::sorted_vector_map<" ns = ["namespace std", "folly::sorted_vector_map"] numTemplateParams = 2 replaceTemplateParamIndex = [] [codegen] decl = """ template void getSizeType(const %1% &container, size_t& returnArg); """ func = """ template void getSizeType(const %1% &container, size_t& returnArg) { SAVE_SIZE(sizeof(%1%)); SAVE_DATA((uintptr_t)&container); SAVE_DATA((uintptr_t)container.capacity()); SAVE_DATA((uintptr_t)container.size()); SAVE_SIZE((container.capacity() - container.size()) * (sizeof(Key) + sizeof(Value))); for (auto const& it : container) { getSizeType(it.first, returnArg); getSizeType(it.second, returnArg); } } """ traversal_func = ''' auto tail = returnArg.write((uintptr_t)&container) .write(container.capacity()) .write(container.size()); for (const auto& kv : container) { tail = tail.delegate([&ctx, &kv](auto ret) { auto start = maybeCaptureKey(ctx, kv.first, ret); auto next = start.delegate([&ctx, &kv](typename TypeHandler::type ret) { return OIInternal::getSizeType(ctx, kv.first, ret); }); return OIInternal::getSizeType(ctx, kv.second, next); }); } return tail.finish(); ''' [[codegen.processor]] type = "types::st::VarInt" func = "el.pointer = std::get(d.val).value;" [[codegen.processor]] type = "types::st::VarInt" func = ''' el.container_stats.emplace(result::Element::ContainerStats{ .capacity = std::get(d.val).value }); ''' [[codegen.processor]] type = ''' std::conditional_t::type, types::st::Pair::type, typename TypeHandler::type>>>, types::st::List::type, typename TypeHandler::type>>> ''' func = ''' using element_type = std::pair; static constexpr std::array entryFields{ make_field("key"), make_field("value"), }; static constexpr auto processors = maybeCaptureKeysProcessor(); static constexpr auto entry = inst::Field { sizeof(element_type), sizeof(element_type) - sizeof(T0) - sizeof(T1), "[]", std::array{}, entryFields, processors, entryFields[0].is_primitive && entryFields[1].is_primitive, }; auto list = std::get(d.val); el.container_stats->length = list.length; el.exclusive_size += (el.container_stats->capacity - el.container_stats->length) * sizeof(element_type); for (size_t i = 0; i < list.length; i++) stack_ins(entry); '''