1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use std::collections::HashMap;

use once_cell::sync::Lazy;

use crate::class::ClassDesc;
use crate::func::{FuncCppBody, FuncDesc, FuncKind, FuncRustBody, ReturnKind};
use crate::type_ref::{Constness, TypeRef, TypeRefDesc};
use crate::Func;

pub type FuncFactory = fn() -> Func<'static, 'static>;

/// (module name, FuncFactory)
pub static FUNC_INJECT: Lazy<HashMap<&str, Vec<FuncFactory>>> = Lazy::new(|| {
	HashMap::from([
		(
			"core",
			vec![
				(|| {
					Func::new_desc(FuncDesc::new(
						FuncKind::InstanceMethod(ClassDesc::cv_matconstiterator()),
						Constness::Const,
						ReturnKind::InfallibleNaked,
						"type",
						"core",
						vec![],
						FuncCppBody::ManualCall("instance->m->type()".into()),
						FuncRustBody::Auto,
						TypeRefDesc::int(),
					))
				}) as FuncFactory, // todo: remove this cast when MSRV allows
				|| {
					Func::new_desc(FuncDesc::new(
						FuncKind::InstanceMethod(ClassDesc::cv_mat()),
						Constness::Const,
						ReturnKind::Fallible,
						"size",
						"core",
						vec![],
						FuncCppBody::Auto,
						FuncRustBody::Auto,
						TypeRefDesc::cv_size(),
					))
				},
				|| {
					Func::new_desc(FuncDesc::new(
						FuncKind::InstanceMethod(ClassDesc::cv_umat()),
						Constness::Const,
						ReturnKind::Fallible,
						"size",
						"core",
						vec![],
						FuncCppBody::Auto,
						FuncRustBody::Auto,
						TypeRefDesc::cv_size(),
					))
				},
			],
		),
		(
			"dnn",
			vec![|| {
				Func::new_desc(FuncDesc::new(
					FuncKind::Constructor(ClassDesc::cv_dnn_layerparams()),
					Constness::Const,
					ReturnKind::Fallible,
					"new",
					"dnn",
					vec![],
					FuncCppBody::Auto,
					FuncRustBody::Auto,
					TypeRef::new_class(ClassDesc::cv_dnn_layerparams()),
				))
			}],
		),
	])
});