| 536 | } |
| 537 | |
| 538 | fn decode_delta_varints(bytes: &[u8]) -> crate::Result<Vec<i64>> { |
| 539 | let mut values = Vec::new(); |
| 540 | let mut cursor = 0usize; |
| 541 | let mut previous = 0_i64; |
| 542 | |
| 543 | while cursor < bytes.len() { |
| 544 | let (delta, consumed) = decode_varint(&bytes[cursor..])?; |
| 545 | cursor += consumed; |
| 546 | |
| 547 | let value = if values.is_empty() { |
| 548 | delta |
| 549 | } else { |
| 550 | previous |
| 551 | .checked_add(delta) |
| 552 | .ok_or_else(|| Error::DataInvalid { |
| 553 | message: format!( |
| 554 | "Blob delta-varint index overflow after previous value {previous}" |
| 555 | ), |
| 556 | source: None, |
| 557 | })? |
| 558 | }; |
| 559 | values.push(value); |
| 560 | previous = value; |
| 561 | } |
| 562 | |
| 563 | Ok(values) |
| 564 | } |
| 565 | |
| 566 | fn decode_varint(bytes: &[u8]) -> crate::Result<(i64, usize)> { |
| 567 | let mut value = 0_u64; |