List<'a, T> {
Empty,
More(T, &'a List<'a, T>),
}
fn make_list<'l>(bump: &'l Bump) -> List<'l, Box<'l, HeapAllocString>> {
let empty = List::Empty;
let l0 = List::More(
Box::new_in(HeapAllocString::new("lol"), bump),
bump.alloc(empty),
);
let l1 = List::More(
Box::new_in(HeapAllocString::new("kek"), bump),
bump.alloc(l0),
);
let l2 = List::More(
Box::new_in(HeapAllocString::new("foo"), bump),
bump.alloc(l1),
);
l2
}
#[derive(Debug)]
struct HeapAllocString(String);
impl HeapAllocString {
fn new(s: &str) -> Self {
Self(String::from(s))
}
}
impl Drop for HeapAllocString {
fn drop(&mut self) {
println!("free the memory ({}) :klass:", &self.0);
}
}
fn main() {
let bump = Bump::new();
let ls = make_list(&bump);
println!("{ls:?}");
}
Хочу написать список, при этом чтобы был женеричный по T и при этом чтобы опционально я мог аллоцировать в нём объекты в куче. Впринципе, всё классно работает, так я могу выделить Box и отдельно на него взять ссылку и сконструировать свой список.
Но вот проблема, такую структуру в расте не вернуть из функции (как минимум нужны самореферентные типы). Поэтому я подумал, ладно, что если я передам в функцию аллокатор?
fn make_list<'l>(bump: &'l Bump) -> List<'l, Box<'l, HeapAllocString>> {/***/}
Работает по такому принципу и я могу возвращать список из функции. Но, так как я использую Bump аллокатор, у него проблема, что он не вызывает Drop для типов. Для этого нужно использовать бумапочный Box. Ну вот я его заюзал и..
More(HeapAllocString("foo"), More(HeapAllocString("kek"), More(HeapAllocString("lol"), Empty)))
free the memory (foo) :klass:
После запуска этого кода я вижу, что только самый верхнеуровнеый Box был дропнут. То есть вложенные Box списка он не дропает.
Так вот, я задумался, а есть ли подобный аллокатор, но чтобы как-то трекал отдельно типы, что нужно дропать?
Храни в enum List сразу Box<T>
В том и задача, я хочу опционально боксить
И как ты это представляешь?
Выделять память в другом месте и делать список из ссылок
Ну тогда можно сделать энам
Ну да... Но, это рантайм. Хотелось бы на типах чисто
Frunk есть с его hlist-ами Очень похоже на тот велосипед с empty и more
Выкинь каку
Обсуждают сегодня