Skip to main content

predicate_set_name_demo/
predicate_set_name_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10
11//! Demonstrates the set_name and new_with_name methods of Predicate
12
13use qubit_function::{
14    ArcPredicate,
15    BoxPredicate,
16    Predicate,
17    RcPredicate,
18};
19
20fn main() {
21    println!("=== Predicate Naming Functionality Demo ===\n");
22
23    demo_box_predicate();
24    demo_rc_predicate();
25    demo_arc_predicate();
26}
27
28/// Demonstrates the naming functionality of BoxPredicate
29fn demo_box_predicate() {
30    println!("1. BoxPredicate Naming Functionality");
31
32    // Create a predicate with name using new_with_name
33    let pred1 = BoxPredicate::new_with_name("is_positive", |x: &i32| *x > 0);
34    println!("   Created with new_with_name:");
35    println!("     Name: {:?}", pred1.name());
36    println!("     Test 5: {}", pred1.test(&5));
37
38    // Set name for an existing predicate using set_name
39    let mut pred2 = BoxPredicate::new(|x: &i32| x % 2 == 0);
40    println!("\n   Created with new then set_name:");
41    println!("     Initial name: {:?}", pred2.name());
42    pred2.set_name("is_even");
43    println!("     Name after setting: {:?}", pred2.name());
44    println!("     Test 4: {}", pred2.test(&4));
45
46    // Combined predicates automatically generate new names
47    let pred3 = BoxPredicate::new_with_name("positive", |x: &i32| *x > 0);
48    let pred4 = BoxPredicate::new_with_name("even", |x: &i32| x % 2 == 0);
49    let combined = pred3.and(pred4);
50    println!("\n   Combined predicate name:");
51    println!("     Auto-generated name: {:?}", combined.name());
52    println!("     Test 4: {}\n", combined.test(&4));
53}
54
55/// Demonstrates the naming functionality of RcPredicate
56fn demo_rc_predicate() {
57    println!("2. RcPredicate Naming Functionality");
58
59    // Using new_with_name
60    let pred1 = RcPredicate::new_with_name("greater_than_10", |x: &i32| *x > 10);
61    println!("   Using new_with_name:");
62    println!("     Name: {:?}", pred1.name());
63    println!("     Test 15: {}", pred1.test(&15));
64
65    // Using set_name
66    let mut pred2 = RcPredicate::new(|x: &i32| *x < 100);
67    println!("\n   Using set_name:");
68    println!("     Initial name: {:?}", pred2.name());
69    pred2.set_name("less_than_100");
70    println!("     Name after setting: {:?}", pred2.name());
71    println!("     Test 50: {}", pred2.test(&50));
72
73    // Name is preserved after cloning
74    let pred3 = pred2.clone();
75    println!("\n   Name preserved after cloning:");
76    println!("     Cloned name: {:?}", pred3.name());
77    println!("     Test 80: {}\n", pred3.test(&80));
78}
79
80/// Demonstrates the naming functionality of ArcPredicate
81fn demo_arc_predicate() {
82    println!("3. ArcPredicate Naming Functionality (Thread-Safe)");
83
84    // Using new_with_name
85    let pred1 = ArcPredicate::new_with_name("is_uppercase", |s: &String| {
86        s.chars().all(|c| c.is_uppercase() || !c.is_alphabetic())
87    });
88    println!("   Using new_with_name:");
89    println!("     Name: {:?}", pred1.name());
90    println!("     Test 'HELLO': {}", pred1.test(&"HELLO".to_string()));
91
92    // Using set_name
93    let mut pred2 = ArcPredicate::new(|s: &String| s.len() > 5);
94    println!("\n   Using set_name:");
95    println!("     Initial name: {:?}", pred2.name());
96    pred2.set_name("longer_than_5");
97    println!("     Name after setting: {:?}", pred2.name());
98    println!(
99        "     Test 'Hello World': {}",
100        pred2.test(&"Hello World".to_string())
101    );
102
103    // Name is preserved when sharing between threads
104    let pred3 = pred2.clone();
105    let handle = std::thread::spawn(move || {
106        let name = pred3.name().map(str::to_string);
107        let result = pred3.test(&"Threading".to_string());
108        (name, result)
109    });
110
111    let (name, result) = handle.join().unwrap();
112    println!("\n   Accessing from thread:");
113    println!("     Name in thread: {:?}", name);
114    println!("     Test 'Threading' in thread: {}", result);
115
116    // Original predicate is still available
117    println!("\n   Original predicate still available:");
118    println!("     Original name: {:?}", pred2.name());
119    println!("     Test 'Rust': {}\n", pred2.test(&"Rust".to_string()));
120}