I think I actually have a good foundation for a tree here.

This commit is contained in:
Gabe Venberg 2023-10-31 23:53:43 -05:00
parent 44c6da936e
commit 607a48eb3a

View file

@ -1,22 +1,87 @@
#![allow(unused)] #![allow(unused)]
use std::{rc::{Weak, Rc}, cell::RefCell}; use std::{
cell::RefCell,
ops::Deref,
rc::{Rc, Weak},
};
// #[derive(Debug)]
// pub struct NodeRef(Rc<RefCell<Node>>);
#[derive(Debug)] #[derive(Debug)]
pub struct FileRef(Rc<RefCell<File>>);
#[derive(Debug)]
pub struct DirRef(Rc<RefCell<Dir>>);
#[derive(Debug)]
pub struct WeakDirRef(Weak<RefCell<Dir>>);
#[derive(Debug)]
pub enum Node {
Dir(DirRef),
File(FileRef),
}
#[derive(Debug)]
pub struct File {
parent: WeakDirRef,
pub name: String,
pub size: usize,
}
#[derive(Debug, Default)]
pub struct Dir { pub struct Dir {
parent: Option<Weak<RefCell<Dir>>>, parent: Option<WeakDirRef>,
name: String, pub name: String,
children: Vec<Rc<RefCell<FileOrDir>>> children: Vec<Node>,
} }
#[derive(Debug)] impl DirRef {
pub struct File{ //impling it on the ref makes the recursion a bit easier.
dir: Weak<RefCell<Dir>>, fn total_size(&self) -> usize {
size: usize, self.0
name: String .borrow()
.deref()
.children
.iter()
.map(|f| match f {
Node::Dir(dir) => dir.total_size(),
Node::File(file) => file.0.borrow().size,
})
.sum()
}
fn new(name: String) -> Self {
DirRef(Rc::new(RefCell::new(Dir {
parent: None,
name,
children: Vec::new(),
})))
}
//needs to be impled on the ref because of the need to get a weak backreference to self.
fn add(&self, node: Node) {
match node {
Node::Dir(ref dir) => {
dir.0.borrow_mut().parent = Some(WeakDirRef(Rc::downgrade(&self.0)))
}
Node::File(ref file) => file.0.borrow_mut().parent = WeakDirRef(Rc::downgrade(&self.0)),
}
self.0.borrow_mut().children.push(node);
}
} }
#[derive(Debug)] impl File {
pub enum FileOrDir{ fn get_parent(&self)-> &WeakDirRef {
File(File), &self.parent
Dir(Dir), }
}
impl Dir {
fn get_children(&self) -> &[Node] {
&self.children
}
fn get_parent(&self) -> &Option<WeakDirRef> {
&self.parent
}
} }