opencl_api/objects/
macros.rs

1/*
2 * macros.rs - helper macros for opencl api objects.
3 *
4 * Copyright 2020-2021 Naman Bishnoi
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19#![allow(dead_code)]
20
21#[macro_export]
22macro_rules! get_count {
23    // 0 parameters
24    ($fn: ident) => {{
25        let mut count = cl_uint::default();
26        let status_code = unsafe { $fn(0, ptr::null_mut(), &mut count) };
27        status_update(status_code, stringify!($fn), count)?
28    }};
29    //2 parameters
30    ($fn: ident, $param_1: ident, $param_2: ident) => {{
31        let mut count = cl_uint::default();
32        let status_code = unsafe { $fn($param_1, $param_2, 0, ptr::null_mut(), &mut count) };
33        status_update(status_code, stringify!($fn), count)?
34    }};
35    //3 parameters
36    ($fn: ident, $param_1: ident, $param_2: ident, $param_3: ident) => {{
37        let mut count = cl_uint::default();
38        let status_code =
39            unsafe { $fn($param_1, $param_2, $param_3, 0, ptr::null_mut(), &mut count) };
40        status_update(status_code, stringify!($fn), count)?
41    }};
42}
43
44#[macro_export]
45macro_rules! size_getter {
46    ($name:ident, $fn:ident) => {
47        let $name = |ret_dat_ptr: *mut libc::c_void, param_name: cl_uint| -> APIResult<size_t> {
48            let mut size: size_t = 0;
49            let status_code = unsafe {
50                $fn(
51                    ret_dat_ptr,
52                    param_name,
53                    0,
54                    ptr::null_mut(),
55                    &mut size as *mut size_t,
56                )
57            };
58            status_update(status_code, stringify!($fn), size)
59        };
60    };
61}
62
63#[macro_export]
64macro_rules! gen_param_value {
65    // return vector object
66    ($fn:ident, $typ:tt, $ptr: ident, $param_name: ident, $size: ident) => {{
67        if $size == 0 {
68            Vec::default()
69        } else {
70            let arr_len = $size / Size::$typ.get();
71            let mut param_value: Vec<$typ> = std::vec::from_elem($typ::default(), arr_len);
72            let status_code = unsafe {
73                $fn(
74                    $ptr,
75                    $param_name,
76                    $size,
77                    param_value.as_mut_ptr() as *mut c_void,
78                    ptr::null_mut(),
79                )
80            };
81            status_update(status_code, stringify!($fn), param_value)?
82        }
83    }};
84
85    // return single object
86    ($fn:ident, $typ:tt, $ptr: ident, $param_name: ident) => {{
87        let size = Size::$typ.get();
88        let mut param_value = $typ::default();
89        let status_code = unsafe {
90            $fn(
91                $ptr,
92                $param_name,
93                size,
94                crate::objects::functions::to_mut_ptr(&mut param_value) as *mut c_void,
95                ptr::null_mut(),
96            )
97        };
98        status_update(status_code, stringify!($fn), param_value)?
99    }};
100}
101
102#[macro_export]
103macro_rules! gen_object_list {
104    // 0 parameters
105    ($fn:ident, $typ:tt, $count: ident) => {{
106        let arr_len = $count as usize;
107        let mut all_objects: $typ = std::vec::from_elem(ptr::null_mut(), arr_len);
108        let status_code = unsafe { $fn($count, all_objects.as_mut_ptr(), ptr::null_mut()) };
109        status_update(status_code, stringify!($fn), all_objects)
110    }};
111
112    // 2 parameters
113    ($fn:ident, $typ:tt, $count: ident, $param_1: ident, $param_2: ident) => {{
114        let arr_len = $count as usize;
115        let mut all_objects: $typ = std::vec::from_elem(ptr::null_mut(), arr_len);
116        let status_code = unsafe {
117            $fn(
118                $param_1,
119                $param_2,
120                $count,
121                all_objects.as_mut_ptr(),
122                ptr::null_mut(),
123            )
124        };
125        status_update(status_code, stringify!($fn), all_objects)
126    }};
127
128    // 3 parameters (Non Null)
129    ($fn:ident, $typ:tt, $count: ident, $param_1: ident, $param_2: ident, $param_3: ident) => {{
130        let arr_len = $count as usize;
131        let mut all_objects: Vec<$typ> = std::vec::from_elem($typ::default(), arr_len);
132        let status_code = unsafe {
133            $fn(
134                $param_1,
135                $param_2,
136                $param_3,
137                $count,
138                all_objects.as_mut_ptr() as *mut $typ,
139                ptr::null_mut(),
140            )
141        };
142        status_update(status_code, stringify!($fn), all_objects)
143    }};
144}
145
146#[macro_export]
147macro_rules! gen_add_trait {
148    ($name:ident) => {
149        impl std::ops::Add for $name {
150            type Output = Self;
151            fn add(self, other: Self) -> Self::Output {
152                Self(self.0 | other.0)
153            }
154        }
155    };
156}