@@ -55,7 +55,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
5555 Self :: Desc ( Rc :: new ( desc) )
5656 }
5757
58- /// Checks whether a class can be simple on Rust side, i.e. represented by plain struct with public fields
58+ /// Checks whether a class can be simple on Rust side, i.e. represented by plain struct with fields
5959 pub fn can_be_simple ( & self ) -> bool {
6060 let cpp_refname = self . cpp_name ( CppNameStyle :: Reference ) ;
6161 settings:: IMPLEMENTED_GENERICS . contains ( cpp_refname. as_ref ( ) )
@@ -329,7 +329,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
329329 }
330330 }
331331
332- pub fn methods ( & self ) -> Vec < Func < ' tu , ' ge > > {
332+ pub fn methods ( & self , filter : impl Fn ( & Func ) -> bool ) -> Vec < Func < ' tu , ' ge > > {
333333 match self {
334334 Class :: Clang { entity, gen_env, .. } => {
335335 let mut out = Vec :: with_capacity ( 32 ) ;
@@ -343,18 +343,23 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
343343 if func. is_generic ( ) {
344344 if let Some ( specs) = gen_env. settings . func_specialize . get ( & mut func. matcher ( ) ) {
345345 for spec in specs {
346- out. push ( func. clone ( ) . specialize ( spec) ) ;
346+ let spec_func = func. clone ( ) . specialize ( spec) ;
347+ if filter ( & spec_func) {
348+ out. push ( spec_func) ;
349+ }
347350 }
348351 return ControlFlow :: Continue ( ( ) ) ;
349352 }
350353 }
351- out. push ( func) ;
354+ if filter ( & func) {
355+ out. push ( func) ;
356+ }
352357 ControlFlow :: Continue ( ( ) )
353358 } ) ;
354359 for inject_func_fact in & gen_env. settings . func_inject {
355360 let inject_func: Func = inject_func_fact ( ) ;
356361 if let Some ( cls) = inject_func. kind ( ) . as_class_method ( ) {
357- if cls == self {
362+ if cls == self && filter ( & inject_func ) {
358363 out. push ( inject_func) ;
359364 }
360365 }
@@ -377,10 +382,12 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
377382 }
378383 }
379384
380- pub fn fields ( & self ) -> Vec < Field < ' tu , ' ge > > {
385+ pub fn fields ( & self , filter : impl Fn ( & Field ) -> bool ) -> Vec < Field < ' tu , ' ge > > {
381386 let mut out = Vec :: with_capacity ( 32 ) ;
382387 self . for_each_field ( |f| {
383- out. push ( f) ;
388+ if filter ( & f) {
389+ out. push ( f) ;
390+ }
384391 ControlFlow :: Continue ( ( ) )
385392 } ) ;
386393 out
@@ -405,16 +412,13 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
405412
406413 pub fn field_methods < ' f > (
407414 & self ,
408- fields : impl Iterator < Item = & ' f Field < ' tu , ' ge > > ,
415+ fields : & ' f [ Field < ' tu , ' ge > ] ,
409416 constness_filter : Option < Constness > ,
410- ) -> Vec < Func < ' tu , ' ge > >
411- where
412- ' tu : ' f ,
413- ' ge : ' f ,
414- {
417+ ) -> impl Iterator < Item = Func < ' tu , ' ge > > + ' f {
415418 match self {
416419 & Self :: Clang { gen_env, .. } => {
417- let accessor_generator = |fld : & Field < ' tu , ' ge > | {
420+ let cls = self . clone ( ) ;
421+ let accessor_generator = move |fld : & Field < ' tu , ' ge > | {
418422 let doc_comment = Rc :: from ( fld. doc_comment ( ) ) ;
419423 let def_loc = fld. file_line_name ( ) . location ;
420424 let rust_module = Rc :: from ( fld. rust_module ( ) ) ;
@@ -449,7 +453,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
449453 let read_const_func = if constness_filter. map_or ( true , |c| c. is_const ( ) ) {
450454 Some ( Func :: new_desc (
451455 FuncDesc :: new (
452- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
456+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
453457 Constness :: Const ,
454458 return_kind,
455459 fld_declname,
@@ -468,7 +472,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
468472 let read_mut_func = if constness_filter. map_or ( true , |c| c. is_mut ( ) ) {
469473 Some ( Func :: new_desc (
470474 FuncDesc :: new (
471- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
475+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
472476 Constness :: Mut ,
473477 return_kind,
474478 format ! ( "{fld_declname}Mut" ) ,
@@ -489,7 +493,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
489493 let single_read_func = if constness_filter. map_or ( true , |c| c == fld_const) {
490494 Some ( Func :: new_desc (
491495 FuncDesc :: new (
492- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
496+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
493497 fld_const,
494498 return_kind,
495499 fld_declname,
@@ -518,7 +522,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
518522 let ( first_letter, rest) = fld_declname. capitalize_first_ascii_letter ( ) . expect ( "Empty fld_declname" ) ;
519523 Some ( Func :: new_desc (
520524 FuncDesc :: new (
521- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
525+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
522526 Constness :: Mut ,
523527 ReturnKind :: InfallibleNaked ,
524528 format ! ( "set{first_letter}{rest}" ) ,
@@ -545,9 +549,9 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
545549 . or_else ( || write_yield. take ( ) )
546550 } )
547551 } ;
548- fields. flat_map ( accessor_generator ) . collect ( )
552+ FieldMethodsIter :: Clang ( fields. iter ( ) . flat_map ( accessor_generator ) )
549553 }
550- Self :: Desc ( _) => vec ! [ ] ,
554+ Self :: Desc ( _) => FieldMethodsIter :: Desc ,
551555 }
552556 }
553557
@@ -574,15 +578,13 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
574578
575579 pub fn generated_types ( & self ) -> Vec < GeneratedType < ' tu , ' ge > > {
576580 self
577- . fields ( )
581+ . fields ( |f| f . exclude_kind ( ) . is_included ( ) )
578582 . into_iter ( )
579- . filter ( |f| f. exclude_kind ( ) . is_included ( ) )
580583 . flat_map ( |f| f. type_ref ( ) . generated_types ( ) )
581584 . chain (
582585 self
583- . methods ( )
586+ . methods ( |m| m . exclude_kind ( ) . is_included ( ) )
584587 . into_iter ( )
585- . filter ( |m| m. exclude_kind ( ) . is_included ( ) )
586588 . flat_map ( |m| m. generated_types ( ) ) ,
587589 )
588590 . collect ( )
@@ -837,3 +839,19 @@ impl<'tu, 'ge> TemplateKind<'tu, 'ge> {
837839 }
838840 }
839841}
842+
843+ pub enum FieldMethodsIter < ' tu : ' ge , ' ge , I : Iterator < Item = Func < ' tu , ' ge > > > {
844+ Clang ( I ) ,
845+ Desc ,
846+ }
847+
848+ impl < ' tu , ' ge , I : Iterator < Item = Func < ' tu , ' ge > > > Iterator for FieldMethodsIter < ' tu , ' ge , I > {
849+ type Item = Func < ' tu , ' ge > ;
850+
851+ fn next ( & mut self ) -> Option < Self :: Item > {
852+ match self {
853+ FieldMethodsIter :: Clang ( iter) => iter. next ( ) ,
854+ FieldMethodsIter :: Desc => None ,
855+ }
856+ }
857+ }
0 commit comments