fragments: getRangePtr() helper for memcpy-less access to fragments data

This commit is contained in:
Andrey Gusakov 2022-12-21 12:36:00 +03:00
parent 16a8e0b636
commit 663174265d
2 changed files with 26 additions and 0 deletions

View File

@ -49,3 +49,6 @@ struct FragmentList {
// copy `size` of fragmented outputs in to destination, skipping the first `skip` bytes
void copyRange(uint8_t* destination, FragmentList src, size_t skip, size_t size);
// returns pointer to actual data and size of contiguous data
// if data is located in more than one fragmnet - returned value will be size available in first fragment
size_t getRangePtr(uint8_t **ptr, FragmentList src, size_t offset, size_t size);

View File

@ -42,3 +42,26 @@ void copyRange(uint8_t* destination, FragmentList src, size_t skip, size_t size)
fragmentIndex++;
}
}
size_t getRangePtr(uint8_t **ptr, FragmentList src, size_t offset, size_t size)
{
size_t fragmentIndex = 0;
// Find which fragment to start - skip any full fragments smaller than `skip` parameter
while (fragmentIndex < src.count && offset >= src.fragments[fragmentIndex].size) {
offset -= src.fragments[fragmentIndex].size;
fragmentIndex++;
}
if (fragmentIndex >= src.count) {
// out of range
*ptr = NULL;
return size;
}
if (src.fragments[fragmentIndex].get() != NULL)
*ptr = (uint8_t *)src.fragments[fragmentIndex].get() + offset;
else
*ptr = NULL;
return minI(size, src.fragments[fragmentIndex].size - offset);
}