Is there an alternative to ReadOnlyMemory<T> that allows access to its index into the underlying storage? (ReadOnlyMemory<T>._index is private).
I have a tokenizer that has sliced up a ReadOnlyMemory<char> source into tokens. Each token also has a ReadOnlyMemory<char> to represent a slice of the source. This works well, but I have a parser using the tokenizer that needs to create new slices of the original source that cross multiple tokens (e.g. from the start of one token to the end of a later token).
My workaround is for the tokens to reference a Range instead of a ReadOnlyMemory<char>, but this makes the tokenizer more complex for other clients and makes debugging the tokenizer harder. I'm considering creating my own alternative to ReadOnlyMemory<T> for this scenario, but there are several aspects that make it non-trivial.
ReadOnlyMemory<T>already exposes the internals via the variousMemoryMarshal.TryGet*APIs. You need to handle 3 different scenarios separately:TryGetArray)<char>,TryGetString)TryGetMemoryManager)One of those should report
true, for any valid memory chunk.However: if these tokens cross different memory chunks, what you might want is
ReadOnlySequence<T>, which generalizes discontiguous buffers; this is basically either a singleReadOnlyMemory<T>(or similar), or a linked-list chain where each element holds aReadOnlyMemory<T>. You need to build the chain yourself (in the multiple-segment case), but: that's trivial.Also note that most code that works with
ReadOnlySequence<T>should checkIsSingleSegment, and optimize for the single-span case - since this is so frequent, and is usually much more efficient to work with.