@@ -107,6 +107,55 @@ mod gps_data_codec {
107107 Ok ( output)
108108 }
109109
110+ #[ pyfunction]
111+ fn extract_encoded_interval ( input : String , from_ts : i64 , end_ts : i64 ) -> PyResult < ( String , usize ) > {
112+ let encoded = input. as_bytes ( ) ;
113+ let mut encodedi = encoded. iter ( ) ;
114+ let encoded_length: u32 = encoded. len ( ) as u32 ;
115+ let mut bytes_consumed: u32 = 0 ;
116+ let mut timestamp: i64 = YEAR2010 ;
117+ let mut latitude: i64 = 0 ;
118+ let mut longitude: i64 = 0 ;
119+ let mut start_found = false ;
120+ let mut prev_idx: u32 = 0 ;
121+ let mut output: Vec < u8 > = vec ! [ ] ;
122+ let mut nb_pts = 0 ;
123+ while bytes_consumed < encoded_length {
124+ if bytes_consumed == 0 {
125+ let decoding_result = decode_signed_value_from_string ( & mut encodedi) ;
126+ bytes_consumed += decoding_result. offset ;
127+ timestamp += decoding_result. value ;
128+ } else {
129+ let decoding_result = decode_unsigned_value_from_string ( & mut encodedi) ;
130+ bytes_consumed += decoding_result. offset ;
131+ timestamp += decoding_result. value ;
132+ }
133+
134+ let lat_decoding_result = decode_signed_value_from_string ( & mut encodedi) ;
135+ bytes_consumed += lat_decoding_result. offset ;
136+ let lng_decoding_result = decode_signed_value_from_string ( & mut encodedi) ;
137+ bytes_consumed += lng_decoding_result. offset ;
138+
139+ if !start_found {
140+ latitude += lat_decoding_result. value ;
141+ longitude += lng_decoding_result. value ;
142+ if timestamp >= from_ts && end_ts >= timestamp {
143+ start_found = true ;
144+ encode_signed_number ( & mut output, timestamp - YEAR2010 ) ;
145+ encode_signed_number ( & mut output, latitude) ;
146+ encode_signed_number ( & mut output, longitude) ;
147+ prev_idx = bytes_consumed;
148+ nb_pts += 1 ;
149+ }
150+
151+ } else if end_ts >= timestamp {
152+ output. append ( & mut encoded[ prev_idx as usize ..bytes_consumed as usize ] . to_vec ( ) ) ;
153+ prev_idx = bytes_consumed;
154+ nb_pts += 1 ;
155+ }
156+ }
157+ Ok ( ( unsafe { String :: from_utf8_unchecked ( output) } , nb_pts) )
158+ }
110159 #[ pyfunction]
111160 fn encode ( data : Vec < ( i64 , f64 , f64 ) > ) -> PyResult < String > {
112161 let mut prev_timestamp: i64 = YEAR2010 ;
0 commit comments