@@ -48,23 +48,24 @@ pub trait TimeValue: Eq + Sized {
48
48
49
49
( f64:: from ( limit. 1 - limit. 0 ) * value_days / total_days) as i32 + limit. 0
50
50
}
51
-
51
+
52
52
/// Map pixel to coord spec
53
53
fn unmap_coord ( point : i32 , begin : & Self , end : & Self , limit : ( i32 , i32 ) ) -> Self {
54
54
let total_span = end. subtract ( begin) ;
55
55
let offset = ( point - limit. 0 ) as i64 ;
56
-
56
+
57
57
// Check if nanoseconds fit in i64
58
58
if let Some ( total_ns) = total_span. num_nanoseconds ( ) {
59
- if i64:: MAX /total_ns < offset. abs ( ) {
60
- let nano_seconds = offset* total_ns/( ( limit. 1 -limit. 0 ) as i64 ) ;
59
+ let factor = total_ns / ( ( limit. 1 - limit. 0 ) as i64 ) ;
60
+ if i64:: MAX / factor > offset. abs ( ) {
61
+ let nano_seconds = offset * factor;
61
62
return begin. add ( & Duration :: nanoseconds ( nano_seconds) ) ;
62
63
}
63
64
}
64
-
65
+
65
66
// Otherwise, use days
66
67
let total_days = total_span. num_days ( ) as f64 ;
67
- let days = ( ( ( offset as f64 ) * total_days) / ( ( limit. 1 - limit. 0 ) as f64 ) ) as i64 ;
68
+ let days = ( ( ( offset as f64 ) * total_days) / ( ( limit. 1 - limit. 0 ) as f64 ) ) as i64 ;
68
69
begin. add ( & Duration :: days ( days) )
69
70
}
70
71
}
@@ -1214,47 +1215,47 @@ mod test {
1214
1215
assert_eq ! ( coord1. index_of( & coord1. from_index( i) . unwrap( ) ) . unwrap( ) , i) ;
1215
1216
}
1216
1217
}
1217
-
1218
+
1218
1219
#[ test]
1219
1220
fn test_datetime_with_unmap ( ) {
1220
1221
let start_time = Utc . ymd ( 2021 , 1 , 1 ) . and_hms ( 8 , 0 , 0 ) ;
1221
- let end_time = Utc . ymd ( 2023 , 1 , 1 , ) . and_hms ( 8 , 0 , 0 ) ;
1222
+ let end_time = Utc . ymd ( 2023 , 1 , 1 ) . and_hms ( 8 , 0 , 0 ) ;
1222
1223
let mid = Utc . ymd ( 2022 , 1 , 1 ) . and_hms ( 8 , 0 , 0 ) ;
1223
1224
let coord: RangedDate < chrono:: DateTime < _ > > = ( start_time..end_time) . into ( ) ;
1224
1225
let pos = coord. map ( & mid, ( 1000 , 2000 ) ) ;
1225
1226
assert_eq ! ( pos, 1500 ) ;
1226
1227
let value = coord. unmap ( pos, ( 1000 , 2000 ) ) ;
1227
1228
assert_eq ! ( value, Some ( mid) ) ;
1228
1229
}
1229
-
1230
+
1230
1231
#[ test]
1231
1232
fn test_naivedatetime_with_unmap ( ) {
1232
1233
let start_time = chrono:: NaiveDate :: from_ymd ( 2021 , 1 , 1 ) . and_hms_milli ( 8 , 0 , 0 , 0 ) ;
1233
- let end_time = chrono:: NaiveDate :: from_ymd ( 2023 , 1 , 1 , ) . and_hms_milli ( 8 , 0 , 0 , 0 ) ;
1234
+ let end_time = chrono:: NaiveDate :: from_ymd ( 2023 , 1 , 1 ) . and_hms_milli ( 8 , 0 , 0 , 0 ) ;
1234
1235
let mid = chrono:: NaiveDate :: from_ymd ( 2022 , 1 , 1 ) . and_hms_milli ( 8 , 0 , 0 , 0 ) ;
1235
1236
let coord: RangedDate < chrono:: NaiveDateTime > = ( start_time..end_time) . into ( ) ;
1236
1237
let pos = coord. map ( & mid, ( 1000 , 2000 ) ) ;
1237
1238
assert_eq ! ( pos, 1500 ) ;
1238
1239
let value = coord. unmap ( pos, ( 1000 , 2000 ) ) ;
1239
1240
assert_eq ! ( value, Some ( mid) ) ;
1240
1241
}
1241
-
1242
+
1242
1243
#[ test]
1243
1244
fn test_date_with_unmap ( ) {
1244
1245
let start_date = Utc . ymd ( 2021 , 1 , 1 ) ;
1245
- let end_date= Utc . ymd ( 2023 , 1 , 1 , ) ;
1246
+ let end_date = Utc . ymd ( 2023 , 1 , 1 ) ;
1246
1247
let mid = Utc . ymd ( 2022 , 1 , 1 ) ;
1247
1248
let coord: RangedDate < chrono:: Date < _ > > = ( start_date..end_date) . into ( ) ;
1248
1249
let pos = coord. map ( & mid, ( 1000 , 2000 ) ) ;
1249
1250
assert_eq ! ( pos, 1500 ) ;
1250
1251
let value = coord. unmap ( pos, ( 1000 , 2000 ) ) ;
1251
1252
assert_eq ! ( value, Some ( mid) ) ;
1252
1253
}
1253
-
1254
+
1254
1255
#[ test]
1255
1256
fn test_naivedate_with_unmap ( ) {
1256
1257
let start_date = chrono:: NaiveDate :: from_ymd ( 2021 , 1 , 1 ) ;
1257
- let end_date= chrono:: NaiveDate :: from_ymd ( 2023 , 1 , 1 , ) ;
1258
+ let end_date = chrono:: NaiveDate :: from_ymd ( 2023 , 1 , 1 ) ;
1258
1259
let mid = chrono:: NaiveDate :: from_ymd ( 2022 , 1 , 1 ) ;
1259
1260
let coord: RangedDate < chrono:: NaiveDate > = ( start_date..end_date) . into ( ) ;
1260
1261
let pos = coord. map ( & mid, ( 1000 , 2000 ) ) ;
0 commit comments