diff options
Diffstat (limited to 'ir/template.rs')
-rw-r--r-- | ir/template.rs | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/ir/template.rs b/ir/template.rs index 4dd8442..a1f8f5f 100644 --- a/ir/template.rs +++ b/ir/template.rs @@ -31,6 +31,7 @@ use super::context::{BindgenContext, ItemId, TypeId}; use super::item::{IsOpaque, Item, ItemAncestors}; use super::traversal::{EdgeKind, Trace, Tracer}; use crate::clang; +use itertools::{Either, Itertools}; /// Template declaration (and such declaration's template parameters) related /// methods. @@ -143,8 +144,9 @@ pub(crate) trait TemplateParameters: Sized { /// Get only the set of template parameters that this item uses. This is a /// subset of `all_template_params` and does not necessarily contain any of - /// `self_template_params`. - fn used_template_params(&self, ctx: &BindgenContext) -> Vec<TypeId> + /// `self_template_params`. If any are unused, true will be returned + /// in the second tuple element + fn used_template_params(&self, ctx: &BindgenContext) -> (Vec<TypeId>, bool) where Self: AsRef<ItemId>, { @@ -154,11 +156,18 @@ pub(crate) trait TemplateParameters: Sized { ); let id = *self.as_ref(); - ctx.resolve_item(id) + let (used, unused): (Vec<_>, Vec<_>) = ctx + .resolve_item(id) .all_template_params(ctx) .into_iter() - .filter(|p| ctx.uses_template_parameter(id, *p)) - .collect() + .partition_map(|p| { + if ctx.uses_template_parameter(id, p) { + Either::Left(p) + } else { + Either::Right(true) + } + }); + (used, !unused.is_empty()) } } |