Ivan FB a3e68333ab
refactor(codegen): reconcile C++ header names with the native/cbor convention
Aligns the C++ generators with the C generator and the symbol naming: the
native (zero-serialization, same-process) wrapper is the bare `<lib>.hpp` and
the CBOR (inter-process) wrapper carries the `_cbor` suffix — mirroring the C
headers (`<lib>.h` / `<lib>_cbor.h`) and the `<name>` / `<name>_cbor` exports.

Previously native was `<lib>_native.hpp` and CBOR was the bare `<lib>.hpp`,
which is backwards from the symbol convention and would collide on the native
`<lib>.h` when both ABIs emit into one dir (ffiMode=both). With the flip, a
single `genbindings_cpp` run now drops `<lib>.hpp` + `<lib>_cbor.hpp` side by
side, exactly like c_bindings holds both `.h` headers.

Consumers updated to match: the CBOR cpp_bindings driver and the C++ e2e suite
include `*_cbor.hpp`; the native example includes the bare `<lib>.hpp`.

Validated: native example runs on `my_timer.hpp`; C++ e2e suite 19/19 on the
`_cbor.hpp` headers; check_bindings_cpp regen is deterministic.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 19:31:39 +02:00

1.7 KiB

C++ bindings — native (generated)

Generated native (zero-serialization) C++ bindings for the timer library — the C++ counterpart of c_bindings / go_bindings. The CBOR C++ bindings live in ../cpp_bindings.

File Description
my_timer.hpp Generated wrapper: a C++ struct + toC/fromC per {.ffi.} type, and a My_timerNode class whose methods marshal typed args into / read typed struct returns out of the native ABI — no CBOR.
my_timer.h Native C header (structs + entry points) the .hpp includes.
main.cpp, Makefile A driver + build.
my_timer::My_timerNode node(my_timer::TimerConfig{"my-app"});
std::cout << node.Version();
auto r = node.Echo(my_timer::EchoRequest{"hello", 5});  // -> EchoResponse
std::cout << r.echoed << " / " << r.timerName;

Regenerate with nimble genbindings_cpp_native (from the repo root).

Build & run

cd examples/timer/cpp_native_bindings
make run

Status

Requests are fully supported: scalar / string / bool / nested struct and now sequences (std::vector) and optionals (std::optional) — create, version, echo, complex, schedule all generate and round-trip typed values (ASAN-clean). toC uses a holder that owns the C-array backing while string pointers borrow the C++ argument (valid for the call's duration; the library deep-copies).

Native typed events are supported too: node.On<Event>(handler) registers a native listener and the typed payload arrives via fromC (no CBOR).

The native header is the bare my_timer.hpp and the CBOR counterpart is my_timer_cbor.hpp — matching the C headers (my_timer.h / my_timer_cbor.h) and the <name> / <name>_cbor symbol naming.