1cfg_if::cfg_if! {
4 if #[cfg(feature = "manager-pointer")] {
5 pub use pointer::{BCDDFunction, BCDDManagerRef};
6 } else if #[cfg(feature = "manager-index")] {
7 pub use index::{BCDDFunction, BCDDManagerRef};
8 } else {
9 pub type BCDDFunction = ();
10 pub type BCDDManagerRef = ();
11 }
12}
13
14pub fn print_stats() {
16 #[cfg(not(feature = "statistics"))]
17 eprintln!("[statistics feature disabled]");
18
19 #[cfg(feature = "statistics")]
20 oxidd_rules_bdd::complement_edge::print_stats();
21}
22
23#[allow(unused_variables)]
25pub fn new_manager(
26 inner_node_capacity: usize,
27 apply_cache_capacity: usize,
28 threads: u32,
29) -> BCDDManagerRef {
30 cfg_if::cfg_if! {
31 if #[cfg(feature = "manager-pointer")] {
32 pointer::BCDDManagerRef::new_manager(inner_node_capacity, apply_cache_capacity, threads)
33 } else if #[cfg(feature = "manager-index")] {
34 index::BCDDManagerRef::new_manager(inner_node_capacity, 1, apply_cache_capacity, threads)
35 } else {
36 unreachable!()
37 }
38 }
39}
40
41#[cfg(all(feature = "manager-index", not(feature = "manager-pointer")))]
42mod index {
43 use oxidd_manager_index::node::fixed_arity::NodeWithLevelCons;
44 use oxidd_manager_index::terminal_manager::StaticTerminalManagerCons;
45 use oxidd_rules_bdd::complement_edge::BCDDOp;
46 use oxidd_rules_bdd::complement_edge::BCDDRules;
47 use oxidd_rules_bdd::complement_edge::BCDDTerminal;
48 use oxidd_rules_bdd::complement_edge::EdgeTag;
49
50 use crate::util::type_cons::DD;
51
52 crate::util::dd_index_based!(BCDD {
53 node: NodeWithLevelCons<2>,
54 edge_tag: EdgeTag,
55 terminal_manager: StaticTerminalManagerCons<BCDDTerminal>,
56 rules: BCDDRulesCons for BCDDRules,
57 manager_data: BCDDManagerDataCons for BCDDManagerData,
58 terminals: 1,
59 });
60
61 crate::util::manager_data!(BCDDManagerData for BCDD, operator: BCDDOp, cache_max_arity: 3);
62
63 crate::util::manager_ref_index_based!(pub struct BCDDManagerRef(<BCDD as DD>::ManagerRef) with BCDDManagerData);
64
65 #[cfg(not(feature = "multi-threading"))]
66 type FunctionInner = oxidd_rules_bdd::complement_edge::BCDDFunction<<BCDD as DD>::Function>;
67 #[cfg(feature = "multi-threading")]
68 type FunctionInner = oxidd_rules_bdd::complement_edge::BCDDFunctionMT<<BCDD as DD>::Function>;
69
70 #[derive(
72 Clone,
73 PartialEq,
74 Eq,
75 PartialOrd,
76 Ord,
77 Hash,
78 oxidd_derive::Function,
79 oxidd_derive::FunctionSubst,
80 oxidd_derive::BooleanFunction,
81 oxidd_derive::BooleanFunctionQuant,
82 )]
83 #[use_manager_ref(BCDDManagerRef, BCDDManagerRef(inner))]
84 pub struct BCDDFunction(FunctionInner);
85 crate::util::derive_raw_function_index_based!(for: BCDDFunction, inner: FunctionInner);
86
87 impl oxidd_dump::dot::DotStyle<EdgeTag> for BCDDFunction {}
89}
90
91#[cfg(feature = "manager-pointer")]
92mod pointer {
93 use oxidd_manager_pointer::node::fixed_arity::NodeWithLevelCons;
94 use oxidd_manager_pointer::terminal_manager::StaticTerminalManagerCons;
95 use oxidd_rules_bdd::complement_edge::BCDDOp;
96 use oxidd_rules_bdd::complement_edge::BCDDRules;
97 use oxidd_rules_bdd::complement_edge::BCDDTerminal;
98 use oxidd_rules_bdd::complement_edge::EdgeTag;
99
100 use crate::util::type_cons::DD;
101
102 crate::util::dd_pointer_based!(BCDD {
103 node: NodeWithLevelCons<2>,
104 edge_tag: EdgeTag,
105 terminal_manager: StaticTerminalManagerCons<BCDDTerminal>,
106 rules: BCDDRulesCons for BCDDRules,
107 manager_data: BCDDManagerDataCons for BCDDManagerData,
108 tag_bits: 2,
109 });
110
111 crate::util::manager_data!(BCDDManagerData for BCDD, operator: BCDDOp, cache_max_arity: 3);
112
113 crate::util::manager_ref_pointer_based!(pub struct BCDDManagerRef(<BCDD as DD>::ManagerRef) with BCDDManagerData);
114
115 #[cfg(not(feature = "multi-threading"))]
116 type FunctionInner = oxidd_rules_bdd::complement_edge::BCDDFunction<<BCDD as DD>::Function>;
117 #[cfg(feature = "multi-threading")]
118 type FunctionInner = oxidd_rules_bdd::complement_edge::BCDDFunctionMT<<BCDD as DD>::Function>;
119
120 #[derive(
122 Clone,
123 PartialEq,
124 Eq,
125 PartialOrd,
126 Ord,
127 Hash,
128 oxidd_derive::Function,
129 oxidd_derive::FunctionSubst,
130 oxidd_derive::BooleanFunction,
131 oxidd_derive::BooleanFunctionQuant,
132 )]
133 #[use_manager_ref(BCDDManagerRef, BCDDManagerRef(inner))]
134 pub struct BCDDFunction(FunctionInner);
135 crate::util::derive_raw_function_pointer_based!(for: BCDDFunction, inner: FunctionInner);
136
137 impl oxidd_dump::dot::DotStyle<EdgeTag> for BCDDFunction {}
139}