xref: /aosp_15_r20/external/crosvm/rutabaga_gfx/src/macros.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2021 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker //! Macros for rutabaga_gfx.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
8*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! checked_range {
9*bb4ee6a4SAndroid Build Coastguard Worker     ($x:expr; <= $y:expr) => {
10*bb4ee6a4SAndroid Build Coastguard Worker         if $x <= $y {
11*bb4ee6a4SAndroid Build Coastguard Worker             Ok(())
12*bb4ee6a4SAndroid Build Coastguard Worker         } else {
13*bb4ee6a4SAndroid Build Coastguard Worker             Err(RutabagaError::CheckedRange {
14*bb4ee6a4SAndroid Build Coastguard Worker                 field1: (stringify!($x), $x as usize),
15*bb4ee6a4SAndroid Build Coastguard Worker                 field2: (stringify!($y), $y as usize),
16*bb4ee6a4SAndroid Build Coastguard Worker             })
17*bb4ee6a4SAndroid Build Coastguard Worker         }
18*bb4ee6a4SAndroid Build Coastguard Worker     };
19*bb4ee6a4SAndroid Build Coastguard Worker     ($x:ident <= $y:ident) => {
20*bb4ee6a4SAndroid Build Coastguard Worker         check_range!($x; <= $y)
21*bb4ee6a4SAndroid Build Coastguard Worker     };
22*bb4ee6a4SAndroid Build Coastguard Worker }
23*bb4ee6a4SAndroid Build Coastguard Worker 
24*bb4ee6a4SAndroid Build Coastguard Worker #[macro_export]
25*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! checked_arithmetic {
26*bb4ee6a4SAndroid Build Coastguard Worker     ($x:ident $op:ident $y:ident $op_name:expr) => {
27*bb4ee6a4SAndroid Build Coastguard Worker         $x.$op($y).ok_or_else(|| RutabagaError::CheckedArithmetic {
28*bb4ee6a4SAndroid Build Coastguard Worker             field1: (stringify!($x), $x as usize),
29*bb4ee6a4SAndroid Build Coastguard Worker             field2: (stringify!($y), $y as usize),
30*bb4ee6a4SAndroid Build Coastguard Worker             op: $op_name,
31*bb4ee6a4SAndroid Build Coastguard Worker         })
32*bb4ee6a4SAndroid Build Coastguard Worker     };
33*bb4ee6a4SAndroid Build Coastguard Worker     ($x:ident + $y:ident) => {
34*bb4ee6a4SAndroid Build Coastguard Worker         checked_arithmetic!($x checked_add $y "+")
35*bb4ee6a4SAndroid Build Coastguard Worker     };
36*bb4ee6a4SAndroid Build Coastguard Worker     ($x:ident - $y:ident) => {
37*bb4ee6a4SAndroid Build Coastguard Worker         checked_arithmetic!($x checked_sub $y "-")
38*bb4ee6a4SAndroid Build Coastguard Worker     };
39*bb4ee6a4SAndroid Build Coastguard Worker     ($x:ident * $y:ident) => {
40*bb4ee6a4SAndroid Build Coastguard Worker         checked_arithmetic!($x checked_mul $y "*")
41*bb4ee6a4SAndroid Build Coastguard Worker     };
42*bb4ee6a4SAndroid Build Coastguard Worker     ($x:ident / $y:ident) => {
43*bb4ee6a4SAndroid Build Coastguard Worker         checked_arithmetic!($x checked_div $y "/")
44*bb4ee6a4SAndroid Build Coastguard Worker     };
45*bb4ee6a4SAndroid Build Coastguard Worker }
46