Write a non-compact Decimal (precision > 18) as big-endian two's complement bytes (8-byte aligned).
(&mut self, pos: usize, unscaled: i128)
| 508 | |
| 509 | /// Write a non-compact Decimal (precision > 18) as big-endian two's complement bytes (8-byte aligned). |
| 510 | pub fn write_decimal_var_len(&mut self, pos: usize, unscaled: i128) { |
| 511 | let be_bytes = unscaled.to_be_bytes(); |
| 512 | let mut start = 0; |
| 513 | while start < 15 { |
| 514 | let b = be_bytes[start]; |
| 515 | let next = be_bytes[start + 1]; |
| 516 | if (b == 0x00 && next & 0x80 == 0) || (b == 0xFF && next & 0x80 != 0) { |
| 517 | start += 1; |
| 518 | } else { |
| 519 | break; |
| 520 | } |
| 521 | } |
| 522 | let minimal = &be_bytes[start..]; |
| 523 | |
| 524 | let var_offset = self.data.len(); |
| 525 | self.data.extend_from_slice(minimal); |
| 526 | let padding = (8 - (minimal.len() % 8)) % 8; |
| 527 | self.data.extend(std::iter::repeat_n(0u8, padding)); |
| 528 | let len = minimal.len(); |
| 529 | let encoded = ((var_offset as u64) << 32) | (len as u64); |
| 530 | let offset = self.field_offset(pos); |
| 531 | self.data[offset..offset + 8].copy_from_slice(&encoded.to_le_bytes()); |
| 532 | } |
| 533 | |
| 534 | /// Write a compact Timestamp (precision <= 3) as epoch millis. |
| 535 | pub fn write_timestamp_compact(&mut self, pos: usize, epoch_millis: i64) { |
no test coverage detected