[info] type_name = "std::optional" ctype = "OPTIONAL_TYPE" header = "optional" # Old: typeName = "std::optional<" ns = ["namespace std"] numTemplateParams = 1 [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(true); getSizeType(*container, returnArg); } else { SAVE_SIZE(sizeof(%1%)); SAVE_DATA(false); } } """ 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); } """