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
77
78
79
80
81
82
use std::borrow::Cow;
use std::collections::HashMap;
use std::rc::Rc;

use once_cell::sync::Lazy;

use crate::class::ClassDesc;
use crate::debug::DefinitionLocation;
use crate::func::{FuncCppBody, FuncDesc, FuncKind, FuncRustBody, FuncRustExtern, InheritConfig, ReturnKind};
use crate::type_ref::{Constness, TypeRef};
use crate::{Func, FuncId, FuncTypeHint};

pub type FuncInheritFactory = for<'tu, 'ge> fn(&Func<'tu, 'ge>) -> Func<'tu, 'ge>;

pub static FUNC_REPLACE: Lazy<HashMap<FuncId, FuncInheritFactory>> = Lazy::new(|| {
	const MAT_FORWARD: Cow<str> = Cow::Borrowed("core::mat_forward::{{name}}(self, {{forward_args}})");
	const MAT_FORWARD_INHERIT_CONFIG: InheritConfig = InheritConfig {
		kind: false,
		name: false,
		doc_comment: true,
		arguments: true,
		return_type_ref: false,
		definition_location: true,
	};

	let forward_const = (|f| {
		let mut out = Func::new_desc(FuncDesc {
			kind: FuncKind::InstanceMethod(ClassDesc::cv_mat()),
			type_hint: FuncTypeHint::None,
			constness: Constness::Const,
			return_kind: ReturnKind::Fallible,
			cpp_name: "at".into(),
			rust_custom_leafname: None,
			rust_module: "core".into(),
			doc_comment: "".into(),
			def_loc: DefinitionLocation::Generated,
			rust_generic_decls: vec![("T".to_string(), "core::DataType".to_string())].into(),
			arguments: Rc::new([]),
			return_type_ref: TypeRef::new_pointer(TypeRef::new_generic("T").with_constness(Constness::Const)),
			cpp_body: FuncCppBody::Absent,
			rust_body: FuncRustBody::ManualCallReturn(MAT_FORWARD),
			rust_extern_definition: FuncRustExtern::Absent,
		});
		out.inherit(f, MAT_FORWARD_INHERIT_CONFIG);
		out
	}) as FuncInheritFactory;

	let forward_mut = (|f| {
		let mut out = Func::new_desc(FuncDesc {
			kind: FuncKind::InstanceMethod(ClassDesc::cv_mat()),
			type_hint: FuncTypeHint::None,
			constness: Constness::Mut,
			return_kind: ReturnKind::Fallible,
			cpp_name: "at".into(),
			rust_custom_leafname: None,
			rust_module: "core".into(),
			doc_comment: "".into(),
			def_loc: DefinitionLocation::Generated,
			rust_generic_decls: vec![("T".to_string(), "core::DataType".to_string())].into(),
			arguments: Rc::new([]),
			return_type_ref: TypeRef::new_pointer(TypeRef::new_generic("T")),
			cpp_body: FuncCppBody::Absent,
			rust_body: FuncRustBody::ManualCallReturn(MAT_FORWARD),
			rust_extern_definition: FuncRustExtern::Absent,
		});
		out.inherit(f, MAT_FORWARD_INHERIT_CONFIG);
		out
	}) as FuncInheritFactory;

	HashMap::from([
		(FuncId::new_mut("cv::Mat::at", ["i0"]), forward_mut),
		(FuncId::new_const("cv::Mat::at", ["i0"]), forward_const),
		(FuncId::new_mut("cv::Mat::at", ["row", "col"]), forward_mut),
		(FuncId::new_const("cv::Mat::at", ["row", "col"]), forward_const),
		(FuncId::new_mut("cv::Mat::at", ["i0", "i1", "i2"]), forward_mut),
		(FuncId::new_const("cv::Mat::at", ["i0", "i1", "i2"]), forward_const),
		(FuncId::new_mut("cv::Mat::at", ["pt"]), forward_mut),
		(FuncId::new_const("cv::Mat::at", ["pt"]), forward_const),
		(FuncId::new_mut("cv::Mat::at", ["idx"]), forward_mut),
		(FuncId::new_const("cv::Mat::at", ["idx"]), forward_const),
	])
});