[info] type_name = "folly::F14ValueMap" stub_template_params = [2,3,4] ctype = "F14_MAP" header = "folly/container/F14Map.h" # Old: typeName = "folly::F14ValueMap<" ns = ["folly::F14ValueMap"] numTemplateParams = 2 replaceTemplateParamIndex = [2, 3] allocatorIndex = 4 [codegen] decl = """ template void getSizeType(const %1% &container, size_t& dataSegOffset); """ func = """ template void getSizeType(const %1% &container, size_t& returnArg) { size_t memorySize = container.getAllocatedMemorySize(); SAVE_SIZE(sizeof(%1%) + memorySize); SAVE_DATA(memorySize); SAVE_DATA(container.bucket_count()); SAVE_DATA(container.size()); // The double ampersand is needed otherwise this loop doesn't work with vector for (auto&& it: container) { getSizeType(it.first, returnArg); getSizeType(it.second, returnArg); } } """ traversal_func = """ auto tail = returnArg .write((uintptr_t)container.getAllocatedMemorySize()) .write((uintptr_t)container.bucket_count()) .write(container.size()); for (auto &&entry: container) { tail = tail.delegate([&ctx, &key = entry.first, &value = entry.second](auto ret) { auto next = ret.delegate([&ctx, &key](typename TypeHandler::type ret) { return OIInternal::getSizeType(ctx, key, ret); }); return OIInternal::getSizeType(ctx, value, 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 = """ types::st::List::type, typename TypeHandler::type>> """ func = """ static constexpr size_t element_size = sizeof(typename container_type::value_type); auto allocationSize = el.pointer.value(); el.pointer.reset(); auto list = std::get(d.val); el.container_stats->length = list.length; el.exclusive_size += allocationSize - list.length * element_size; static constexpr std::array element_fields{ make_field("key"), make_field("value"), }; static constexpr inst::Field element{ element_size, element_size - sizeof(T0) - sizeof(T1), "[]", std::array{}, element_fields, std::array{}, element_fields[0].is_primitive && element_fields[1].is_primitive, }; for (size_t i = 0; i < list.length; i++) stack_ins(element); """