add a draft solution for day 7

This commit is contained in:
Leo Drachenfeuer 2022-12-09 16:48:44 +01:00
parent 964119473d
commit 671e0ee18d
Signed by: dragonleo
GPG key ID: A8338FC081137CF0

View file

@ -1,14 +1,99 @@
use std::path::PathBuf;
use std::fs::File;
use std::io::{BufReader,Lines};
use crate::util::read_lines;
use std::cell::{Ref, RefCell};
use std::fs::File;
use std::io::{BufReader, Lines};
use std::path::PathBuf;
use std::rc::{Rc, Weak};
#[derive(Debug)]
enum FsNodeType {
File,
Directory,
}
#[derive(Debug)]
struct FsNode {
vname: String,
vsize: u64,
vtype: FsNodeType,
parent: RefCell<Weak<FsNode>>,
childs: RefCell<Vec<Rc<FsNode>>>,
}
impl FsNode {
fn new() -> Rc<FsNode> {
Rc::new(FsNode {
vname: String::new(),
vsize: (0),
vtype: (FsNodeType::File),
parent: RefCell::new(Weak::new()),
childs: (RefCell::new(Vec::new())),
})
}
fn new_file(fname: &str, size: u64) -> Rc<FsNode> {
Rc::new(FsNode {
vname: (fname.to_string()),
vsize: (size),
vtype: (FsNodeType::File),
parent: RefCell::new(Weak::new()),
childs: (RefCell::new(Vec::new())),
})
}
fn new_dir(fname: &str) -> Rc<FsNode> {
Rc::new(FsNode {
vname: (fname.to_string()),
vsize: (0),
vtype: (FsNodeType::Directory),
parent: RefCell::new(Weak::new()),
childs: (RefCell::new(Vec::new())),
})
}
fn set_parent(&self, new_parent: &Rc<FsNode>) {
*self.parent.borrow_mut() = Rc::downgrade(new_parent);
}
fn add_child_node(&self, cf: Rc<FsNode>) {
match self.vtype {
FsNodeType::File => {}
FsNodeType::Directory => self.childs.borrow_mut().push(cf),
}
}
fn get_size(&self) ->u64{
self.vsize
}
fn get_size_of_tree(&self) -> u64{
let mut csize:u64 = self.vsize;
for c in self.childs.borrow().iter(){
csize += c.get_size_of_tree();
}
csize
}
fn get_parent(&self) -> Option<Rc<FsNode>> {
self.parent.borrow().upgrade()
}
fn get_child(&self) -> Ref<Vec<Rc<FsNode>>> {
self.childs.borrow()
}
}
fn part1(lines: Lines<BufReader<File>>) {
let tnode1: Rc<FsNode> = FsNode::new_dir("test");
let tnode2: Rc<FsNode> = FsNode::new_file("test", 10);
tnode2.set_parent(&tnode1);
tnode1.add_child_node(tnode2);
tnode1.add_child_node(FsNode::new_file("tesd234", 55));
println!("{:?}", tnode1.get_size_of_tree())
}
pub fn subcmd_day007(file: &Option<PathBuf>, alt: &bool) {
if let Ok(lines) = read_lines(file.as_ref().unwrap().as_path()) {
part1(lines);
}
}