opencv_binding_generator/
name_pool.rs1use 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}