counter/
counter.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025.
4 *    3-Prism Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9//! # Atomic Counter Example
10//!
11//! Demonstrates using atomic integers as thread-safe counters.
12
13use prism3_atomic::AtomicI32;
14use std::sync::Arc;
15use std::thread;
16
17fn main() {
18    println!("=== Atomic Counter Example ===\n");
19
20    // Example 1: Basic counter operations
21    println!("1. Basic Counter Operations:");
22    let counter = AtomicI32::new(0);
23    println!("   Initial value: {}", counter.load());
24
25    counter.fetch_inc();
26    println!("   After increment: {}", counter.load());
27
28    counter.fetch_add(5);
29    println!("   After adding 5: {}", counter.load());
30
31    counter.fetch_dec();
32    println!("   After decrement: {}", counter.load());
33
34    // Example 2: Multi-threaded counter
35    println!("\n2. Multi-threaded Counter:");
36    let counter = Arc::new(AtomicI32::new(0));
37    let num_threads = 10;
38    let increments_per_thread = 1000;
39
40    let mut handles = vec![];
41    for i in 0..num_threads {
42        let counter = counter.clone();
43        let handle = thread::spawn(move || {
44            for _ in 0..increments_per_thread {
45                counter.fetch_inc();
46            }
47            println!("   Thread {} completed", i);
48        });
49        handles.push(handle);
50    }
51
52    for handle in handles {
53        handle.join().unwrap();
54    }
55
56    println!(
57        "   Final count: {} (expected: {})",
58        counter.load(),
59        num_threads * increments_per_thread
60    );
61
62    // Example 3: Compare-and-swap
63    println!("\n3. Compare-and-Swap:");
64    let counter = AtomicI32::new(10);
65    println!("   Initial value: {}", counter.load());
66
67    match counter.compare_set(10, 20) {
68        Ok(_) => println!("   CAS succeeded: value is now {}", counter.load()),
69        Err(actual) => println!("   CAS failed: actual value was {}", actual),
70    }
71
72    match counter.compare_set(10, 30) {
73        Ok(_) => println!("   CAS succeeded: value is now {}", counter.load()),
74        Err(actual) => println!("   CAS failed: actual value was {}", actual),
75    }
76
77    // Example 4: Functional updates
78    println!("\n4. Functional Updates:");
79    let counter = AtomicI32::new(5);
80    println!("   Initial value: {}", counter.load());
81
82    let old = counter.fetch_update(|x| x * 2);
83    println!("   After doubling - old: {}, new: {}", old, counter.load());
84
85    let new = counter.fetch_update(|x| x + 10);
86    println!("   After adding 10 - new: {}", new);
87
88    // Example 5: Accumulate operations
89    println!("\n5. Accumulate Operations:");
90    let counter = AtomicI32::new(1);
91    println!("   Initial value: {}", counter.load());
92
93    let old = counter.fetch_accumulate(2, |a, b| a * b);
94    println!(
95        "   After multiplying by 2 - old: {}, new: {}",
96        old,
97        counter.load()
98    );
99
100    let new = counter.fetch_accumulate(3, |a, b| a + b);
101    println!("   After adding 3 - new: {}", new);
102
103    println!("\n=== Example completed ===");
104}