extern crate tiny_varint;
use tiny_varint::{
bytes_of, values_from,
VarIntEncoder,
encode_zigzag
};
fn main() {
println!("=== Iterator-based API Example ===\n");
println!("1. Encoding a single value using VarIntBytesIter iterator:");
let value = 16384u64;
println!(" Encoding value: {}", value);
println!(" Expected bytes: {}", tiny_varint::varint_size(value));
print!(" Encoded bytes: [ ");
for byte in bytes_of(value) {
print!("{:#04x} ", byte);
}
println!("]");
let mut manual_buf = [0u8; 10];
let manual_size = tiny_varint::encode(value, &mut manual_buf).unwrap();
print!(" Verification bytes: [ ");
for i in 0..manual_size {
print!("{:#04x} ", manual_buf[i]);
}
println!("]\n");
println!("2. Decoding using VarIntValuesIter iterator:");
let values = [0u64, 1, 127, 128, 16383, 16384, 2097151];
let mut buffer = [0u8; 100];
let mut encoder = VarIntEncoder::new(&mut buffer);
let bytes_written = encoder.write_batch(&values).unwrap();
print!(" Encoded bytes: [ ");
for i in 0..bytes_written {
print!("{:#04x} ", buffer[i]);
}
println!("]");
println!(" Decoded values:");
for result in values_from::<u64>(&buffer[..bytes_written]) {
match result {
Ok(value) => println!(" - {}", value),
Err(e) => println!(" - Error: {:?}", e),
}
}
println!("\n3. Processing zigzag-encoded signed values:");
let signed_values = [-100i32, -50, -10, -1, 0, 1, 10, 50, 100];
println!(" Original values: {:?}", signed_values);
for &value in &signed_values {
let mut buf = [0u8; 10];
let size = encode_zigzag(value, &mut buf).unwrap();
print!(" ZigZag encoding for {}: [ ", value);
for i in 0..size {
print!("{:#04x} ", buf[i]);
}
println!("]");
}
println!("\n4. Combining iterators with encoders/decoders in stream processing:");
println!(" Data processing pipeline:");
println!(" 1. Generate raw data");
println!(" 2. Encode using iterator-based methods");
println!(" 3. Process encoded bytes");
println!(" 4. Decode using iterator-based methods");
let source_data = [42u64, 314, 2718, 31415];
println!("\n Raw data: {:?}", source_data);
let mut encoded_bytes = Vec::new();
for &value in &source_data {
let encoder = bytes_of(value);
println!(" Encoding {} -> {} bytes", value, encoder.size());
for byte in encoder {
encoded_bytes.push(byte);
}
}
print!(" All encoded bytes: [ ");
for byte in &encoded_bytes {
print!("{:#04x} ", byte);
}
println!("]");
println!("\n Decoding results:");
let decoder = values_from::<u64>(&encoded_bytes);
let mut i = 0;
for result in decoder {
match result {
Ok(value) => {
println!(" Original: {}, Decoded: {}", source_data[i], value);
i += 1;
}
Err(e) => println!(" Error: {:?}", e),
}
}
println!("\n=== Example Complete ===");
}