aboutsummaryrefslogtreecommitdiff
path: root/ir/template.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ir/template.rs')
-rw-r--r--ir/template.rs19
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())
}
}