[info] type_name = "folly::F14VectorSet" stub_template_params = [1,2,3] ctype = "F14_SET" header = "folly/container/F14Set.h" # Old: typeName = "folly::F14VectorSet<" ns = ["folly::F14VectorSet"] numTemplateParams = 1 replaceTemplateParamIndex = [1, 2] allocatorIndex = 3 [codegen] decl = """ template void getSizeType(const %1% &container, size_t& returnArg); """ 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, 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, &entry](auto ret) { return OIInternal::getSizeType(ctx, entry, ret); }); } 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> """ func = """ 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 * sizeof(T0); static constexpr auto childField = make_field("[]"); for (size_t i = 0; i < list.length; i++) stack_ins(childField); """