From 71e4ffaede0c9fb9b63f92fac4c86f1116dcaa91 Mon Sep 17 00:00:00 2001 From: George Thomas Date: Thu, 19 Feb 2026 21:28:00 +0000 Subject: [PATCH] Make Rust tree type polymorphic --- rust/lib.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/rust/lib.rs b/rust/lib.rs index 3cfce8b..35b3ba2 100644 --- a/rust/lib.rs +++ b/rust/lib.rs @@ -1,6 +1,9 @@ #![allow(dead_code)] -use std::ffi::{CStr, c_char}; +use std::{ + ffi::{CStr, c_char}, + ops::Add, +}; fn say_hello(name: &str) { println!("Hello from Rust, {name}!"); @@ -42,12 +45,20 @@ extern "C" fn add(a: i64, b: i64) -> i64 { } #[repr(C)] -enum BTree { - Leaf { value: i64 }, - Fork { left: Box, right: Box }, +enum BTree { + Leaf { + value: A, + }, + Fork { + left: Box>, + right: Box>, + }, } -impl BTree { - fn sum(&self) -> i64 { +impl BTree +where + A: Add + Copy, +{ + fn sum(&self) -> A { match self { BTree::Leaf { value } => *value, BTree::Fork { left, right } => left.sum() + right.sum(), @@ -68,5 +79,5 @@ enum BTreeC { #[unsafe(no_mangle)] extern "C" fn sum_tree(t: BTreeC) -> i64 { - (unsafe { std::mem::transmute::<_, &BTree>(&t) }).sum() + (unsafe { std::mem::transmute::<_, &BTree>(&t) }).sum() }