[info] type_name = "folly::Optional" ctype = "FOLLY_OPTIONAL_TYPE" header = "folly/Optional.h" # Old: typeName = "folly::Optional<" ns = ["folly::Optional"] numTemplateParams = 1 replaceTemplateParamIndex = [] [codegen] decl = """ template void getSizeType(const %1% &container, size_t& returnArg); """ func = """ template void getSizeType(const %1%& container, size_t& returnArg) { if (container) { SAVE_SIZE(sizeof(%1%) - sizeof(T)); SAVE_DATA((uintptr_t)(container.get_pointer())); getSizeType(*(container.get_pointer()), returnArg); } else { SAVE_SIZE(sizeof(%1%)); SAVE_DATA(0); } } """ traversal_func = """ if (container.has_value()) { return returnArg.template delegate<1>([&ctx, &container](auto ret) { return OIInternal::getSizeType(ctx, *container, ret); }); } else { return returnArg.template delegate<0>(std::identity()); } """ [[codegen.processor]] type = "types::st::Sum, typename TypeHandler::type>" func = """ static constexpr auto elementField = make_field("el"); auto sum = std::get(d.val); el.container_stats = result::Element::ContainerStats { .capacity = 1, .length = sum.index, }; if (sum.index == 1) { el.exclusive_size -= sizeof(T0); stack_ins(elementField); } """