use std::time::Instant;
use zipora::containers::{FixedStr8Vec, FixedStr16Vec, SortableStrVec, UintVector};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Specialized Containers Demo ===\n");
demonstrate_uint_vector()?;
demonstrate_fixed_len_str_vec()?;
demonstrate_sortable_str_vec()?;
Ok(())
}
fn demonstrate_uint_vector() -> Result<(), Box<dyn std::error::Error>> {
println!("ðĒ UintVector - Compressed Integer Storage");
println!("==========================================");
let mut vec = UintVector::new();
let start = Instant::now();
for i in 0..1000 {
vec.push(i)?;
}
let insert_time = start.elapsed();
let start = Instant::now();
let mut sum = 0u64;
for i in 0..1000 {
if let Some(value) = vec.get(i) {
sum += value as u64;
}
}
let retrieval_time = start.elapsed();
let (original_size, compressed_size, ratio) = vec.stats();
println!("â
Inserted 1000 integers in {:?}", insert_time);
println!("â
Retrieved all values in {:?}", retrieval_time);
println!("â
Sum verification: {}", sum);
println!("ð Original size: {} bytes", original_size);
println!("ð Compressed size: {} bytes", compressed_size);
println!("ð Compression ratio: {:.2}", ratio);
println!(
"ðū Memory efficiency: {:.1}% of original size\n",
ratio * 100.0
);
Ok(())
}
fn demonstrate_fixed_len_str_vec() -> Result<(), Box<dyn std::error::Error>> {
println!("ð FixedLenStrVec - Fixed-Length String Storage");
println!("===============================================");
let mut vec8: FixedStr8Vec = FixedStr8Vec::new();
let test_strings = vec![
"apple", "banana", "cherry", "date", "elderb", "fig", "grape",
];
let start = Instant::now();
for s in &test_strings {
vec8.push(s)?;
}
let insert_time = start.elapsed();
let start = Instant::now();
let found_banana = vec8.find_exact("banana");
let found_missing = vec8.find_exact("kiwi");
let search_time = start.elapsed();
let start = Instant::now();
let prefix_count = vec8.count_prefix("gr");
let prefix_time = start.elapsed();
let (vec_string_size, our_size, savings_ratio) = vec8.memory_savings_vs_vec_string();
println!(
"â
Inserted {} strings in {:?}",
test_strings.len(),
insert_time
);
println!(
"â
Found 'banana' at index: {:?} in {:?}",
found_banana, search_time
);
println!("â
'kiwi' not found: {:?}", found_missing);
println!(
"â
Strings with prefix 'gr': {} in {:?}",
prefix_count, prefix_time
);
println!("ð Vec<String> equivalent: {} bytes", vec_string_size);
println!("ð FixedLenStrVec size: {} bytes", our_size);
println!("ðū Memory savings: {:.1}%\n", savings_ratio * 100.0);
println!("ð FixedStr16Vec - Longer String Support");
println!("----------------------------------------");
let mut vec16: FixedStr16Vec = FixedStr16Vec::new();
let longer_strings = vec![
"programming",
"algorithms",
"data_structures",
"performance",
"optimization",
"benchmarking",
"profiling",
"memory_layout",
];
for s in &longer_strings {
vec16.push(s)?;
}
let prefix_opt = vec16.count_prefix("opt");
println!("â
Strings with prefix 'opt': {}", prefix_opt);
println!("â
Total strings stored: {}", vec16.len());
Ok(())
}
fn demonstrate_sortable_str_vec() -> Result<(), Box<dyn std::error::Error>> {
println!("ðĪ SortableStrVec - Specialized String Sorting");
println!("==============================================");
let mut vec = SortableStrVec::new();
let test_data = vec![
"zebra",
"apple",
"banana",
"cherry",
"date",
"elderberry",
"fig",
"grape",
"honeydew",
"kiwi",
"lemon",
"mango",
];
let start = Instant::now();
for s in &test_data {
vec.push_str(s)?;
}
let insert_time = start.elapsed();
println!(
"â
Inserted {} strings in {:?}",
test_data.len(),
insert_time
);
let start = Instant::now();
vec.sort_lexicographic()?;
let sort_time = start.elapsed();
println!("â
Lexicographic sort completed in {:?}", sort_time);
println!("ð Sorted order:");
for i in 0..vec.len().min(6) {
if let Some(s) = vec.get_sorted(i) {
println!(" {}. {}", i + 1, s);
}
}
let start = Instant::now();
let banana_pos = vec.binary_search("banana");
let missing_pos = vec.binary_search("pineapple");
let search_time = start.elapsed();
println!("â
Binary search completed in {:?}", search_time);
println!("ð 'banana' found at sorted position: {:?}", banana_pos);
println!("ð 'pineapple' not found: {:?}", missing_pos);
vec.sort_by_length()?;
println!("\nð Sorted by length:");
for i in 0..vec.len().min(6) {
if let Some(s) = vec.get_sorted(i) {
println!(" {} chars: {}", s.len(), s);
}
}
let (total_strings, utilization, last_sort_time, memory_ratio) = vec.stats();
println!("\nð Performance Statistics:");
println!(" Total strings: {}", total_strings);
println!(" Storage utilization: {:.1}%", utilization * 100.0);
println!(" Last sort time: {} Ξs", last_sort_time);
println!(" Memory efficiency: {:.1}%", memory_ratio * 100.0);
println!("\nðĪ Custom Sort - Case Insensitive:");
vec.sort_by(|a, b| a.to_lowercase().cmp(&b.to_lowercase()))?;
for i in 0..vec.len().min(6) {
if let Some(s) = vec.get_sorted(i) {
println!(" {}", s);
}
}
Ok(())
}