I'm part of a team working on a large and old Fortran code base which is increasingly modernized by bits of C++. In the process we've created tools for generating wrapper code to call Fortran routines from C++ and vice versa. This has been manageable for some years.
Now we want to also pass structs between Fortran & C++. This is quite challenging though because the Fortran standard does exclude various important features from interoperable structs: unions and arrays with size defined at runtime ... to name just a few. If you need those, what you are basically left with are opaque pointers pointing to objects in the respective other domain (C++/Fortran) and writing boilerplate code to manage them (create, copy, delete, etc.). We want to avoid that. My idea now is to use Cap'n Proto serialization as a universal runtime format for our data structures so they can be simply passed by-value between Fortran and C++ and accessed in both domains. What would be a reasonable way to approach this? Here's my current idea: There's a C plugin for capnpc (https://github.com/opensourcerouting/c-capnproto) available. Since Fortran can directly call C functions, we could generate Fortran wrapper code for the generated C code. So the layers of data & code would be: 1. the actual message as a continuous sequence of bytes in memory. 2. The C struct generated by capnpc-c which models the message's outer and inner structure + C functions generated by capnp-c to manage the content of the message 3. Our Fortran derived type (=struct) which resembles the outer structure of the message (= length) and carries type-bound procedures which call into the capnp-c-generated C code for accessing/managing the contents of the message Does that make sense? -- You received this message because you are subscribed to the Google Groups "Cap'n Proto" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/capnproto/603690f3-558d-450b-8f2e-a95f24c7f4dd%40googlegroups.com.
