zero_pool/macros.rs
1/// Define a task function with automatic parameter dereferencing
2///
3/// This macro creates a task function that safely dereferences the raw
4/// parameter pointer to the specified type, allowing safe access to fields.
5///
6/// # Examples
7/// ```rust
8/// use zero_pool::{zp_define_task_fn, zp_write};
9///
10/// // Define your task parameter struct
11/// struct ComputeTaskStruct { iterations: usize, result: *mut u64 }
12///
13/// zp_define_task_fn!(compute_task, ComputeTaskStruct, |params| {
14/// let mut sum = 0u64;
15/// for i in 0..params.iterations {
16/// sum = sum.wrapping_add(i as u64);
17/// }
18/// zp_write!(params.result, sum);
19/// });
20/// ```
21#[macro_export]
22macro_rules! zp_define_task_fn {
23 ($fn_name:ident, $param_type:ty, |$params:ident| $body:block) => {
24 fn $fn_name(raw_params: $crate::TaskParamPointer) {
25 let $params = unsafe { &*(raw_params as *const $param_type) };
26 $body
27 }
28 };
29}
30
31/// Write a result to a raw pointer (eliminates explicit unsafe blocks)
32///
33/// This macro wraps the unsafe pointer dereference, making task code cleaner.
34///
35/// # Examples
36/// ```rust
37/// use zero_pool::{zp_write, zp_define_task_fn};
38///
39/// struct MyTaskStruct { value: u64, result: *mut u64 }
40///
41/// zp_define_task_fn!(my_task, MyTaskStruct, |params| {
42/// let result = 42u64;
43/// zp_write!(params.result, result);
44/// });
45/// ```
46#[macro_export]
47macro_rules! zp_write {
48 ($result_ptr:expr, $value:expr) => {
49 unsafe {
50 *$result_ptr = $value;
51 }
52 };
53}
54
55/// Write a value to a specific index in a collection via raw pointer
56///
57/// This macro eliminates explicit unsafe blocks when writing to indexed collections.
58///
59/// # Examples
60/// ```rust
61/// use zero_pool::{zp_write_indexed, zp_define_task_fn};
62///
63/// struct BatchTaskStruct { index: usize, results: *mut Vec<u64> }
64///
65/// zp_define_task_fn!(batch_task, BatchTaskStruct, |params| {
66/// let sum = 42u64;
67/// zp_write_indexed!(params.results, params.index, sum);
68/// });
69/// ```
70#[macro_export]
71macro_rules! zp_write_indexed {
72 ($collection_ptr:expr, $index:expr, $value:expr) => {
73 unsafe {
74 (&mut (*$collection_ptr))[$index] = $value;
75 }
76 };
77}