@@ -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