Hello,

I'm writing a small parser for a specific binary format. The format is parsed by way of a sequence of functions, each deserializing a small portion of the format into a D type such as int, double, string, etc., operating on a single InputRange. The problem is, if I pass a slice to each of these functions, the slice doesn't get mutated by the popFront function used in the functions, so something like this:

ubyte[] slice;
...
int a = readInt(slice);
double b = readDouble(slice);

Ends up failing, because readInt properly reads an int, but the slice is not mutated "outside" of itself, which means readDouble will not read from where readInt stopped, and instead read from the start of the slice, and failing because there is an int encoded there and not a double. Both functions' signatures are like this:

T readXXX(Range)(auto ref Range range) if (isInputRange!Range)

So my question is, is there a way to treat a slice strictly as an InputRange, so that it is mutated no matter what? Or is there another way to do what I'm trying to do?

I've worked around it using a "wrapper" InputRange struct, but I feel like there must be another way.

Thanks!

Reply via email to