@@ -55,7 +55,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
55
55
Self :: Desc ( Rc :: new ( desc) )
56
56
}
57
57
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
59
59
pub fn can_be_simple ( & self ) -> bool {
60
60
let cpp_refname = self . cpp_name ( CppNameStyle :: Reference ) ;
61
61
settings:: IMPLEMENTED_GENERICS . contains ( cpp_refname. as_ref ( ) )
@@ -329,7 +329,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
329
329
}
330
330
}
331
331
332
- pub fn methods ( & self ) -> Vec < Func < ' tu , ' ge > > {
332
+ pub fn methods ( & self , filter : impl Fn ( & Func ) -> bool ) -> Vec < Func < ' tu , ' ge > > {
333
333
match self {
334
334
Class :: Clang { entity, gen_env, .. } => {
335
335
let mut out = Vec :: with_capacity ( 32 ) ;
@@ -343,18 +343,23 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
343
343
if func. is_generic ( ) {
344
344
if let Some ( specs) = gen_env. settings . func_specialize . get ( & mut func. matcher ( ) ) {
345
345
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
+ }
347
350
}
348
351
return ControlFlow :: Continue ( ( ) ) ;
349
352
}
350
353
}
351
- out. push ( func) ;
354
+ if filter ( & func) {
355
+ out. push ( func) ;
356
+ }
352
357
ControlFlow :: Continue ( ( ) )
353
358
} ) ;
354
359
for inject_func_fact in & gen_env. settings . func_inject {
355
360
let inject_func: Func = inject_func_fact ( ) ;
356
361
if let Some ( cls) = inject_func. kind ( ) . as_class_method ( ) {
357
- if cls == self {
362
+ if cls == self && filter ( & inject_func ) {
358
363
out. push ( inject_func) ;
359
364
}
360
365
}
@@ -377,10 +382,12 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
377
382
}
378
383
}
379
384
380
- pub fn fields ( & self ) -> Vec < Field < ' tu , ' ge > > {
385
+ pub fn fields ( & self , filter : impl Fn ( & Field ) -> bool ) -> Vec < Field < ' tu , ' ge > > {
381
386
let mut out = Vec :: with_capacity ( 32 ) ;
382
387
self . for_each_field ( |f| {
383
- out. push ( f) ;
388
+ if filter ( & f) {
389
+ out. push ( f) ;
390
+ }
384
391
ControlFlow :: Continue ( ( ) )
385
392
} ) ;
386
393
out
@@ -405,16 +412,13 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
405
412
406
413
pub fn field_methods < ' f > (
407
414
& self ,
408
- fields : impl Iterator < Item = & ' f Field < ' tu , ' ge > > ,
415
+ fields : & ' f [ Field < ' tu , ' ge > ] ,
409
416
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 {
415
418
match self {
416
419
& 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 > | {
418
422
let doc_comment = Rc :: from ( fld. doc_comment ( ) ) ;
419
423
let def_loc = fld. file_line_name ( ) . location ;
420
424
let rust_module = Rc :: from ( fld. rust_module ( ) ) ;
@@ -449,7 +453,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
449
453
let read_const_func = if constness_filter. map_or ( true , |c| c. is_const ( ) ) {
450
454
Some ( Func :: new_desc (
451
455
FuncDesc :: new (
452
- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
456
+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
453
457
Constness :: Const ,
454
458
return_kind,
455
459
fld_declname,
@@ -468,7 +472,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
468
472
let read_mut_func = if constness_filter. map_or ( true , |c| c. is_mut ( ) ) {
469
473
Some ( Func :: new_desc (
470
474
FuncDesc :: new (
471
- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
475
+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
472
476
Constness :: Mut ,
473
477
return_kind,
474
478
format ! ( "{fld_declname}Mut" ) ,
@@ -489,7 +493,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
489
493
let single_read_func = if constness_filter. map_or ( true , |c| c == fld_const) {
490
494
Some ( Func :: new_desc (
491
495
FuncDesc :: new (
492
- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
496
+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
493
497
fld_const,
494
498
return_kind,
495
499
fld_declname,
@@ -518,7 +522,7 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
518
522
let ( first_letter, rest) = fld_declname. capitalize_first_ascii_letter ( ) . expect ( "Empty fld_declname" ) ;
519
523
Some ( Func :: new_desc (
520
524
FuncDesc :: new (
521
- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
525
+ FuncKind :: FieldAccessor ( cls . clone ( ) , fld. clone ( ) ) ,
522
526
Constness :: Mut ,
523
527
ReturnKind :: InfallibleNaked ,
524
528
format ! ( "set{first_letter}{rest}" ) ,
@@ -545,9 +549,9 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
545
549
. or_else ( || write_yield. take ( ) )
546
550
} )
547
551
} ;
548
- fields. flat_map ( accessor_generator ) . collect ( )
552
+ FieldMethodsIter :: Clang ( fields. iter ( ) . flat_map ( accessor_generator ) )
549
553
}
550
- Self :: Desc ( _) => vec ! [ ] ,
554
+ Self :: Desc ( _) => FieldMethodsIter :: Desc ,
551
555
}
552
556
}
553
557
@@ -574,15 +578,13 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
574
578
575
579
pub fn generated_types ( & self ) -> Vec < GeneratedType < ' tu , ' ge > > {
576
580
self
577
- . fields ( )
581
+ . fields ( |f| f . exclude_kind ( ) . is_included ( ) )
578
582
. into_iter ( )
579
- . filter ( |f| f. exclude_kind ( ) . is_included ( ) )
580
583
. flat_map ( |f| f. type_ref ( ) . generated_types ( ) )
581
584
. chain (
582
585
self
583
- . methods ( )
586
+ . methods ( |m| m . exclude_kind ( ) . is_included ( ) )
584
587
. into_iter ( )
585
- . filter ( |m| m. exclude_kind ( ) . is_included ( ) )
586
588
. flat_map ( |m| m. generated_types ( ) ) ,
587
589
)
588
590
. collect ( )
@@ -837,3 +839,19 @@ impl<'tu, 'ge> TemplateKind<'tu, 'ge> {
837
839
}
838
840
}
839
841
}
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