This looks good. I have a minor portability nit. You use enum types in
a public ABI. The compiler is allowed to be arbitrary in choosing the
size of an enum type and different compilers may choose differently. My
recommendation is to define the enum so you get constants into the
debugger. Either make it an anonymous enum or name the type for use in
implementations but use some well-defined integral type in the public
ABI. (Yes, compilers can choose the size of integral types too, but
that actually tends to get specified in platform ABIs; enum size choice
As a minor question, what documentation markup is that? It looks sort of
like doxygen, but in doxygen @ is not parameter.
Thanks for all the great work.