1
+ use std:: collections:: HashMap ;
1
2
use std:: vec;
2
3
3
4
use flatbuffers:: WIPOffset ;
@@ -189,9 +190,11 @@ impl<'a> FlatNetworkFilter<'a> {
189
190
index : u32 ,
190
191
owner : & ' a FlatNetworkFilterList ,
191
192
) -> Self {
193
+ let list_address: * const FlatNetworkFilterList = owner as * const FlatNetworkFilterList ;
194
+
192
195
Self {
193
196
fb_filter : filter,
194
- key : index as u64 ,
197
+ key : index as u64 | ( ( ( list_address ) as u64 ) << 32 ) ,
195
198
mask : unsafe { NetworkFilterMask :: from_bits_unchecked ( filter. mask ( ) ) } ,
196
199
owner : owner,
197
200
}
@@ -206,6 +209,46 @@ impl<'a> FlatNetworkFilter<'a> {
206
209
pub fn modifier_option ( & self ) -> Option < String > {
207
210
self . fb_filter . modifier_option ( ) . map ( |o| o. to_string ( ) )
208
211
}
212
+
213
+ #[ inline( always) ]
214
+ pub fn include_domains ( & self ) -> Option < & [ u16 ] > {
215
+ self . fb_filter . opt_domains ( ) . map ( |data| {
216
+ let bytes = data. bytes ( ) ;
217
+ unsafe {
218
+ std:: slice:: from_raw_parts (
219
+ bytes. as_ptr ( ) as * const u16 ,
220
+ bytes. len ( ) / std:: mem:: size_of :: < u16 > ( ) ,
221
+ )
222
+ }
223
+ } )
224
+ }
225
+
226
+ #[ inline( always) ]
227
+ pub fn exclude_domains ( & self ) -> Option < & [ u16 ] > {
228
+ self . fb_filter . opt_not_domains ( ) . map ( |data| {
229
+ let bytes = data. bytes ( ) ;
230
+ unsafe {
231
+ std:: slice:: from_raw_parts (
232
+ bytes. as_ptr ( ) as * const u16 ,
233
+ bytes. len ( ) / std:: mem:: size_of :: < u16 > ( ) ,
234
+ )
235
+ }
236
+ } )
237
+ }
238
+
239
+ #[ inline( always) ]
240
+ pub fn hostname ( & self ) -> Option < & ' a str > {
241
+ if self . mask . is_hostname_anchor ( ) {
242
+ self . fb_filter . hostname ( )
243
+ } else {
244
+ None
245
+ }
246
+ }
247
+
248
+ #[ inline( always) ]
249
+ pub fn patterns ( & self ) -> FlatPatterns {
250
+ FlatPatterns :: new ( self . fb_filter . patterns ( ) )
251
+ }
209
252
}
210
253
211
254
impl < ' a > NetworkFilterMaskHelper for FlatNetworkFilter < ' a > {
@@ -224,28 +267,24 @@ impl<'a> NetworkMatchable for FlatNetworkFilter<'a> {
224
267
if !check_options ( self . mask , request) {
225
268
return false ;
226
269
}
227
- let opt_not_domains = get_u16_slice_from_flatvector ( self . fb_filter . opt_domains ( ) ) ;
228
270
if !check_included_domains_mapped (
229
- opt_not_domains ,
271
+ self . include_domains ( ) ,
230
272
request,
231
273
& self . owner . domain_hashes_mapping ,
232
274
) {
233
275
return false ;
234
276
}
235
- let opt_domains = get_u16_slice_from_flatvector ( self . fb_filter . opt_not_domains ( ) ) ;
236
- if !check_excluded_domains_mapped ( opt_domains, request, & self . owner . domain_hashes_mapping ) {
277
+ if !check_excluded_domains_mapped (
278
+ self . exclude_domains ( ) ,
279
+ request,
280
+ & self . owner . domain_hashes_mapping ,
281
+ ) {
237
282
return false ;
238
283
}
239
- let patterns = FlatPatterns :: new ( self . fb_filter . patterns ( ) ) ;
240
- let hostname = if self . is_hostname_anchor ( ) {
241
- self . fb_filter . hostname ( )
242
- } else {
243
- None
244
- } ;
245
284
check_pattern (
246
285
self . mask ,
247
- patterns. iter ( ) ,
248
- hostname,
286
+ self . patterns ( ) . iter ( ) ,
287
+ self . hostname ( ) ,
249
288
self . key ,
250
289
request,
251
290
regex_manager,
@@ -257,16 +296,3 @@ impl<'a> NetworkMatchable for FlatNetworkFilter<'a> {
257
296
self . matches ( request, & mut RegexManager :: default ( ) )
258
297
}
259
298
}
260
-
261
- #[ inline]
262
- fn get_u16_slice_from_flatvector < ' a > ( vec : Option < flatbuffers:: Vector < ' a , u16 > > ) -> Option < & [ u16 ] > {
263
- vec. map ( |data| {
264
- let bytes = data. bytes ( ) ;
265
- unsafe {
266
- std:: slice:: from_raw_parts (
267
- bytes. as_ptr ( ) as * const u16 ,
268
- bytes. len ( ) / std:: mem:: size_of :: < u16 > ( ) ,
269
- )
270
- }
271
- } )
272
- }
0 commit comments