fragments: getRangePtr() helper for memcpy-less access to fragments data
This commit is contained in:
parent
16a8e0b636
commit
663174265d
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue