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