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}