@@ -40,7 +40,21 @@ macro_rules! impl_ranged_type_trait {
4040 }
4141 } ;
4242}
43+ macro_rules! impl_reverse_mapping_trait {
44+ ( $type: ty, $name: ident) => {
45+ impl ReversibleRanged for $name {
46+ fn unmap( & self , p: i32 , ( min, max) : ( i32 , i32 ) ) -> Option <$type> {
47+ if p < min. min( max) || p > max. max( min) || min == max {
48+ return None ;
49+ }
4350
51+ let logical_offset = f64 :: from( p - min) / f64 :: from( max - min) ;
52+
53+ return Some ( ( ( self . 1 - self . 0 ) as f64 * logical_offset + self . 0 as f64 ) as $type) ;
54+ }
55+ }
56+ } ;
57+ }
4458macro_rules! make_numeric_coord {
4559 ( $type: ty, $name: ident, $key_points: ident, $doc: expr) => {
4660 #[ doc = $doc]
@@ -78,18 +92,6 @@ macro_rules! make_numeric_coord {
7892 return self . 0 ..self . 1 ;
7993 }
8094 }
81-
82- impl ReversibleRanged for $name {
83- fn unmap( & self , p: i32 , ( min, max) : ( i32 , i32 ) ) -> Option <$type> {
84- if p < min. min( max) || p > max. max( min) {
85- return None ;
86- }
87-
88- let logical_offset = ( p - min) as f64 / ( max - min) as f64 ;
89-
90- return Some ( ( ( self . 1 - self . 0 ) as f64 * logical_offset + self . 0 as f64 ) as $type) ;
91- }
92- }
9395 } ;
9496}
9597
@@ -204,12 +206,14 @@ make_numeric_coord!(
204206 compute_f32_key_points,
205207 "The ranged coordinate for type f32"
206208) ;
209+ impl_reverse_mapping_trait ! ( f32 , RangedCoordf32 ) ;
207210make_numeric_coord ! (
208211 f64 ,
209212 RangedCoordf64 ,
210213 compute_f64_key_points,
211214 "The ranged coordinate for type f64"
212215) ;
216+ impl_reverse_mapping_trait ! ( f64 , RangedCoordf64 ) ;
213217make_numeric_coord ! (
214218 u32 ,
215219 RangedCoordu32 ,
0 commit comments