1+ use std:: collections:: HashMap ;
12use std:: vec;
23
34use flatbuffers:: WIPOffset ;
@@ -189,9 +190,11 @@ impl<'a> FlatNetworkFilter<'a> {
189190 index : u32 ,
190191 owner : & ' a FlatNetworkFilterList ,
191192 ) -> Self {
193+ let list_address: * const FlatNetworkFilterList = owner as * const FlatNetworkFilterList ;
194+
192195 Self {
193196 fb_filter : filter,
194- key : index as u64 ,
197+ key : index as u64 | ( ( ( list_address ) as u64 ) << 32 ) ,
195198 mask : unsafe { NetworkFilterMask :: from_bits_unchecked ( filter. mask ( ) ) } ,
196199 owner : owner,
197200 }
@@ -206,6 +209,46 @@ impl<'a> FlatNetworkFilter<'a> {
206209 pub fn modifier_option ( & self ) -> Option < String > {
207210 self . fb_filter . modifier_option ( ) . map ( |o| o. to_string ( ) )
208211 }
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+ }
209252}
210253
211254impl < ' a > NetworkFilterMaskHelper for FlatNetworkFilter < ' a > {
@@ -224,28 +267,24 @@ impl<'a> NetworkMatchable for FlatNetworkFilter<'a> {
224267 if !check_options ( self . mask , request) {
225268 return false ;
226269 }
227- let opt_not_domains = get_u16_slice_from_flatvector ( self . fb_filter . opt_domains ( ) ) ;
228270 if !check_included_domains_mapped (
229- opt_not_domains ,
271+ self . include_domains ( ) ,
230272 request,
231273 & self . owner . domain_hashes_mapping ,
232274 ) {
233275 return false ;
234276 }
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+ ) {
237282 return false ;
238283 }
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- } ;
245284 check_pattern (
246285 self . mask ,
247- patterns. iter ( ) ,
248- hostname,
286+ self . patterns ( ) . iter ( ) ,
287+ self . hostname ( ) ,
249288 self . key ,
250289 request,
251290 regex_manager,
@@ -257,16 +296,3 @@ impl<'a> NetworkMatchable for FlatNetworkFilter<'a> {
257296 self . matches ( request, & mut RegexManager :: default ( ) )
258297 }
259298}
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