@@ -2450,6 +2450,45 @@ let gen_dfuns_spec (ns,bs,tys) =
24502450 [(decl_to_spec ds, empty_env () )]
24512451 ) (List. mapi (fun i name -> (i, name)) (Array. to_list ns))
24522452
2453+ (* Generate both spec and def for a group of mutually recursive functions in one pass.
2454+ Calls gen_decl_for_dfuns ONCE per function, then derives:
2455+ - spec: decl_to_spec of the full definition (forward declaration)
2456+ - def: the full definition (for templates) or None (for non-templates in header mode)
2457+ Returns list of (spec, def_option, lifted_decls) *)
2458+ let gen_dfuns_dual ~is_header (ns ,bs ,tys ) =
2459+ List. concat_map (fun (i , name ) ->
2460+ let (ds, env, tvars) = gen_decl_for_dfuns name bs.(i) tys.(i) in
2461+ let lifted = take_lifted_decls () in
2462+ let spec = (decl_to_spec ds, env) in
2463+ let def = match tvars, is_header with
2464+ | _ ::_ , true -> Some (ds, env) (* Template + header: full def in .h *)
2465+ | _ ::_ , false -> None (* Template + source: already in .h *)
2466+ | [] , true -> None (* Non-template + header: def goes in .cpp *)
2467+ | [] , false -> Some (ds, env) (* Non-template + source: full def in .cpp *)
2468+ in
2469+ [(spec, def, lifted)]
2470+ ) (List. mapi (fun i name -> (i, name)) (Array. to_list ns))
2471+
2472+ (* Generate both spec and def for a single Dterm function in one pass.
2473+ Calls gen_decl_for_pp ONCE, then derives both spec and def.
2474+ Returns (spec_opt, def_opt, tvars) *)
2475+ let gen_decl_for_pp_dual ~is_header n b ty =
2476+ let (ds_opt, env, tvars) = gen_decl_for_pp n b ty in
2477+ match ds_opt, tvars with
2478+ | Some ds , _ ::_ ->
2479+ (* Template function: spec is decl_to_spec, def only in header *)
2480+ let def = if is_header then Some (ds, env) else None in
2481+ (Some (decl_to_spec ds, env), def, tvars)
2482+ | Some ds , [] ->
2483+ (* Non-template function: spec via gen_spec, def only in source mode *)
2484+ let (spec_ds, spec_env) = gen_spec n b ty in
2485+ let def = if is_header then None else Some (ds, env) in
2486+ (Some (spec_ds, spec_env), def, tvars)
2487+ | None , _ ->
2488+ (* Non-function type: no def needed *)
2489+ let (spec_ds, spec_env) = gen_spec n b ty in
2490+ (Some (spec_ds, spec_env), None , tvars)
2491+
24532492let gen_ind_header vars name cnames tys =
24542493 let templates = List. map (fun n -> (TTtypename , n)) vars in
24552494 let add_templates d = match templates with
0 commit comments