use scirs2_fft::{
fft, fft_context, get_backend_name, get_global_cache, get_workers, with_backend,
with_fft_settings, with_workers, without_cache,
};
use std::time::Instant;
#[allow(dead_code)]
fn main() {
println!("FFT Context Managers Example");
println!("===========================");
println!();
let signal: Vec<f64> = (0..1024).map(|i| (i as f64).sin()).collect();
println!("Default settings:");
println!(" Backend: {}", get_backend_name());
println!(" Workers: {}", get_workers());
println!(" Cache enabled: {}", get_global_cache().is_enabled());
println!();
println!("Test 1: Without cache");
let _result1 = without_cache(|| {
println!(
" Cache enabled inside context: {}",
get_global_cache().is_enabled()
);
let start = Instant::now();
let spectrum = fft(&signal, None).expect("Operation failed");
let duration1 = start.elapsed();
let start = Instant::now();
let _ = fft(&signal, None).expect("Operation failed");
let duration2 = start.elapsed();
println!(" First FFT: {duration1:?}");
println!(" Second FFT: {duration2:?} (no caching)");
spectrum
})
.expect("Operation failed");
println!(
" Cache enabled after context: {}",
get_global_cache().is_enabled()
);
println!();
println!("Test 2: With specific backend");
let _result2 = with_backend("rustfft", || {
println!(" Backend inside context: {}", get_backend_name());
fft(&signal, None).expect("Operation failed")
})
.expect("Operation failed");
println!(" Backend after context: {}", get_backend_name());
println!();
println!("Test 3: With specific workers");
let _result3 = with_workers(2, || {
println!(" Would use 2 workers if fully implemented");
fft(&signal, None)
})
.expect("Operation failed");
println!();
println!("Test 4: Combined settings");
let _result4 = with_fft_settings(
fft_context()
.backend("rustfft")
.workers(4)
.cache_enabled(false),
|| {
println!(" Backend: {}", get_backend_name());
println!(" Cache enabled: {}", get_global_cache().is_enabled());
let start = Instant::now();
let spectrum = fft(&signal, None).expect("Operation failed");
let duration = start.elapsed();
println!(" FFT duration: {duration:?}");
spectrum
},
)
.expect("Operation failed");
println!(" Settings restored after context");
println!(" Backend: {}", get_backend_name());
println!(" Cache enabled: {}", get_global_cache().is_enabled());
println!();
println!("Test 5: Nested contexts");
with_backend("rustfft", || {
println!(" Outer context - Backend: {}", get_backend_name());
without_cache(|| {
println!(" Inner context - Backend: {}", get_backend_name());
println!(
" Inner context - Cache: {}",
get_global_cache().is_enabled()
);
})
.expect("Operation failed");
println!(
" Back to outer context - Cache: {}",
get_global_cache().is_enabled()
);
})
.expect("Operation failed");
println!();
println!("Test 6: FFT functionality check");
let original_spectrum = fft(&signal, None).expect("Operation failed");
let context_spectrum =
without_cache(|| fft(&signal, None).expect("Operation failed")).expect("Operation failed");
let results_match = original_spectrum
.iter()
.zip(context_spectrum.iter())
.all(|(a, b)| (a.re - b.re).abs() < 1e-10 && (a.im - b.im).abs() < 1e-10);
println!(" Results match: {results_match}");
let stats = get_global_cache().get_stats();
println!("\nCache statistics:");
println!("{stats}");
}