-
Notifications
You must be signed in to change notification settings - Fork 56
Description
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:
/**
* Constructs new Kaitai Stream object, wrapping a given std::istream.
* \param io istream object to use for this Kaitai Stream
*/
kstream(std::istream* io);
It uses the actual std::istream*
passed in, which means that we kind of need to keep an std::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...