add nbt::from_slice
and zero copy support for strings
#63
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This pr adds
nbt::from_slice
to enable zero copy deserialization for strings. The implementation is inspired byserde_json
which uses a trait to abstract over multiple sources.All of the
read_*
functions inraw.rs
got moved into a trait. This trait is implemented forstd::io::Read
and&[u8]
.The
read_bare_string
function was modified to also take a scratch buffer and return a borrowed, copied or owned string. In a lot of cases this enables reading a string without allocating. This is useful beyond zero copy as it's also used for identifiers in structs. This optimization is not used forValue
andBlob
as they always allocate anyways.Even though zero support is added
Cow<'de, str>
has to be used because modified utf-8 does always allow zero copy.Example:
I had some trouble getting reliable results from the benchmarks, but there usually were only small regressions of up to 5% and improvements of up to 10-20%. (The benchmarks were not modified, I suspect all the speed up was from prevent allocations for identifiers in structs). I got varying but mostly positive results in my personal project for parsing anvil chunks with zero copy.