From 261acca8a47201f63917984a8a0a1983559911d0 Mon Sep 17 00:00:00 2001 From: George Thomas Date: Thu, 19 Feb 2026 21:11:23 +0000 Subject: [PATCH] Define nicer Rust tree type and coerce --- rust/lib.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/rust/lib.rs b/rust/lib.rs index c471ecb..07b0887 100644 --- a/rust/lib.rs +++ b/rust/lib.rs @@ -42,7 +42,20 @@ extern "C" fn add(a: i64, b: i64) -> i64 { } #[repr(C)] -#[derive(Clone, Copy)] +enum BTreeBox { + Leaf { value: i64 }, + Fork { left: Box, right: Box }, +} +impl BTreeBox { + fn sum(&self) -> i64 { + match self { + BTreeBox::Leaf { value } => *value, + BTreeBox::Fork { left, right } => left.sum() + right.sum(), + } + } +} + +#[repr(C)] enum BTree { Leaf { value: i64, @@ -55,8 +68,5 @@ enum BTree { #[unsafe(no_mangle)] extern "C" fn sum_tree(t: BTree) -> i64 { - match t { - BTree::Leaf { value } => value, - BTree::Fork { left, right } => unsafe { sum_tree(*left) + sum_tree(*right) }, - } + (unsafe { std::mem::transmute::<_, &BTreeBox>(&t) }).sum() }