Move builtin tracking bools to module
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 6ee6ad7..e638410 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -168,74 +168,59 @@
}
fn write_include_cxxbridge(out: &mut OutFile, apis: &[Api]) {
- let mut needs_panic = false;
- let mut needs_rust_string = false;
- let mut needs_rust_str = false;
- let mut needs_rust_slice = false;
- let mut needs_rust_box = false;
- let mut needs_rust_vec = false;
- let mut needs_rust_fn = false;
- let mut needs_rust_isize = false;
- let mut needs_unsafe_bitcopy = false;
for ty in out.types {
match ty {
Type::RustBox(_) => {
out.include.new = true;
out.include.type_traits = true;
- needs_rust_box = true;
+ out.builtin.rust_box = true;
}
Type::RustVec(_) => {
out.include.array = true;
out.include.new = true;
out.include.type_traits = true;
- needs_panic = true;
- needs_rust_vec = true;
- needs_unsafe_bitcopy = true;
+ out.builtin.panic = true;
+ out.builtin.rust_vec = true;
+ out.builtin.unsafe_bitcopy = true;
}
Type::Str(_) => {
out.include.cstdint = true;
out.include.string = true;
- needs_rust_str = true;
+ out.builtin.rust_str = true;
}
Type::Fn(_) => {
- needs_rust_fn = true;
+ out.builtin.rust_fn = true;
}
Type::Slice(_) | Type::SliceRefU8(_) => {
- needs_rust_slice = true;
+ out.builtin.rust_slice = true;
}
ty if ty == Isize => {
out.include.basetsd = true;
- needs_rust_isize = true;
+ out.builtin.rust_isize = true;
}
ty if ty == RustString => {
out.include.array = true;
out.include.cstdint = true;
out.include.string = true;
- needs_rust_string = true;
+ out.builtin.rust_string = true;
}
_ => {}
}
}
- let mut needs_rust_error = false;
- let mut needs_manually_drop = false;
- let mut needs_maybe_uninit = false;
- let mut needs_trycatch = false;
- let mut needs_rust_str_new_unchecked = false;
- let mut needs_rust_str_repr = false;
for api in apis {
match api {
Api::CxxFunction(efn) if !out.header => {
if efn.throws {
- needs_trycatch = true;
+ out.builtin.trycatch = true;
} else if let Some(Type::Str(_)) = efn.ret {
- needs_rust_str_repr = true;
+ out.builtin.rust_str_repr = true;
}
for arg in &efn.args {
match arg.ty {
- Type::Str(_) => needs_rust_str_new_unchecked = true,
- Type::RustVec(_) => needs_unsafe_bitcopy = true,
- _ => needs_unsafe_bitcopy |= arg.ty == RustString,
+ Type::Str(_) => out.builtin.rust_str_new_unchecked = true,
+ Type::RustVec(_) => out.builtin.unsafe_bitcopy = true,
+ _ => out.builtin.unsafe_bitcopy |= arg.ty == RustString,
}
}
}
@@ -243,23 +228,23 @@
if efn.throws {
out.include.exception = true;
out.include.string = true;
- needs_rust_str = true;
- needs_rust_error = true;
- needs_maybe_uninit = true;
+ out.builtin.rust_str = true;
+ out.builtin.rust_error = true;
+ out.builtin.maybe_uninit = true;
}
for arg in &efn.args {
if arg.ty != RustString && out.types.needs_indirect_abi(&arg.ty) {
- needs_manually_drop = true;
+ out.builtin.manually_drop = true;
}
if let Type::Str(_) = arg.ty {
- needs_rust_str_repr = true;
+ out.builtin.rust_str_repr = true;
}
}
if let Some(ret) = &efn.ret {
if out.types.needs_indirect_abi(ret) {
- needs_maybe_uninit = true;
+ out.builtin.maybe_uninit = true;
} else if let Type::Str(_) = ret {
- needs_rust_str_new_unchecked = true;
+ out.builtin.rust_str_new_unchecked = true;
}
}
}
@@ -270,47 +255,35 @@
out.begin_block("namespace rust");
out.begin_block("inline namespace cxxbridge05");
- if needs_panic
- || needs_rust_string
- || needs_rust_str
- || needs_rust_slice
- || needs_rust_box
- || needs_rust_vec
- || needs_rust_fn
- || needs_rust_error
- || needs_rust_isize
- || needs_unsafe_bitcopy
- || needs_manually_drop
- || needs_maybe_uninit
- {
+ if out.builtin != Default::default() {
writeln!(out, "// #include \"rust/cxx.h\"");
}
- include::write(out, needs_panic, "CXXBRIDGE05_PANIC");
+ include::write(out, out.builtin.panic, "CXXBRIDGE05_PANIC");
- if needs_rust_string {
+ if out.builtin.rust_string {
out.next_section();
writeln!(out, "struct unsafe_bitcopy_t;");
}
- if needs_rust_error {
+ if out.builtin.rust_error {
out.begin_block("namespace");
writeln!(out, "template <typename T>");
writeln!(out, "class impl;");
out.end_block("namespace");
}
- include::write(out, needs_rust_string, "CXXBRIDGE05_RUST_STRING");
- include::write(out, needs_rust_str, "CXXBRIDGE05_RUST_STR");
- include::write(out, needs_rust_slice, "CXXBRIDGE05_RUST_SLICE");
- include::write(out, needs_rust_box, "CXXBRIDGE05_RUST_BOX");
- include::write(out, needs_unsafe_bitcopy, "CXXBRIDGE05_RUST_BITCOPY");
- include::write(out, needs_rust_vec, "CXXBRIDGE05_RUST_VEC");
- include::write(out, needs_rust_fn, "CXXBRIDGE05_RUST_FN");
- include::write(out, needs_rust_error, "CXXBRIDGE05_RUST_ERROR");
- include::write(out, needs_rust_isize, "CXXBRIDGE05_RUST_ISIZE");
+ include::write(out, out.builtin.rust_string, "CXXBRIDGE05_RUST_STRING");
+ include::write(out, out.builtin.rust_str, "CXXBRIDGE05_RUST_STR");
+ include::write(out, out.builtin.rust_slice, "CXXBRIDGE05_RUST_SLICE");
+ include::write(out, out.builtin.rust_box, "CXXBRIDGE05_RUST_BOX");
+ include::write(out, out.builtin.unsafe_bitcopy, "CXXBRIDGE05_RUST_BITCOPY");
+ include::write(out, out.builtin.rust_vec, "CXXBRIDGE05_RUST_VEC");
+ include::write(out, out.builtin.rust_fn, "CXXBRIDGE05_RUST_FN");
+ include::write(out, out.builtin.rust_error, "CXXBRIDGE05_RUST_ERROR");
+ include::write(out, out.builtin.rust_isize, "CXXBRIDGE05_RUST_ISIZE");
- if needs_manually_drop {
+ if out.builtin.manually_drop {
out.next_section();
out.include.utility = true;
writeln!(out, "template <typename T>");
@@ -324,7 +297,7 @@
writeln!(out, "}};");
}
- if needs_maybe_uninit {
+ if out.builtin.maybe_uninit {
out.next_section();
writeln!(out, "template <typename T>");
writeln!(out, "union MaybeUninit {{");
@@ -336,7 +309,11 @@
out.begin_block("namespace");
- if needs_trycatch || needs_rust_error || needs_rust_str_new_unchecked || needs_rust_str_repr {
+ if out.builtin.trycatch
+ || out.builtin.rust_error
+ || out.builtin.rust_str_new_unchecked
+ || out.builtin.rust_str_repr
+ {
out.begin_block("namespace repr");
writeln!(out, "struct PtrLen final {{");
writeln!(out, " const void *ptr;");
@@ -345,12 +322,12 @@
out.end_block("namespace repr");
}
- if needs_rust_str_new_unchecked || needs_rust_str_repr {
+ if out.builtin.rust_str_new_unchecked || out.builtin.rust_str_repr {
out.next_section();
writeln!(out, "template <>");
writeln!(out, "class impl<Str> final {{");
writeln!(out, "public:");
- if needs_rust_str_new_unchecked {
+ if out.builtin.rust_str_new_unchecked {
writeln!(
out,
" static Str new_unchecked(repr::PtrLen repr) noexcept {{",
@@ -361,7 +338,7 @@
writeln!(out, " return str;");
writeln!(out, " }}");
}
- if needs_rust_str_repr {
+ if out.builtin.rust_str_repr {
writeln!(out, " static repr::PtrLen repr(Str str) noexcept {{");
writeln!(out, " return repr::PtrLen{{str.ptr, str.len}};");
writeln!(out, " }}");
@@ -369,7 +346,7 @@
writeln!(out, "}};");
}
- if needs_rust_error {
+ if out.builtin.rust_error {
out.next_section();
writeln!(out, "template <>");
writeln!(out, "class impl<Error> final {{");
@@ -386,7 +363,7 @@
out.end_block("namespace");
out.end_block("namespace cxxbridge05");
- if needs_trycatch {
+ if out.builtin.trycatch {
out.begin_block("namespace behavior");
out.include.exception = true;
out.include.type_traits = true;