safer_ffi/headers/
definer.rs1#![cfg_attr(rustfmt, rustfmt::skip)]
2use super::*;
3
4pub
17trait Definer : define_once_seal::__ {
18 fn insert (self: &'_ mut Self, name: &'_ str)
20 -> bool
21 ;
22
23 fn out (self: &'_ mut Self)
25 -> &'_ mut dyn io::Write
26 ;
27
28 #[cfg(docs)]
29 fn define_once (
35 self: &'_ mut Self,
36 name: &'_ str,
37 write_typedef: &'_ mut dyn
38 FnMut (&'_ mut dyn Definer) -> io::Result<()>
39 ,
40 ) -> io::Result<()>
41 { unreachable!("See `define_once_seal::__::define_once` for the impl") }
42}
43
44mod define_once_seal {
45 use super::*;
46
47 pub
48 trait __ {
49 fn define_once (
50 self: &'_ mut Self,
51 name: &'_ str,
52 write_typedef: &'_ mut dyn
53 FnMut(&'_ mut dyn Definer) -> io::Result<()>
54 ,
55 ) -> io::Result<()>
56 ;
57 }
58
59 impl<T : Definer> __
60 for T
61 {
62 fn define_once (
63 self: &'_ mut Self,
64 name: &'_ str,
65 write_typedef: &'_ mut dyn
66 FnMut(&'_ mut dyn Definer) -> io::Result<()>
67 ,
68 ) -> io::Result<()>
69 {
70 if self.insert(name) {
71 write_typedef(self)?;
72 }
73 Ok(())
74 }
75 }
76}
77
78pub
81struct HashSetDefiner<'out> {
82 pub
83 defines_set: HashSet<String>,
84
85 pub
86 out: &'out mut dyn io::Write,
87}
88
89impl Definer
90 for HashSetDefiner<'_>
91{
92 fn insert (self: &'_ mut Self, name: &'_ str)
93 -> bool
94 {
95 self.defines_set
96 .insert(name.to_owned())
97 }
98
99 fn out (self: &'_ mut Self)
100 -> &'_ mut dyn io::Write
101 {
102 &mut *self.out
103 }
104}