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