@@ -8,6 +8,8 @@ use anyhow::Result;
8
8
use bytes:: { Buf , BufMut } ;
9
9
use std:: any:: Any ;
10
10
use std:: fmt;
11
+ use std:: future:: Future ;
12
+ use std:: pin:: Pin ;
11
13
12
14
/// PacketBitmap shouldn't be used like a normal integral,
13
15
/// so it's type is masked here. Access it with PacketList().
@@ -23,6 +25,9 @@ pub struct NackPair {
23
25
pub lost_packets : PacketBitmap ,
24
26
}
25
27
28
+ pub type RangeFn =
29
+ Box < dyn ( Fn ( u16 ) -> Pin < Box < dyn Future < Output = bool > + Send + ' static > > ) + Send + Sync > ;
30
+
26
31
impl NackPair {
27
32
/// PacketList returns a list of Nack'd packets that's referenced by a NackPair
28
33
pub fn packet_list ( & self ) -> Vec < u16 > {
@@ -40,6 +45,25 @@ impl NackPair {
40
45
}
41
46
out
42
47
}
48
+
49
+ pub async fn range ( & self , f : RangeFn ) {
50
+ if !f ( self . packet_id ) . await {
51
+ return ;
52
+ }
53
+
54
+ let mut b = self . lost_packets ;
55
+ let mut i = 0u16 ;
56
+ while b != 0 {
57
+ if ( b & ( 1 << i) ) != 0 {
58
+ b &= u16:: MAX ^ ( 1 << i) ;
59
+ let ( packet_id, _) = self . packet_id . overflowing_add ( i + 1 ) ;
60
+ if !f ( packet_id) . await {
61
+ return ;
62
+ }
63
+ }
64
+ i += 1 ;
65
+ }
66
+ }
43
67
}
44
68
45
69
const TLN_LENGTH : usize = 2 ;
@@ -189,7 +213,7 @@ impl Unmarshal for TransportLayerNack {
189
213
}
190
214
}
191
215
192
- fn nack_pairs_from_sequence_numbers ( seq_nos : & [ u16 ] ) -> Vec < NackPair > {
216
+ pub fn nack_pairs_from_sequence_numbers ( seq_nos : & [ u16 ] ) -> Vec < NackPair > {
193
217
if seq_nos. is_empty ( ) {
194
218
return vec ! [ ] ;
195
219
}
0 commit comments