use avila_parallel::prelude::*;
use avila_parallel::adaptive::{AdaptiveExecutor, speculative_execute, cache_aware_map};
use avila_parallel::memory::{parallel_transform_inplace, parallel_fold_efficient, parallel_iter_nocopy};
fn main() {
println!("=== Avila-Parallel v0.4.0 - Advanced Features Demo ===\n");
demo_lockfree();
demo_adaptive();
demo_memory_efficient();
}
fn demo_lockfree() {
println!("1. LOCK-FREE OPERATIONS (Zero Contention)");
println!(" Using only atomics, no mutexes\n");
let data: Vec<i32> = (1..=1_000_000).collect();
let count = lockfree_count(&data, |x| x % 2 == 0);
println!(" Even numbers (lock-free): {}", count);
let has_large = lockfree_any(&data, |x| x > &999_000);
println!(" Has number > 999000: {}", has_large);
let all_positive = lockfree_all(&data, |x| x > &0);
println!(" All positive: {}", all_positive);
println!(" ✓ Zero locks used!\n");
}
fn demo_adaptive() {
println!("2. ADAPTIVE EXECUTION (Self-Optimizing)");
println!(" Learns optimal parameters automatically\n");
let data: Vec<i32> = (1..=10_000).collect();
let executor = AdaptiveExecutor::new();
println!(" First run (learning)...");
let result1 = executor.adaptive_map(&data, |x| x * 2);
println!(" Result length: {}", result1.len());
println!(" Second run (optimized with learned params)...");
let result2 = executor.adaptive_map(&data, |x| x * 2);
println!(" Result length: {}", result2.len());
let small_data = vec![1, 2, 3, 4, 5];
let result = speculative_execute(&small_data, |x| x * x);
println!(" Speculative result (auto-chose): {:?}", result);
let cache_result: Vec<i32> = cache_aware_map(&data[..100], |x| x * 3);
println!(" Cache-aware transform (first 10): {:?}", &cache_result[..10]);
println!(" ✓ Self-optimization active!\n");
}
fn demo_memory_efficient() {
println!("3. MEMORY-EFFICIENT OPERATIONS (Zero Allocation)");
println!(" In-place transforms and minimal copying\n");
let mut data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
println!(" Before in-place: {:?}", data);
parallel_transform_inplace(&mut data, |x| *x *= 2);
println!(" After in-place: {:?}", data);
println!(" ✓ Zero allocations!");
let sum = parallel_fold_efficient(
&data,
|| 0, |acc, x| acc + x, |a, b| a + b );
println!(" Efficient fold sum: {}", sum);
println!(" Zero-copy iteration (no clones):");
parallel_iter_nocopy(&data, |_x| {
});
println!(" ✓ No data copied during iteration!");
println!(" ✓ Memory pressure minimized!\n");
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_v4_features() {
let data = vec![1, 2, 3, 4, 5];
assert_eq!(lockfree_count(&data, |x| x > &2), 3);
let mut exec = AdaptiveExecutor::new();
let result = exec.adaptive_map(&data, |x| x * 2);
assert_eq!(result.len(), 5);
let mut data_mut = data.clone();
parallel_transform_inplace(&mut data_mut, |x| *x *= 2);
assert_eq!(data_mut, vec![2, 4, 6, 8, 10]);
}
}