zero_pool/
macros.rs

1// Create a task parameter struct with automatic constructor
2//
3// - Example
4// use zero_pool::zp_task_params;
5//
6// zp_task_params! {
7//     MyTask {
8//         input: u64,
9//         iterations: usize,
10//         result: *mut u64,  // Just another field
11//     }
12// }
13//
14// - Usage:
15// let mut result = 0u64;
16// let task = MyTask::new(42, 1000, &mut result);
17#[macro_export]
18macro_rules! zp_task_params {
19    ($struct_name:ident { $($field:ident: $field_type:ty),* $(,)? }) => {
20        pub struct $struct_name {
21            $(pub $field: $field_type,)*
22        }
23
24        impl $struct_name {
25            pub fn new($($field: $field_type),*) -> Self {
26                Self {
27                    $($field,)*
28                }
29            }
30        }
31    };
32}
33
34// Define a task function with automatic unsafe handling
35//
36// - Example
37// use zero_pool::{zp_define_task_fn, zp_task_params};
38//
39// zp_task_params! {
40//     ComputeTask {
41//         iterations: usize,
42//         multiplier: u64,
43//         result: *mut u64,
44//     }
45// }
46//
47// zp_define_task_fn!(compute_task, ComputeTask, |params| {
48//     // Safe code here - params is automatically dereferenced
49//     let mut sum = 0u64;
50//     for i in 0..params.iterations {
51//         sum = sum.wrapping_add(i as u64 * params.multiplier);
52//     }
53//     unsafe { *params.result = sum; }
54// });
55#[macro_export]
56macro_rules! zp_define_task_fn {
57    ($fn_name:ident, $param_type:ty, |$params:ident| $body:block) => {
58        fn $fn_name(raw_params: $crate::TaskParamPointer) {
59            let $params = unsafe { &*(raw_params as *const $param_type) };
60            $body
61        }
62    };
63}
64
65// Write a result to a raw pointer safely
66//
67// - Example
68// use zero_pool::zp_write_result;
69//
70// zp_define_task_fn!(my_task, MyTask, |params| {
71//     let result = 42u64;
72//     zp_write_result!(params.result, result);
73// });
74#[macro_export]
75macro_rules! zp_write {
76    ($result_ptr:expr, $value:expr) => {
77        unsafe {
78            *$result_ptr = $value;
79        }
80    };
81}
82
83// Write a value to a specific index in a Vec or array via raw pointer
84//
85// - Example
86// use zero_pool::zp_write_indexed;
87//
88// zp_task_params! {
89//     BatchTask {
90//         index: usize,
91//         results: *mut Vec<u64>,
92//     }
93// }
94//
95// zp_define_task_fn!(batch_task, BatchTask, |params| {
96//     let sum = 42u64;
97//     zp_write_indexed!(params.results, params.index, sum);
98// });
99#[macro_export]
100macro_rules! zp_write_indexed {
101    ($collection_ptr:expr, $index:expr, $value:expr) => {
102        unsafe {
103            (&mut (*$collection_ptr))[$index] = $value;
104        }
105    };
106}
107
108// Submit a batch of mixed tasks with type safety
109#[macro_export]
110macro_rules! zp_submit_batch_mixed {
111    ($pool:expr, [$( ($params:expr, $task_fn:ident) ),* $(,)?]) => {{
112        let tasks: Vec<$crate::WorkItem> = vec![
113            $(
114                ($task_fn as $crate::TaskFnPointer, $params as *const _ as $crate::TaskParamPointer)
115            ),*
116        ];
117
118        $pool.submit_raw_task_batch(&tasks)
119    }};
120}
121
122// Convert a vector of (task_fn, params) tuples to Vec<(TaskFnPointer, TaskParamPointer)>
123// Works with mixed parameter types
124#[macro_export]
125macro_rules! zp_mixed_tasks_to_pointers {
126    ($tasks_vec:expr) => {{
127        $tasks_vec
128            .iter()
129            .map(|(task_fn, params)| {
130                (
131                    *task_fn as $crate::TaskFnPointer,
132                    params as *const _ as $crate::TaskParamPointer,
133                )
134            })
135            .collect::<Vec<$crate::WorkItem>>()
136    }};
137}