1use super::*;
2
3#[derive(Clone, Debug, PartialEq, Eq, Hash)]
4pub struct CppDelegate {
5 pub def: TypeDef,
6}
7
8impl Ord for CppDelegate {
9 fn cmp(&self, other: &Self) -> Ordering {
10 (self.def.name(), self.def).cmp(&(other.def.name(), other.def))
11 }
12}
13
14impl PartialOrd for CppDelegate {
15 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
16 Some(self.cmp(other))
17 }
18}
19
20impl CppDelegate {
21 pub fn type_name(&self) -> TypeName {
22 self.def.type_name()
23 }
24
25 pub fn write_name(&self, writer: &Writer) -> TokenStream {
26 self.type_name().write(writer, &[])
27 }
28
29 pub fn method(&self) -> MethodDef {
30 self.def
31 .methods()
32 .find(|method| method.name() == "Invoke")
33 .unwrap()
34 }
35
36 pub fn write(&self, writer: &Writer) -> TokenStream {
37 let type_name = self.def.type_name();
38 let name = to_ident(type_name.name());
39 let method = self.method();
40 let signature = method.signature(type_name.namespace(), &[]);
41
42 let params = signature.params.iter().map(|(ty, param)| {
43 let name = to_ident(&param.name().to_lowercase());
44 let ty = ty.write_default(writer);
45 quote! { #name: #ty }
46 });
47
48 let return_sig = writer.write_return_sig(method, &signature, false);
49
50 let mut dependencies = TypeMap::new();
51
52 if writer.config.package {
53 self.dependencies(&mut dependencies);
54 }
55
56 let cfg = writer.write_cfg(self.def, type_name.namespace(), &dependencies, false);
57
58 quote! {
59 #cfg
60 pub type #name = Option<unsafe extern "system" fn(#(#params),*) #return_sig>;
61 }
62 }
63
64 pub fn dependencies(&self, dependencies: &mut TypeMap) {
65 self.method()
66 .signature(self.def.namespace(), &[])
67 .dependencies(dependencies);
68 }
69}
70