From 1cd1fe281b039c30b5bb6bfd93f6b83b2fcceb24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kevin=20Ka=C3=9Felmann?= <kevin.kasselmann@arithnea.de>
Date: Fri, 29 Jun 2018 10:01:53 +0200
Subject: [PATCH] [Labels] Added Generics

---
 src/common/errors.rs                |   4 +
 src/common/succinct_tree.rs         |   6 +-
 src/trees/bp_tree.rs                | 115 +++++++++++++++-----------
 src/trees/louds_tree.rs             | 121 ++++++++++++++++------------
 testdata/loudstree_invalid.testdata | Bin 0 -> 115 bytes
 5 files changed, 147 insertions(+), 99 deletions(-)
 create mode 100644 testdata/loudstree_invalid.testdata

diff --git a/src/common/errors.rs b/src/common/errors.rs
index cc288b9..44bc7fd 100644
--- a/src/common/errors.rs
+++ b/src/common/errors.rs
@@ -26,4 +26,8 @@ pub enum NodeError {
     HasNoParentError,
     #[fail(display = "The supplied index does not reference a node with a next sibling.")]
     HasNoFurtherSiblingsError,
+    #[fail(display = "The supplied index has no label.")]
+    NoLabelError,
+    #[fail(display = "There is no child which passes the requirements.")]
+    NoSuchChildError,
 }
diff --git a/src/common/succinct_tree.rs b/src/common/succinct_tree.rs
index 88116f1..74cd871 100644
--- a/src/common/succinct_tree.rs
+++ b/src/common/succinct_tree.rs
@@ -4,14 +4,16 @@ use common::errors::NodeError;
 use id_tree::Tree;
 use std::fmt::Debug;
 
-pub trait SuccinctTree<T>: Debug {
+pub trait SuccinctTree<T, Label>: Debug {
     fn is_leaf(&self, index: u64) -> Result<bool, NodeError>;
     fn parent(&self, index: u64) -> Result<u64, NodeError>;
     fn first_child(&self, index: u64) -> Result<u64, NodeError>;
     fn next_sibling(&self, index: u64) -> Result<u64, NodeError>;
     fn from_id_tree(tree: Tree<i32>) -> Result<T, EmptyTreeError>;
+    fn child_label(&self, index: u64) -> Result<Label, NodeError>;
+    fn labeled_child(&self, index: u64, label: Label) -> Result<u64, NodeError>;
 
-    /// Prüft ob ein Bitvector ein gültiger SuccinctTree ist, anhand des gültige Exzesses und
+    /// Prüft ob ein Bitvector ein gültiger SuccinctTree ist, anhand des gültigen Exzesses und
     /// der Anzahl öffnender und schließender Klammern
     ///
     ///  # Arguments
diff --git a/src/trees/bp_tree.rs b/src/trees/bp_tree.rs
index 6f49d24..3621c4f 100644
--- a/src/trees/bp_tree.rs
+++ b/src/trees/bp_tree.rs
@@ -45,20 +45,19 @@ use std::fs;
 use std::fs::File;
 use std::io::Write;
 
-#[derive(Serialize, Deserialize)]
-pub struct BPTree {
-    bits: BitVec<u8>,
+pub struct BPTree<L> {
+    labels: Vec<L>,
     rankselect: RankSelect,
     minmax: MinMax,
 }
 
-impl PartialEq for BPTree {
+impl<L> PartialEq for BPTree<L> {
     fn eq(&self, other: &Self) -> bool {
-        self.bits == other.bits
+        self.rankselect.bits() == other.rankselect.bits()
     }
 }
 
-impl SuccinctTree<BPTree> for BPTree {
+impl<L> SuccinctTree<BPTree<L>, L> for BPTree<L> {
     /// Checks if a node is a leaf.
     /// # Arguments
     /// * `index` The index of the node to check
@@ -66,7 +65,7 @@ impl SuccinctTree<BPTree> for BPTree {
     /// * `NotANodeError` If `index` does not reference a node.
     fn is_leaf(&self, index: u64) -> Result<bool, NodeError> {
         self.is_valid_index(index)?;
-        Ok(!self.bits.get_bit(index + 1))
+        Ok(!self.rankselect.bits().get_bit(index + 1))
     }
 
     /// Returns the index of the parent of this node
@@ -131,25 +130,44 @@ impl SuccinctTree<BPTree> for BPTree {
         Ok(Self {
             rankselect: RankSelect::new(bitvec.clone(), superblock_size as usize),
             minmax: MinMax::new(bitvec.clone(), 1024),
-            bits: bitvec,
+            labels: Vec::with_capacity(bitvec.len() as usize),
         })
     }
+
+    /// Returns the label for the edge between the parent and the node
+    /// # Arguments
+    /// * `index` The index of the node to get the label of
+    /// # Errors
+    /// * `NotANodeError` If `index` does not reference a node.
+    fn child_label(&self, index: u64) -> Result<L, NodeError> {
+        unimplemented!();
+    }
+
+    /// Returns the child from the specified node with that label
+    /// # Arguments
+    /// * `index` The index of the node to analyze
+    /// * `label` The label which a should have
+    /// # Errors
+    /// * `NoSuchChildError` If there is no child which has this label
+    fn labeled_child(&self, index: u64, label: L) -> Result<u64, NodeError> {
+        unimplemented!();
+    }
 }
 
-impl Debug for BPTree {
+impl<L> Debug for BPTree<L> {
     fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        write!(f, "BPTree\n  {{ bits: {:?} }}", self.bits)
+        write!(f, "BPTree\n  {{ bits: {:?} }}", self.rankselect.bits())
     }
 }
 
-impl BPTree {
+impl<L> BPTree<L> {
     /// Returns whether the index is valid
     /// # Arguments
     /// * `index` The index which should be valid
     /// # Errors
     /// * `NotANodeError` If `index` does not reference a node.
     pub fn is_valid_index(&self, index: u64) -> Result<bool, NodeError> {
-        if index >= self.bits.len() {
+        if index >= self.rankselect.bits().len() {
             Err(NodeError::NotANodeError)
         } else {
             Ok(true)
@@ -214,9 +232,9 @@ impl BPTree {
         }
         let superblock_size = Self::calc_superblock_size(bitvec.len());
         Ok(Self {
-            rankselect: RankSelect::new(bitvec.clone(), superblock_size as usize),
             minmax: MinMax::new(bitvec.clone(), 1024),
-            bits: bitvec,
+            labels: Vec::with_capacity(bitvec.len() as usize),
+            rankselect: RankSelect::new(bitvec, superblock_size as usize),
         })
     }
 
@@ -226,8 +244,12 @@ impl BPTree {
     ///
     pub fn from_file(path: String) -> Result<Self, Error> {
         let file = fs::read(path).context("Could not read saved tree.")?;
-        let tree: Self = deserialize(&file).context("Error while deserializing tree.")?;
-        Ok(tree)
+        let rankselect: RankSelect = deserialize(&file).context("Error while deserializing tree.")?;
+        Ok(Self {
+            minmax: MinMax::new(rankselect.bits().clone(), 1024),
+            labels: Vec::with_capacity(rankselect.bits().len() as usize),
+            rankselect: rankselect,
+        })
     }
 
     /// Serializes a BPTree to a file
@@ -235,7 +257,7 @@ impl BPTree {
     /// * `path` The path of the file to save to. Will be overwritten if it exists.
     ///
     pub fn save_to(&self, path: String) -> Result<(), Error> {
-        let encoded = serialize(&self).context("Error while serializing tree.")?;
+        let encoded = serialize(&self.rankselect).context("Error while serializing tree.")?;
         let mut file = File::create(path).context("Could not save tree.")?;
         file.write_all(&encoded)?;
         Ok(())
@@ -265,9 +287,10 @@ mod tests {
     #[test]
     fn new_from_bitvec() {
         let bitvec = bit_vec!(true, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(
-            tree.bits, bitvec,
+            tree.rankselect.bits().clone(),
+            bitvec,
             "BPTree seems to somehow change the bitvector it was created with."
         );
     }
@@ -275,19 +298,17 @@ mod tests {
     #[test]
     fn new_from_bitvec_invalid() {
         let bitvec = bit_vec!(false, false);
-        assert_eq!(
-            BPTree::from_bitvec(bitvec.clone()).unwrap_err(),
-            InvalidBitvecError
-        );
+        let tree: Result<BPTree<String>, InvalidBitvecError> = BPTree::from_bitvec(bitvec.clone());
+        assert_eq!(tree.unwrap_err(), InvalidBitvecError);
     }
 
     #[test]
     fn save_load() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
-        tree.save_to("testdata/bptree.testdata".to_string())
-            .unwrap();
-        let result = BPTree::from_file("testdata/bptree.testdata".to_string()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let path = "testdata/bptree.testdata";
+        tree.save_to(path.to_string()).unwrap();
+        let result = BPTree::from_file(path.to_string()).unwrap();
         assert_eq!(
             tree, result,
             "The loaded tree is not equal to the original one."
@@ -297,27 +318,28 @@ mod tests {
     #[test]
     #[should_panic(expected = "Error while deserializing tree.")]
     fn load_invalid() {
-        BPTree::from_file("testdata/bptree_invalid.testdata".to_string()).unwrap();
+        let _tree: BPTree<String> =
+            BPTree::from_file("testdata/bptree_invalid.testdata".to_string()).unwrap();
     }
 
     #[test]
     fn is_leaf() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert!(tree.is_leaf(1).unwrap());
     }
 
     #[test]
     fn is_no_leaf() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert!(!tree.is_leaf(0).unwrap());
     }
 
     #[test]
     fn is_leaf_wrong_index() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.is_leaf(4).unwrap_err(), NodeError::NotANodeError);
     }
 
@@ -325,28 +347,28 @@ mod tests {
     #[ignore]
     fn parent() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.parent(1).unwrap(), 0);
     }
 
     #[test]
     fn parent_no_parent() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.parent(0).unwrap_err(), NodeError::HasNoParentError);
     }
 
     #[test]
     fn first_child() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.first_child(0).unwrap(), 1);
     }
 
     #[test]
     fn first_child_no_parent() {
         let bitvec = bit_vec!(true, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.first_child(1).unwrap_err(), NodeError::NotAParentError);
     }
 
@@ -354,7 +376,7 @@ mod tests {
     #[ignore]
     fn next_sibling() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.next_sibling(1).unwrap(), 3);
     }
 
@@ -362,7 +384,7 @@ mod tests {
     #[ignore]
     fn next_sibling_no_next_sibling() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(
             tree.next_sibling(3).unwrap_err(),
             NodeError::HasNoFurtherSiblingsError
@@ -372,7 +394,7 @@ mod tests {
     #[test]
     fn pre_rank() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.pre_rank(1).unwrap(), 2);
         assert_eq!(tree.pre_rank(2).unwrap(), 2);
         assert_eq!(tree.pre_rank(3).unwrap(), 3);
@@ -383,7 +405,7 @@ mod tests {
     #[test]
     fn pre_select() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.pre_select(1).unwrap(), 0);
         assert_eq!(tree.pre_select(2).unwrap(), 1);
         assert_eq!(tree.pre_select(3).unwrap(), 3);
@@ -394,7 +416,7 @@ mod tests {
     #[test]
     fn ancestor_is_ancestor() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert!(tree.ancestor(0, 1).unwrap());
         assert!(tree.ancestor(0, 3).unwrap());
     }
@@ -402,7 +424,7 @@ mod tests {
     #[test]
     fn ancestor_not_a_ancestor() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert!(!tree.ancestor(1, 3).unwrap());
         assert!(!tree.ancestor(1, 0).unwrap());
     }
@@ -410,7 +432,7 @@ mod tests {
     #[test]
     fn depth() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.depth(0).unwrap(), 1);
         assert_eq!(tree.depth(1).unwrap(), 2);
         assert_eq!(tree.depth(3).unwrap(), 2);
@@ -419,7 +441,7 @@ mod tests {
     #[test]
     fn subtree_size() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.subtree_size(0).unwrap(), 3);
         assert_eq!(tree.subtree_size(1).unwrap(), 1);
         assert_eq!(tree.subtree_size(3).unwrap(), 1);
@@ -428,7 +450,7 @@ mod tests {
     #[test]
     fn traverse_id_tree_for_bitvec() {
         let bitvec = bit_vec!(true, true, true, false, false, true, false, false);
-        let expected_tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let expected_tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         let mut id_tree: Tree<i32> = TreeBuilder::new().with_node_capacity(5).build();
         let root_id: NodeId = id_tree.insert(Node::new(0), AsRoot).unwrap();
         let child_id = id_tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
@@ -441,13 +463,14 @@ mod tests {
     #[test]
     fn from_empty_id_tree() {
         let id_tree: Tree<i32> = TreeBuilder::new().with_node_capacity(5).build();
-        assert_eq!(BPTree::from_id_tree(id_tree).unwrap_err(), EmptyTreeError)
+        let bp_tree: Result<BPTree<String>, EmptyTreeError> = BPTree::from_id_tree(id_tree);
+        assert_eq!(bp_tree.unwrap_err(), EmptyTreeError);
     }
 
     #[test]
     fn print() {
         let bitvec = bit_vec!(true, true, false, true, false, false);
-        let tree = BPTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: BPTree<String> = BPTree::from_bitvec(bitvec.clone()).unwrap();
         let str = format!("{:?}", tree);
         assert_eq!(
             str,
diff --git a/src/trees/louds_tree.rs b/src/trees/louds_tree.rs
index ae46913..bf6ed55 100644
--- a/src/trees/louds_tree.rs
+++ b/src/trees/louds_tree.rs
@@ -36,25 +36,26 @@ use std::fmt::{Debug, Formatter};
 use std::fs;
 use std::fs::File;
 use std::io::Write;
+use std::vec::Vec;
 
-#[derive(Serialize, Deserialize)]
-pub struct LOUDSTree {
+pub struct LOUDSTree<L> {
     rankselect: RankSelect,
+    labels: Vec<L>,
 }
 
-impl PartialEq for LOUDSTree {
+impl<L> PartialEq for LOUDSTree<L> {
     fn eq(&self, other: &Self) -> bool {
         self.rankselect.bits() == other.rankselect.bits()
     }
 }
 
-impl Debug for LOUDSTree {
+impl<L> Debug for LOUDSTree<L> {
     fn fmt(&self, f: &mut Formatter) -> fmt::Result {
         write!(f, "LOUDSTree\n  {{ bits: {:?} }}", self.rankselect.bits())
     }
 }
 
-impl SuccinctTree<LOUDSTree> for LOUDSTree {
+impl<L> SuccinctTree<LOUDSTree<L>, L> for LOUDSTree<L> {
     /// Checks if a node is a leaf.
     /// # Arguments
     /// * `index` The index of the node to check
@@ -146,9 +147,22 @@ impl SuccinctTree<LOUDSTree> for LOUDSTree {
         }
         Ok(Self::from_bitvec(bitvec).unwrap())
     }
+
+    /// Returns the label for the edge between the parent and the node
+    /// # Arguments
+    /// * `index` The index of the node to get the label of
+    /// # Errors
+    /// * `NotANodeError` If `index` does not reference a node.
+    fn child_label(&self, index: u64) -> Result<L, NodeError> {
+        unimplemented!();
+    }
+
+    fn labeled_child(&self, index: u64, label: L) -> Result<u64, NodeError> {
+        unimplemented!();
+    }
 }
 
-impl LOUDSTree {
+impl<L> LOUDSTree<L> {
     fn prev_0(&self, index: u64) -> Option<u64> {
         self.rankselect.select_0(self.rankselect.rank_0(index)?)
     }
@@ -183,18 +197,22 @@ impl LOUDSTree {
         }
         let superblock_size = Self::calc_superblock_size(bitvec.len());
         Ok(Self {
-            rankselect: RankSelect::new(bitvec.clone(), superblock_size as usize),
+            labels: Vec::with_capacity(bitvec.len() as usize),
+            rankselect: RankSelect::new(bitvec, superblock_size as usize),
         })
     }
 
     pub fn from_file(path: String) -> Result<Self, Error> {
         let file = fs::read(path).context("Could not read saved tree.")?;
-        let tree: Self = deserialize(&file).context("Error while deserializing tree.")?;
-        Ok(tree)
+        let rankselect: RankSelect = deserialize(&file).context("Error while deserializing tree.")?;
+        Ok(Self {
+            labels: Vec::with_capacity(rankselect.bits().len() as usize),
+            rankselect: rankselect,
+        })
     }
 
     pub fn save_to(&self, path: String) -> Result<(), Error> {
-        let encoded = serialize(&self).context("Error while serializing tree.")?;
+        let encoded = serialize(&self.rankselect).context("Error while serializing tree.")?;
         let mut file = File::create(path).context("Could not save tree.")?;
         file.write_all(&encoded)?;
         Ok(())
@@ -210,7 +228,7 @@ mod tests {
     #[test]
     fn new_from_bitvec() {
         let bitvec = bit_vec![true, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(
             *tree.rankselect.bits(),
             bitvec,
@@ -221,72 +239,91 @@ mod tests {
     #[test]
     fn new_from_bitvec_invalid() {
         let bitvec = bit_vec![true, true];
+        let tree: Result<LOUDSTree<String>, InvalidBitvecError> = LOUDSTree::from_bitvec(bitvec);
+        assert_eq!(tree.unwrap_err(), InvalidBitvecError);
+    }
+
+    #[test]
+    fn save_load() {
+        let bitvec =
+            bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        tree.save_to("testdata/loudstree.testdata".to_string())
+            .unwrap();
+        let result: LOUDSTree<String> = LOUDSTree::from_file("testdata/loudstree.testdata".to_string()).unwrap();
         assert_eq!(
-            LOUDSTree::from_bitvec(bitvec.clone()).unwrap_err(),
-            InvalidBitvecError
+            tree, result,
+            "The loaded tree is not equal to the original one."
         );
     }
 
+    #[test]
+    #[should_panic(expected = "Error while deserializing tree.")]
+    fn load_invalid() {
+        let _tree: LOUDSTree<String> =
+            LOUDSTree::from_file("testdata/loudstree_invalid.testdata".to_string()).unwrap();
+    }
+
     #[test]
     fn is_leaf() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert!(tree.is_leaf(3).unwrap());
     }
 
     #[test]
     fn is_no_leaf() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert!(!tree.is_leaf(1).unwrap());
     }
 
     #[test]
     fn is_leaf_wrong_index() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.is_leaf(2).unwrap_err(), NodeError::NotANodeError);
     }
 
     #[test]
     fn is_leaf_wrong_index2() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.is_leaf(4).unwrap_err(), NodeError::NotANodeError);
     }
 
     #[test]
     fn first_child() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.first_child(1).unwrap(), 3);
     }
 
     #[test]
     fn first_child_no_parent() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.first_child(3).unwrap_err(), NodeError::NotAParentError);
     }
 
     #[test]
     fn parent() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.parent(3).unwrap(), 1)
     }
 
     #[test]
     fn parent_root_node() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.parent(1).unwrap_err(), NodeError::RootNodeError)
     }
 
     #[test]
     fn parent_no_node() {
         let bitvec = bit_vec![true, true, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.parent(0).unwrap_err(), NodeError::NotANodeError)
     }
 
@@ -294,7 +331,7 @@ mod tests {
     fn next_sibling() {
         let bitvec =
             bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.next_sibling(5).unwrap(), 7);
         assert_eq!(tree.next_sibling(7).unwrap(), 9);
     }
@@ -303,7 +340,7 @@ mod tests {
     fn no_next_sibling() {
         let bitvec =
             bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(
             tree.next_sibling(10).unwrap_err(),
             NodeError::NoSiblingError
@@ -314,7 +351,7 @@ mod tests {
     fn degree() {
         let bitvec =
             bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.degree(1).unwrap(), 3);
         assert_eq!(tree.degree(5).unwrap(), 1);
         assert_eq!(tree.degree(9).unwrap(), 0);
@@ -324,7 +361,7 @@ mod tests {
     fn child_rank() {
         let bitvec =
             bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         assert_eq!(tree.child_rank(9).unwrap(), 2);
         assert_eq!(tree.child_rank(7).unwrap(), 1);
         assert_eq!(tree.child_rank(5).unwrap(), 0);
@@ -334,7 +371,7 @@ mod tests {
     fn print() {
         let bitvec =
             bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
         let str = format!("{:?}", tree);
         assert_eq!(str, "LOUDSTree\n  { bits: bit_vec![true, true, true, true, false, true, false, true, false, false, false, false] }")
     }
@@ -344,32 +381,13 @@ mod tests {
         let bitvec_a =
             bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
         let bitvec_b = bit_vec![true, true, false, false];
-        let tree_a = LOUDSTree::from_bitvec(bitvec_a.clone()).unwrap();
-        let tree_b = LOUDSTree::from_bitvec(bitvec_a.clone()).unwrap();
-        let tree_c = LOUDSTree::from_bitvec(bitvec_b.clone()).unwrap();
+        let tree_a: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec_a.clone()).unwrap();
+        let tree_b: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec_a.clone()).unwrap();
+        let tree_c: LOUDSTree<String> = LOUDSTree::from_bitvec(bitvec_b.clone()).unwrap();
         assert_eq!(tree_a, tree_b);
         assert_ne!(tree_a, tree_c)
     }
 
-    #[test]
-    fn save_load() {
-        let bitvec =
-            bit_vec![true, true, true, true, false, true, false, true, false, false, false, false];
-        let tree = LOUDSTree::from_bitvec(bitvec.clone()).unwrap();
-        tree.save_to("testdata/loudstree.testdata".to_string())
-            .unwrap();
-        let result = LOUDSTree::from_file("testdata/loudstree.testdata".to_string()).unwrap();
-        assert_eq!(
-            tree, result,
-            "The loaded tree is not equal to the original one."
-        );
-    }
-
-    #[test]
-    #[should_panic(expected = "Error while deserializing tree.")]
-    fn load_invalid() {
-        LOUDSTree::from_file("testdata/bptree_invalid.testdata".to_string()).unwrap();
-    }
 
     #[test]
     fn from_id_tree() {
@@ -378,7 +396,7 @@ mod tests {
         let child_id = id_tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
         id_tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
         id_tree.insert(Node::new(3), UnderNode(&child_id)).unwrap();
-        let tree = LOUDSTree::from_id_tree(id_tree).unwrap();
+        let tree: LOUDSTree<String> = LOUDSTree::from_id_tree(id_tree).unwrap();
         let bitvec = bit_vec![true, true, true, false, true, false, false, false];
         let other_tree = LOUDSTree::from_bitvec(bitvec).unwrap();
         assert_eq!(tree, other_tree)
@@ -387,8 +405,9 @@ mod tests {
     #[test]
     fn from_empty_id_tree() {
         let id_tree: Tree<i32> = TreeBuilder::new().with_node_capacity(5).build();
+        let tree: Result<LOUDSTree<String>, EmptyTreeError> = LOUDSTree::from_id_tree(id_tree);
         assert_eq!(
-            LOUDSTree::from_id_tree(id_tree).unwrap_err(),
+            tree.unwrap_err(),
             EmptyTreeError
         );
     }
diff --git a/testdata/loudstree_invalid.testdata b/testdata/loudstree_invalid.testdata
new file mode 100644
index 0000000000000000000000000000000000000000..4318da13396d0f974a32b7f727f5bf23ac866417
GIT binary patch
literal 115
zcmZQ#fB`Nj!vRWjKxqXA1_nk31_qcoLI*?~#7`_vDNam*YG9COU|<000`WmQK{PXn
LU|?WK%g+Y@uek)W

literal 0
HcmV?d00001

-- 
GitLab