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