-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Design for serialization API #29
Comments
In general, I believe the consensus was around that we'll have two modes of code generation: "read-only" (i.e. only for parsing, as it is) and "read-write" (i.e. for both parsing + serialization, so it's natural that it will work on iostream, not istream). This distinction implies that:
|
Thanks for responding.
Hmm, OK. So then maybe something like:
Because |
Seems to be a good compromise. I'm not sure that maintaining compatibility with |
I see that this is getting quite old but I still check it every few months because I want this to be a thing. I see in the pull request that code generation in the compiler is still a concern. Is there a list of things that need to be finished or hasn't been worked on? I wouldn't mind trying to fill in some gaps. |
Hey. I'm working on trying to add basic write functionality to the runtime, in preparation for hopefully eventually contributing to the serialization issue.
Unfortunately, it seems like this is actually pretty tough to do without breaking changes.
Right now the C++ API has a constructor like this:
It uses the actual
std::istream*
passed in, which means that we kind of need to keep anstd::istream*
to remain fully semantically compatible.I think there's basically four approaches:
Take the
streambuf
from the incomingstd::istream*
and pass it to anstd::iostream
. This would enable you to do the same for an incomingstd::ostream*
. In theory I think this does most of what you want, but it almost certainly will behave differently since the passed in stream is not touched directly. In addition, there are severalconst
member functions that call non-const
methods onm_io
, so if you makem_io
anstd::iostream
(not a pointer) it must be markedmutable
to maintain the same API (or const-casted everywhere, etc.)Store the incoming
std::istream*
as bothstd::ios*
andstd::istream*
, and have an additional pointer forstd::ostream*
. On input streams, thestd::ostream*
would be NULL and on output streams, thestd::istream*
would be NULL. This sucks because we need additional checks in order to prevent segfaults, since now any read/write call may hit a null pointer if kstream was created on the wrong type of iostream.Make a new class for output streams, perhaps
kaitai::kostream
. Perhaps have a base class for some of the shared functionality. Although this solution is not terrible, becausekaitai::kstream
exists today, it would likely always have to exist or at least be aliased to something likekaitai::kistream
.Break the API and only take in a
streambuf*
or something similarly more generic. Is this even an option?I don't think input and output streams have a ton of overlap, so maybe this is not a huge issue; but it does seem like this requires some thought...
The text was updated successfully, but these errors were encountered: