Skip to content

Commit a5f313d

Browse files
committed
Deglobalize FUNC_CFG_ATTR & switch to function matcher
1 parent 633086d commit a5f313d

File tree

5 files changed

+116
-47
lines changed

5 files changed

+116
-47
lines changed

binding-generator/src/bin/settings-cleanup.rs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,36 @@
11
use std::cell::RefCell;
22
use std::collections::{HashMap, HashSet};
3+
use std::env;
34
use std::ops::ControlFlow;
45
use std::path::{Path, PathBuf};
56
use std::rc::Rc;
6-
use std::{env, fmt};
77

88
use clang::{Entity, EntityKind};
99
use opencv_binding_generator::{
10-
opencv_module_from_path, settings, Class, Constness, EntityExt, EntityWalkerExt, EntityWalkerVisitor, Func, Generator,
11-
GeneratorEnv, Pred,
10+
opencv_module_from_path, Class, Constness, EntityExt, EntityWalkerExt, EntityWalkerVisitor, Func, Generator, GeneratorEnv,
11+
Pred,
1212
};
1313

14-
struct FunctionFinder<'tu, 'f> {
14+
struct FunctionFinder<'tu> {
1515
pub module: &'tu str,
1616
pub gen_env: GeneratorEnv<'tu>,
17-
pub func_cfg_attr_unused: RefCell<&'f mut HashSet<&'static str>>,
1817
}
1918

20-
impl<'tu, 'f> FunctionFinder<'tu, 'f> {
19+
impl<'tu> FunctionFinder<'tu> {
2120
pub fn update_used_func(&self, f: &Func) {
2221
let mut matcher = f.matcher();
2322
self.gen_env.settings.arg_override.get(&mut matcher);
2423
self.gen_env.settings.return_override.get(&mut matcher);
2524
self.gen_env.settings.force_infallible.get(&mut matcher);
25+
self.gen_env.settings.func_cfg_attr.get(&mut matcher);
2626
self.gen_env.settings.func_companion_tweak.get(&mut matcher);
2727
self.gen_env.settings.func_replace.get(&mut matcher);
2828
self.gen_env.settings.func_specialize.get(&mut matcher);
2929
self.gen_env.settings.func_unsafe.get(&mut matcher);
30-
31-
let identifier = f.identifier();
32-
33-
self.func_cfg_attr_unused.borrow_mut().remove(identifier.as_str());
3430
}
3531
}
3632

37-
impl<'tu> EntityWalkerVisitor<'tu> for &mut FunctionFinder<'tu, '_> {
33+
impl<'tu> EntityWalkerVisitor<'tu> for &mut FunctionFinder<'tu> {
3834
fn wants_file(&mut self, path: &Path) -> bool {
3935
opencv_module_from_path(path).map_or(false, |m| m == self.module)
4036
}
@@ -72,20 +68,10 @@ impl<'tu> EntityWalkerVisitor<'tu> for &mut FunctionFinder<'tu, '_> {
7268
}
7369
}
7470

75-
fn show<S: fmt::Display>(c: impl IntoIterator<Item = S>) {
76-
let v = c.into_iter().collect::<Vec<_>>();
77-
let mut sorted = v.iter().map(|s| s.to_string()).collect::<Vec<_>>();
78-
sorted.sort_unstable();
79-
for f in sorted {
80-
println!("{f}");
81-
}
82-
}
83-
8471
fn main() {
8572
let mut args = env::args_os().skip(1);
8673
let src_cpp_dir = PathBuf::from(args.next().expect("2nd argument must be dir with custom cpp"));
8774
let opencv_header_dirs = args.map(PathBuf::from);
88-
let mut func_cfg_attr_unused = settings::FUNC_CFG_ATTR.keys().copied().collect::<HashSet<_>>();
8975
// module -> usage_section -> (name, preds)
9076
let global_usage_tracking = Rc::new(RefCell::new(HashMap::<
9177
String,
@@ -115,7 +101,6 @@ fn main() {
115101
let mut function_finder = FunctionFinder {
116102
module: &module,
117103
gen_env,
118-
func_cfg_attr_unused: RefCell::new(&mut func_cfg_attr_unused),
119104
};
120105
root_entity.walk_opencv_entities(&mut function_finder);
121106

@@ -160,8 +145,6 @@ fn main() {
160145
}
161146
}
162147
}
163-
println!("Unused entries in settings::FUNC_CFG_ATTR ({}):", func_cfg_attr_unused.len());
164-
show(func_cfg_attr_unused);
165148
}
166149

167150
type UsageTrackerOwned = (String, Vec<PredOwned>);

binding-generator/src/func.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,13 @@ impl<'tu, 'ge> Func<'tu, 'ge> {
627627
Self::Desc(desc) => &desc.cpp_body,
628628
}
629629
}
630+
631+
pub fn cfg_attrs(&self) -> Option<(&str, &str)> {
632+
match self {
633+
Self::Clang { gen_env, .. } => gen_env.settings.func_cfg_attr.get(&mut self.matcher()).copied(),
634+
Self::Desc(_) => None,
635+
}
636+
}
630637
}
631638

632639
impl<'tu> ToEntity<'tu> for &Func<'tu, '_> {

binding-generator/src/settings.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub use argument_override::{
4949
pub use element_exclude_kind::ELEMENT_EXCLUDE_KIND;
5050
pub use element_export_tweak::ELEMENT_EXPORT_TWEAK;
5151
pub use force_infallible::{force_infallible_factory, ForceInfallible};
52-
pub use func_cfg_attr::FUNC_CFG_ATTR;
52+
pub use func_cfg_attr::{func_cfg_attr_factory, FuncCfgAttr};
5353
pub use func_companion_tweak::{func_companion_tweak_factory, CompanionTweak, FuncCompanionTweak};
5454
pub use func_exclude::{func_exclude_factory, FuncExclude};
5555
pub use func_inject::{func_inject_factory, FuncFactory, FuncInject};
@@ -93,6 +93,7 @@ pub struct Settings {
9393
pub arg_override: ArgOverride,
9494
pub return_override: ReturnOverride,
9595
pub force_infallible: ForceInfallible,
96+
pub func_cfg_attr: FuncCfgAttr,
9697
pub func_companion_tweak: FuncCompanionTweak,
9798
pub func_exclude: FuncExclude,
9899
pub func_inject: FuncInject,
@@ -111,6 +112,7 @@ impl Settings {
111112
arg_override: ArgOverride::empty(),
112113
return_override: ReturnOverride::empty(),
113114
force_infallible: ForceInfallible::empty(),
115+
func_cfg_attr: FuncCfgAttr::empty(),
114116
func_companion_tweak: FuncCompanionTweak::empty(),
115117
func_exclude: FuncExclude::default(),
116118
func_inject: FuncInject::default(),
@@ -129,6 +131,7 @@ impl Settings {
129131
arg_override: arg_override_factory(module),
130132
return_override: return_override_factory(module),
131133
force_infallible: force_infallible_factory(module),
134+
func_cfg_attr: func_cfg_attr_factory(module),
132135
func_companion_tweak: func_companion_tweak_factory(module),
133136
func_exclude: func_exclude_factory(module),
134137
func_inject: func_inject_factory(module),
Lines changed: 94 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,99 @@
11
use std::collections::HashMap;
22

3-
use once_cell::sync::Lazy;
3+
use crate::func::FuncMatcher;
4+
5+
// pub type FuncCfgAttr = HashMap<&'static str, (&'static str, &'static str)>;
6+
pub type FuncCfgAttr = FuncMatcher<'static, (&'static str, &'static str)>;
47

58
/// identifier => (rust_attr, cpp_attr)
6-
pub static FUNC_CFG_ATTR: Lazy<HashMap<&str, (&str, &str)>> = Lazy::new(|| {
7-
HashMap::from([
8-
// ### imgproc ###
9-
("cv_getRotationMatrix2D__Point2f_double_double", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
9+
pub fn func_cfg_attr_factory(module: &str) -> FuncCfgAttr {
10+
match module {
11+
"imgproc" => imgproc_factory(),
12+
"tracking" => tracking_factory(),
13+
_ => FuncCfgAttr::empty(),
14+
}
15+
}
16+
17+
fn imgproc_factory() -> FuncCfgAttr {
18+
FuncCfgAttr::create(HashMap::from([(
19+
"cv::getRotationMatrix2D_",
20+
vec![(pred!(mut, ["center", "angle", "scale"]), NOT_ON_WINDOWS)],
21+
)]))
22+
}
23+
24+
fn tracking_factory() -> FuncCfgAttr {
25+
FuncCfgAttr::create(HashMap::from([
26+
(
27+
"cv::TrackerStateEstimatorAdaBoosting::TrackerAdaBoostingTargetState::TrackerAdaBoostingTargetState",
28+
vec![(
29+
pred!(mut, ["position", "width", "height", "foreground", "responses"]),
30+
NOT_ON_WINDOWS, // 3.4
31+
)],
32+
),
33+
(
34+
"cv::TrackerStateEstimatorAdaBoosting::TrackerAdaBoostingTargetState::getTargetResponses",
35+
vec![(
36+
pred!(const, []),
37+
NOT_ON_WINDOWS, // 3.4
38+
)],
39+
),
40+
(
41+
"cv::TrackerStateEstimatorAdaBoosting::TrackerAdaBoostingTargetState::isTargetFg",
42+
vec![(
43+
pred!(const, []),
44+
NOT_ON_WINDOWS, // 3.4
45+
)],
46+
),
47+
(
48+
"cv::TrackerStateEstimatorAdaBoosting::TrackerAdaBoostingTargetState::setTargetFg",
49+
vec![(
50+
pred!(mut, ["foreground"]),
51+
NOT_ON_WINDOWS, // 3.4
52+
)],
53+
),
54+
(
55+
"cv::TrackerStateEstimatorAdaBoosting::TrackerAdaBoostingTargetState::setTargetResponses",
56+
vec![(
57+
pred!(mut, ["responses"]),
58+
NOT_ON_WINDOWS, // 3.4
59+
)],
60+
),
61+
(
62+
"cv::TrackerStateEstimatorMILBoosting::TrackerMILTargetState::TrackerMILTargetState",
63+
vec![(
64+
pred!(mut, ["position", "width", "height", "foreground", "features"]),
65+
NOT_ON_WINDOWS, // 3.4
66+
)],
67+
),
68+
(
69+
"cv::TrackerStateEstimatorMILBoosting::TrackerMILTargetState::getFeatures",
70+
vec![(
71+
pred!(const, []),
72+
NOT_ON_WINDOWS, // 3.4
73+
)],
74+
),
75+
(
76+
"cv::TrackerStateEstimatorMILBoosting::TrackerMILTargetState::isTargetFg",
77+
vec![(
78+
pred!(const, []),
79+
NOT_ON_WINDOWS, // 3.4
80+
)],
81+
),
82+
(
83+
"cv::TrackerStateEstimatorMILBoosting::TrackerMILTargetState::setFeatures",
84+
vec![(
85+
pred!(mut, ["features"]),
86+
NOT_ON_WINDOWS, // 3.4
87+
)],
88+
),
89+
(
90+
"cv::TrackerStateEstimatorMILBoosting::TrackerMILTargetState::setTargetFg",
91+
vec![(
92+
pred!(mut, ["foreground"]),
93+
NOT_ON_WINDOWS, // 3.4
94+
)],
95+
),
96+
]))
97+
}
1098

11-
// ### tracking ###
12-
("cv_TrackerStateEstimatorAdaBoosting_TrackerAdaBoostingTargetState_TrackerAdaBoostingTargetState_const_Point2fR_int_int_bool_const_MatR", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
13-
("cv_TrackerStateEstimatorAdaBoosting_TrackerAdaBoostingTargetState_getTargetResponses_const", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
14-
("cv_TrackerStateEstimatorAdaBoosting_TrackerAdaBoostingTargetState_isTargetFg_const", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
15-
("cv_TrackerStateEstimatorAdaBoosting_TrackerAdaBoostingTargetState_setTargetFg_bool", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
16-
("cv_TrackerStateEstimatorAdaBoosting_TrackerAdaBoostingTargetState_setTargetResponses_const_MatR", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
17-
("cv_TrackerStateEstimatorMILBoosting_TrackerMILTargetState_TrackerMILTargetState_const_Point2fR_int_int_bool_const_MatR", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
18-
("cv_TrackerStateEstimatorMILBoosting_TrackerMILTargetState_getFeatures_const", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
19-
("cv_TrackerStateEstimatorMILBoosting_TrackerMILTargetState_isTargetFg_const", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
20-
("cv_TrackerStateEstimatorMILBoosting_TrackerMILTargetState_setFeatures_const_MatR", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
21-
("cv_TrackerStateEstimatorMILBoosting_TrackerMILTargetState_setTargetFg_bool", ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)")),
22-
])
23-
});
99+
const NOT_ON_WINDOWS: (&str, &str) = ("not(target_os = \"windows\")", "!defined(OCVRS_TARGET_OS_WINDOWS)");

binding-generator/src/writer/rust_native/func.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::name_pool::NamePool;
1616
use crate::settings::ARG_OVERRIDE_SELF;
1717
use crate::type_ref::{Constness, CppNameStyle, ExternDir, FishStyle, NameStyle, StrEnc, StrType, TypeRef, TypeRefTypeHint};
1818
use crate::writer::rust_native::type_ref::render_lane::FunctionProps;
19-
use crate::{reserved_rename, settings, CompiledInterpolation, Element, Func, IteratorExt, NameDebug, StrExt, StringExt};
19+
use crate::{reserved_rename, CompiledInterpolation, Element, Func, IteratorExt, NameDebug, StrExt, StringExt};
2020

2121
pub trait FuncExt<'tu, 'ge> {
2222
fn companion_functions(&self) -> Vec<Func<'tu, 'ge>>;
@@ -329,7 +329,7 @@ impl RustNativeGeneratedElement for Func<'_, '_> {
329329
if self.is_no_discard() {
330330
attributes.push(Borrowed("#[must_use]"));
331331
}
332-
if let Some((rust_attr, _)) = settings::FUNC_CFG_ATTR.get(identifier.as_str()) {
332+
if let Some((rust_attr, _)) = self.cfg_attrs() {
333333
if !rust_attr.is_empty() {
334334
attributes.push(format!("#[cfg({rust_attr})]").into());
335335
}
@@ -366,7 +366,7 @@ impl RustNativeGeneratedElement for Func<'_, '_> {
366366

367367
let identifier = self.identifier();
368368
let mut attributes = String::new();
369-
if let Some((rust_attr, _)) = settings::FUNC_CFG_ATTR.get(identifier.as_str()) {
369+
if let Some((rust_attr, _)) = self.cfg_attrs() {
370370
attributes = format!("#[cfg({rust_attr})]");
371371
}
372372
let mut args = vec![];
@@ -427,7 +427,7 @@ impl RustNativeGeneratedElement for Func<'_, '_> {
427427
// attributes
428428
let mut attributes_begin = String::new();
429429
let mut attributes_end = String::new();
430-
if let Some((_, cpp_attr)) = settings::FUNC_CFG_ATTR.get(identifier.as_str()) {
430+
if let Some((_, cpp_attr)) = self.cfg_attrs() {
431431
attributes_begin = format!("#if {cpp_attr}");
432432
attributes_end = "#endif".to_string();
433433
}

0 commit comments

Comments
 (0)