use std::io::{self, Read, Write};
#[inline]
pub fn read_u16_sword_chirho(data_chirho: &[u8]) -> u16 {
debug_assert!(data_chirho.len() >= 2);
u16::from_le_bytes([data_chirho[0], data_chirho[1]])
}
#[inline]
pub fn read_i16_sword_chirho(data_chirho: &[u8]) -> i16 {
debug_assert!(data_chirho.len() >= 2);
i16::from_le_bytes([data_chirho[0], data_chirho[1]])
}
#[inline]
pub fn read_u32_sword_chirho(data_chirho: &[u8]) -> u32 {
debug_assert!(data_chirho.len() >= 4);
u32::from_le_bytes([data_chirho[0], data_chirho[1], data_chirho[2], data_chirho[3]])
}
#[inline]
pub fn read_i32_sword_chirho(data_chirho: &[u8]) -> i32 {
debug_assert!(data_chirho.len() >= 4);
i32::from_le_bytes([data_chirho[0], data_chirho[1], data_chirho[2], data_chirho[3]])
}
#[inline]
pub fn read_u64_sword_chirho(data_chirho: &[u8]) -> u64 {
debug_assert!(data_chirho.len() >= 8);
u64::from_le_bytes([
data_chirho[0], data_chirho[1], data_chirho[2], data_chirho[3],
data_chirho[4], data_chirho[5], data_chirho[6], data_chirho[7],
])
}
#[inline]
pub fn read_i64_sword_chirho(data_chirho: &[u8]) -> i64 {
debug_assert!(data_chirho.len() >= 8);
i64::from_le_bytes([
data_chirho[0], data_chirho[1], data_chirho[2], data_chirho[3],
data_chirho[4], data_chirho[5], data_chirho[6], data_chirho[7],
])
}
#[inline]
pub fn write_u16_sword_chirho(value_chirho: u16) -> [u8; 2] {
value_chirho.to_le_bytes()
}
#[inline]
pub fn write_i16_sword_chirho(value_chirho: i16) -> [u8; 2] {
value_chirho.to_le_bytes()
}
#[inline]
pub fn write_u32_sword_chirho(value_chirho: u32) -> [u8; 4] {
value_chirho.to_le_bytes()
}
#[inline]
pub fn write_i32_sword_chirho(value_chirho: i32) -> [u8; 4] {
value_chirho.to_le_bytes()
}
#[inline]
pub fn write_u64_sword_chirho(value_chirho: u64) -> [u8; 8] {
value_chirho.to_le_bytes()
}
#[inline]
pub fn write_i64_sword_chirho(value_chirho: i64) -> [u8; 8] {
value_chirho.to_le_bytes()
}
pub trait ReadSwordChirho: Read {
fn read_u16_sword_chirho(&mut self) -> io::Result<u16> {
let mut buf_chirho = [0u8; 2];
self.read_exact(&mut buf_chirho)?;
Ok(read_u16_sword_chirho(&buf_chirho))
}
fn read_i16_sword_chirho(&mut self) -> io::Result<i16> {
let mut buf_chirho = [0u8; 2];
self.read_exact(&mut buf_chirho)?;
Ok(read_i16_sword_chirho(&buf_chirho))
}
fn read_u32_sword_chirho(&mut self) -> io::Result<u32> {
let mut buf_chirho = [0u8; 4];
self.read_exact(&mut buf_chirho)?;
Ok(read_u32_sword_chirho(&buf_chirho))
}
fn read_i32_sword_chirho(&mut self) -> io::Result<i32> {
let mut buf_chirho = [0u8; 4];
self.read_exact(&mut buf_chirho)?;
Ok(read_i32_sword_chirho(&buf_chirho))
}
fn read_u64_sword_chirho(&mut self) -> io::Result<u64> {
let mut buf_chirho = [0u8; 8];
self.read_exact(&mut buf_chirho)?;
Ok(read_u64_sword_chirho(&buf_chirho))
}
fn read_i64_sword_chirho(&mut self) -> io::Result<i64> {
let mut buf_chirho = [0u8; 8];
self.read_exact(&mut buf_chirho)?;
Ok(read_i64_sword_chirho(&buf_chirho))
}
}
impl<R: Read + ?Sized> ReadSwordChirho for R {}
pub trait WriteSwordChirho: Write {
fn write_u16_sword_chirho(&mut self, value_chirho: u16) -> io::Result<()> {
self.write_all(&write_u16_sword_chirho(value_chirho))
}
fn write_i16_sword_chirho(&mut self, value_chirho: i16) -> io::Result<()> {
self.write_all(&write_i16_sword_chirho(value_chirho))
}
fn write_u32_sword_chirho(&mut self, value_chirho: u32) -> io::Result<()> {
self.write_all(&write_u32_sword_chirho(value_chirho))
}
fn write_i32_sword_chirho(&mut self, value_chirho: i32) -> io::Result<()> {
self.write_all(&write_i32_sword_chirho(value_chirho))
}
fn write_u64_sword_chirho(&mut self, value_chirho: u64) -> io::Result<()> {
self.write_all(&write_u64_sword_chirho(value_chirho))
}
fn write_i64_sword_chirho(&mut self, value_chirho: i64) -> io::Result<()> {
self.write_all(&write_i64_sword_chirho(value_chirho))
}
}
impl<W: Write + ?Sized> WriteSwordChirho for W {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RawVerseIndexChirho {
pub offset_chirho: u32,
pub size_chirho: u16,
}
impl RawVerseIndexChirho {
pub const SIZE_CHIRHO: usize = 6;
pub fn from_bytes_chirho(data_chirho: &[u8]) -> Self {
debug_assert!(data_chirho.len() >= Self::SIZE_CHIRHO);
Self {
offset_chirho: read_u32_sword_chirho(&data_chirho[0..4]),
size_chirho: read_u16_sword_chirho(&data_chirho[4..6]),
}
}
pub fn to_bytes_chirho(&self) -> [u8; 6] {
let mut buf_chirho = [0u8; 6];
buf_chirho[0..4].copy_from_slice(&write_u32_sword_chirho(self.offset_chirho));
buf_chirho[4..6].copy_from_slice(&write_u16_sword_chirho(self.size_chirho));
buf_chirho
}
pub fn is_empty_chirho(&self) -> bool {
self.size_chirho == 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RawVerse4IndexChirho {
pub offset_chirho: u32,
pub size_chirho: u32,
}
impl RawVerse4IndexChirho {
pub const SIZE_CHIRHO: usize = 8;
pub fn from_bytes_chirho(data_chirho: &[u8]) -> Self {
debug_assert!(data_chirho.len() >= Self::SIZE_CHIRHO);
Self {
offset_chirho: read_u32_sword_chirho(&data_chirho[0..4]),
size_chirho: read_u32_sword_chirho(&data_chirho[4..8]),
}
}
pub fn to_bytes_chirho(&self) -> [u8; 8] {
let mut buf_chirho = [0u8; 8];
buf_chirho[0..4].copy_from_slice(&write_u32_sword_chirho(self.offset_chirho));
buf_chirho[4..8].copy_from_slice(&write_u32_sword_chirho(self.size_chirho));
buf_chirho
}
pub fn is_empty_chirho(&self) -> bool {
self.size_chirho == 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ZVerseIndexChirho {
pub block_num_chirho: u32,
pub offset_in_block_chirho: u32,
pub size_chirho: u16,
}
impl ZVerseIndexChirho {
pub const SIZE_CHIRHO: usize = 10;
pub fn from_bytes_chirho(data_chirho: &[u8]) -> Self {
debug_assert!(data_chirho.len() >= Self::SIZE_CHIRHO);
Self {
block_num_chirho: read_u32_sword_chirho(&data_chirho[0..4]),
offset_in_block_chirho: read_u32_sword_chirho(&data_chirho[4..8]),
size_chirho: read_u16_sword_chirho(&data_chirho[8..10]),
}
}
pub fn to_bytes_chirho(&self) -> [u8; 10] {
let mut buf_chirho = [0u8; 10];
buf_chirho[0..4].copy_from_slice(&write_u32_sword_chirho(self.block_num_chirho));
buf_chirho[4..8].copy_from_slice(&write_u32_sword_chirho(self.offset_in_block_chirho));
buf_chirho[8..10].copy_from_slice(&write_u16_sword_chirho(self.size_chirho));
buf_chirho
}
pub fn is_empty_chirho(&self) -> bool {
self.size_chirho == 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ZBlockIndexChirho {
pub comp_offset_chirho: u32,
pub comp_size_chirho: u32,
pub uncomp_size_chirho: u32,
}
impl ZBlockIndexChirho {
pub const SIZE_CHIRHO: usize = 12;
pub fn from_bytes_chirho(data_chirho: &[u8]) -> Self {
debug_assert!(data_chirho.len() >= Self::SIZE_CHIRHO);
Self {
comp_offset_chirho: read_u32_sword_chirho(&data_chirho[0..4]),
comp_size_chirho: read_u32_sword_chirho(&data_chirho[4..8]),
uncomp_size_chirho: read_u32_sword_chirho(&data_chirho[8..12]),
}
}
pub fn to_bytes_chirho(&self) -> [u8; 12] {
let mut buf_chirho = [0u8; 12];
buf_chirho[0..4].copy_from_slice(&write_u32_sword_chirho(self.comp_offset_chirho));
buf_chirho[4..8].copy_from_slice(&write_u32_sword_chirho(self.comp_size_chirho));
buf_chirho[8..12].copy_from_slice(&write_u32_sword_chirho(self.uncomp_size_chirho));
buf_chirho
}
pub fn is_empty_chirho(&self) -> bool {
self.comp_size_chirho == 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ZVerse4IndexChirho {
pub block_num_chirho: u32,
pub offset_in_block_chirho: u32,
pub size_chirho: u32,
}
impl ZVerse4IndexChirho {
pub const SIZE_CHIRHO: usize = 12;
pub fn from_bytes_chirho(data_chirho: &[u8]) -> Self {
debug_assert!(data_chirho.len() >= Self::SIZE_CHIRHO);
Self {
block_num_chirho: read_u32_sword_chirho(&data_chirho[0..4]),
offset_in_block_chirho: read_u32_sword_chirho(&data_chirho[4..8]),
size_chirho: read_u32_sword_chirho(&data_chirho[8..12]),
}
}
pub fn to_bytes_chirho(&self) -> [u8; 12] {
let mut buf_chirho = [0u8; 12];
buf_chirho[0..4].copy_from_slice(&write_u32_sword_chirho(self.block_num_chirho));
buf_chirho[4..8].copy_from_slice(&write_u32_sword_chirho(self.offset_in_block_chirho));
buf_chirho[8..12].copy_from_slice(&write_u32_sword_chirho(self.size_chirho));
buf_chirho
}
pub fn is_empty_chirho(&self) -> bool {
self.size_chirho == 0
}
}
#[cfg(test)]
mod tests_chirho {
use super::*;
use std::io::Cursor;
#[test]
fn test_u16_roundtrip_chirho() {
let value_chirho = 0x1234u16;
let bytes_chirho = write_u16_sword_chirho(value_chirho);
assert_eq!(bytes_chirho, [0x34, 0x12]); assert_eq!(read_u16_sword_chirho(&bytes_chirho), value_chirho);
}
#[test]
fn test_u32_roundtrip_chirho() {
let value_chirho = 0x12345678u32;
let bytes_chirho = write_u32_sword_chirho(value_chirho);
assert_eq!(bytes_chirho, [0x78, 0x56, 0x34, 0x12]); assert_eq!(read_u32_sword_chirho(&bytes_chirho), value_chirho);
}
#[test]
fn test_i32_roundtrip_chirho() {
let value_chirho = -12345i32;
let bytes_chirho = write_i32_sword_chirho(value_chirho);
assert_eq!(read_i32_sword_chirho(&bytes_chirho), value_chirho);
}
#[test]
fn test_raw_verse_index_chirho() {
let index_chirho = RawVerseIndexChirho {
offset_chirho: 0x1000,
size_chirho: 0x0100,
};
let bytes_chirho = index_chirho.to_bytes_chirho();
assert_eq!(bytes_chirho.len(), RawVerseIndexChirho::SIZE_CHIRHO);
let parsed_chirho = RawVerseIndexChirho::from_bytes_chirho(&bytes_chirho);
assert_eq!(parsed_chirho, index_chirho);
}
#[test]
fn test_raw_verse4_index_chirho() {
let index_chirho = RawVerse4IndexChirho {
offset_chirho: 0x10000000,
size_chirho: 0x00010000,
};
let bytes_chirho = index_chirho.to_bytes_chirho();
assert_eq!(bytes_chirho.len(), RawVerse4IndexChirho::SIZE_CHIRHO);
let parsed_chirho = RawVerse4IndexChirho::from_bytes_chirho(&bytes_chirho);
assert_eq!(parsed_chirho, index_chirho);
}
#[test]
fn test_z_verse_index_chirho() {
let index_chirho = ZVerseIndexChirho {
block_num_chirho: 42,
offset_in_block_chirho: 1024,
size_chirho: 256,
};
let bytes_chirho = index_chirho.to_bytes_chirho();
assert_eq!(bytes_chirho.len(), ZVerseIndexChirho::SIZE_CHIRHO);
let parsed_chirho = ZVerseIndexChirho::from_bytes_chirho(&bytes_chirho);
assert_eq!(parsed_chirho, index_chirho);
}
#[test]
fn test_z_block_index_chirho() {
let index_chirho = ZBlockIndexChirho {
comp_offset_chirho: 0x1000,
comp_size_chirho: 0x0200,
uncomp_size_chirho: 0x0800,
};
let bytes_chirho = index_chirho.to_bytes_chirho();
assert_eq!(bytes_chirho.len(), ZBlockIndexChirho::SIZE_CHIRHO);
let parsed_chirho = ZBlockIndexChirho::from_bytes_chirho(&bytes_chirho);
assert_eq!(parsed_chirho, index_chirho);
}
#[test]
fn test_reader_extension_chirho() {
let data_chirho = vec![0x34, 0x12, 0x78, 0x56, 0x34, 0x12];
let mut cursor_chirho = Cursor::new(data_chirho);
assert_eq!(cursor_chirho.read_u16_sword_chirho().unwrap(), 0x1234);
assert_eq!(cursor_chirho.read_u32_sword_chirho().unwrap(), 0x12345678);
}
#[test]
fn test_writer_extension_chirho() {
let mut buf_chirho = Vec::new();
buf_chirho.write_u16_sword_chirho(0x1234).unwrap();
buf_chirho.write_u32_sword_chirho(0x12345678).unwrap();
assert_eq!(buf_chirho, vec![0x34, 0x12, 0x78, 0x56, 0x34, 0x12]);
}
}