pub struct BoxTester { /* private fields */ }Expand description
Single ownership Tester implemented using Box
BoxTester wraps a closure in Box<dyn Fn() -> bool>, providing single
ownership semantics with no additional allocation overhead beyond the
initial boxing.
§Characteristics
- Single ownership: Cannot be cloned
- Zero overhead: Single heap allocation
- Consuming combination:
and()/or()/not()consumeself - Type flexibility: Accepts any
Testerimplementation
§Use Cases
- One-time testing scenarios
- Builder patterns requiring ownership transfer
- Simple state checking without sharing
- Chained calls with ownership transfer
§Examples
use prism3_function::{BoxTester, Tester};
use std::sync::{Arc, atomic::{AtomicUsize, Ordering}};
// State managed externally
let count = Arc::new(AtomicUsize::new(0));
let count_clone = Arc::clone(&count);
let tester = BoxTester::new(move || {
count_clone.load(Ordering::Relaxed) < 3
});
assert!(tester.test());
count.fetch_add(1, Ordering::Relaxed);
assert!(tester.test());
count.fetch_add(1, Ordering::Relaxed);
assert!(tester.test());
count.fetch_add(1, Ordering::Relaxed);
assert!(!tester.test());
// Logical combination
let combined = BoxTester::new(|| true)
.and(|| false)
.or(|| true);
assert!(combined.test());§Author
Hu Haixing
Implementations§
Source§impl BoxTester
impl BoxTester
Sourcepub fn and<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
pub fn and<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
Combines this tester with another tester using logical AND
Returns a new BoxTester that returns true only when both tests
pass. Short-circuit evaluation: if the first test fails, the second
will not be executed.
§Type Parameters
T- Type implementingTester
§Parameters
next- The tester to combine with
§Return Value
A new BoxTester representing logical AND
§Examples
use prism3_function::{BoxTester, Tester};
use std::sync::{Arc, atomic::{AtomicUsize, AtomicBool, Ordering}};
// 模拟服务状态
let request_count = Arc::new(AtomicUsize::new(0));
let is_available = Arc::new(AtomicBool::new(true));
let max_requests = 1000;
let count_clone = Arc::clone(&request_count);
let available_clone = Arc::clone(&is_available);
// 服务可用且请求数未超限
let service_ok = BoxTester::new(move || {
available_clone.load(Ordering::Relaxed)
})
.and(move || {
count_clone.load(Ordering::Relaxed) < max_requests
});
// 初始状态:可用且请求数为0
assert!(service_ok.test());
// 模拟请求增加
request_count.store(500, Ordering::Relaxed);
assert!(service_ok.test());
// 请求数超限
request_count.store(1500, Ordering::Relaxed);
assert!(!service_ok.test());
// 服务不可用
is_available.store(false, Ordering::Relaxed);
assert!(!service_ok.test());Sourcepub fn or<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
pub fn or<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
Combines this tester with another tester using logical OR
Returns a new BoxTester that returns true if either test passes.
Short-circuit evaluation: if the first test passes, the second will
not be executed.
§Type Parameters
T- Type implementingTester
§Parameters
next- The tester to combine with
§Return Value
A new BoxTester representing logical OR
§Examples
use prism3_function::{BoxTester, Tester};
use std::sync::{Arc, atomic::{AtomicUsize, AtomicBool, Ordering}};
// 模拟服务状态
let request_count = Arc::new(AtomicUsize::new(0));
let is_healthy = Arc::new(AtomicBool::new(true));
let max_requests = 100;
let count_clone = Arc::clone(&request_count);
let health_clone = Arc::clone(&is_healthy);
// 服务健康或请求数较少
let can_serve = BoxTester::new(move || {
health_clone.load(Ordering::Relaxed)
})
.or(move || {
count_clone.load(Ordering::Relaxed) < max_requests
});
// 初始状态:健康且请求数为0
assert!(can_serve.test());
// 请求数增加但仍在限制内
request_count.store(50, Ordering::Relaxed);
assert!(can_serve.test());
// 请求数超限但服务健康
request_count.store(150, Ordering::Relaxed);
assert!(can_serve.test()); // 仍然健康
// 服务不健康但请求数少
is_healthy.store(false, Ordering::Relaxed);
request_count.store(50, Ordering::Relaxed);
assert!(can_serve.test()); // 请求数少
// 既不健康又请求数多
request_count.store(150, Ordering::Relaxed);
assert!(!can_serve.test());Sourcepub fn not(self) -> BoxTester
pub fn not(self) -> BoxTester
Negates the result of this tester
Returns a new BoxTester that returns the opposite value of the
original test result.
§Return Value
A new BoxTester representing logical NOT
§Examples
use prism3_function::{BoxTester, Tester};
use std::sync::{Arc, atomic::{AtomicUsize, Ordering}};
// 模拟资源使用情况
let memory_usage = Arc::new(AtomicUsize::new(0));
let max_memory = 1024; // MB
let memory_clone = Arc::clone(&memory_usage);
// 内存使用是否超限
let memory_ok = BoxTester::new(move || {
memory_clone.load(Ordering::Relaxed) <= max_memory
});
// 初始状态:内存使用正常
memory_usage.store(512, Ordering::Relaxed);
assert!(memory_ok.test());
// 内存使用是否超限(取反)
let memory_critical = memory_ok.not();
assert!(!memory_critical.test());
// 内存使用超限
memory_usage.store(2048, Ordering::Relaxed);
assert!(memory_critical.test());Sourcepub fn nand<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
pub fn nand<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
Combines this tester with another tester using logical NAND
Returns a new BoxTester that returns true unless both tests pass.
Equivalent to !(self AND other).
§Type Parameters
T- Type implementingTester
§Parameters
next- The tester to combine with
§Return Value
A new BoxTester representing logical NAND
§Examples
use prism3_function::{BoxTester, Tester};
use std::sync::{Arc, atomic::{AtomicBool, Ordering}};
let flag1 = Arc::new(AtomicBool::new(true));
let flag2 = Arc::new(AtomicBool::new(true));
let flag1_clone = Arc::clone(&flag1);
let flag2_clone = Arc::clone(&flag2);
let nand = BoxTester::new(move || {
flag1_clone.load(Ordering::Relaxed)
})
.nand(move || {
flag2_clone.load(Ordering::Relaxed)
});
// 两个都为 true 时返回 false
assert!(!nand.test());
// 至少一个为 false 时返回 true
flag1.store(false, Ordering::Relaxed);
assert!(nand.test());Sourcepub fn xor<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
pub fn xor<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
Combines this tester with another tester using logical XOR
Returns a new BoxTester that returns true if exactly one test
passes.
§Type Parameters
T- Type implementingTester
§Parameters
next- The tester to combine with
§Return Value
A new BoxTester representing logical XOR
§Examples
use prism3_function::{BoxTester, Tester};
use std::sync::{Arc, atomic::{AtomicBool, Ordering}};
let flag1 = Arc::new(AtomicBool::new(true));
let flag2 = Arc::new(AtomicBool::new(false));
let flag1_clone1 = Arc::clone(&flag1);
let flag2_clone1 = Arc::clone(&flag2);
let xor = BoxTester::new(move || {
flag1_clone1.load(Ordering::Relaxed)
})
.xor(move || {
flag2_clone1.load(Ordering::Relaxed)
});
// 一个 true 一个 false 时返回 true
assert!(xor.test());
// 两个都为 true 时返回 false
flag2.store(true, Ordering::Relaxed);
assert!(!xor.test());
// 两个都为 false 时返回 false
flag1.store(false, Ordering::Relaxed);
flag2.store(false, Ordering::Relaxed);
assert!(!xor.test());Sourcepub fn nor<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
pub fn nor<T>(self, next: T) -> BoxTesterwhere
T: Tester + 'static,
Combines this tester with another tester using logical NOR
Returns a new BoxTester that returns true only when both tests
fail. Equivalent to !(self OR other).
§Type Parameters
T- Type implementingTester
§Parameters
next- The tester to combine with
§Return Value
A new BoxTester representing logical NOR
§Examples
use prism3_function::{BoxTester, Tester};
use std::sync::{Arc, atomic::{AtomicBool, Ordering}};
let flag1 = Arc::new(AtomicBool::new(false));
let flag2 = Arc::new(AtomicBool::new(false));
let flag1_clone = Arc::clone(&flag1);
let flag2_clone = Arc::clone(&flag2);
let nor = BoxTester::new(move || {
flag1_clone.load(Ordering::Relaxed)
})
.nor(move || {
flag2_clone.load(Ordering::Relaxed)
});
// 两个都为 false 时返回 true
assert!(nor.test());
// 至少一个为 true 时返回 false
flag1.store(true, Ordering::Relaxed);
assert!(!nor.test());