opencv_binding_generator/
name_pool.rs

1use std::borrow::Cow;
2use std::collections::HashSet;
3
4use crate::StringExt;
5
6pub struct NamePool {
7	names: HashSet<String>,
8}
9
10impl NamePool {
11	pub fn with_capacity(capacity: usize) -> Self {
12		Self {
13			names: HashSet::with_capacity(capacity),
14		}
15	}
16
17	pub fn make_unique_name(&mut self, name: &mut Cow<str>) -> MakeUniqueNameResult {
18		let mut out = MakeUniqueNameResult::Unchanged;
19		while self.names.contains(name.as_ref()) {
20			name.to_mut().bump_counter();
21			out = MakeUniqueNameResult::Changed;
22		}
23		self.names.insert(name.to_string());
24		out
25	}
26
27	pub fn into_disambiguator<T, I, CB>(mut self, args: I, name_cb: CB) -> impl Iterator<Item = (String, T)>
28	where
29		I: IntoIterator<Item = T>,
30		CB: for<'a> Fn(&'a T) -> Cow<'a, str>,
31	{
32		args.into_iter().map(move |item| {
33			let mut name = name_cb(&item);
34			self.make_unique_name(&mut name);
35			(name.into_owned(), item)
36		})
37	}
38}
39
40#[derive(Copy, Clone)]
41pub enum MakeUniqueNameResult {
42	Unchanged,
43	Changed,
44}
45
46impl MakeUniqueNameResult {
47	pub fn is_changed(self) -> bool {
48		match self {
49			MakeUniqueNameResult::Unchanged => false,
50			MakeUniqueNameResult::Changed => true,
51		}
52	}
53}