solana_data_structs 0.2.0

Data structures optimized for usage in on-chain Solana programs.
Documentation
use borsh::{BorshDeserialize, BorshSerialize};
use rkyv::{Archive, Deserialize, Serialize};

use crate::{graph_node::GraphNode, GraphEdge};

#[derive(Debug, Archive, Deserialize, Serialize, BorshSerialize, BorshDeserialize)]
pub struct FlatGraph<D, E> {
    pub nodes: Vec<GraphNode<D, E>>,
}

impl<D, E> FlatGraph<D, E>
where
    D: Clone,
    E: Clone,
{
    pub fn new(root_data: &D) -> Self {
        Self {
            nodes: vec![GraphNode::new(root_data.clone())],
        }
    }

    pub fn append(&mut self, prev: usize, edge_data: &E, node_data: &D) {
        let node = GraphNode::new(node_data.clone());
        self.nodes.push(node);
        let index = self.nodes.len() - 1;
        self.nodes[prev]
            .edges
            .push(GraphEdge::new(edge_data.clone(), index));
    }
}

#[cfg(test)]
mod flat_graph_tests {
    use super::*;

    #[test]
    fn create_root() {
        let root_data = "Hello, world!";
        let graph: FlatGraph<&str, &str> = FlatGraph::new(&root_data);
        assert_eq!(graph.nodes.len(), 1);
        assert_eq!(graph.nodes[0].data, root_data);
        println!("{:?}", graph);
    }

    #[test]
    fn append_child() {
        let root_data = "Hello, world!";
        let mut graph: FlatGraph<&str, &str> = FlatGraph::new(&root_data);
        let child_data = "Hello, child!";
        graph.append(0, &"to child", &child_data);
        assert_eq!(graph.nodes.len(), 2);
        assert_eq!(graph.nodes[0].edges.len(), 1);
        assert_eq!(graph.nodes[0].edges[0].data, "to child");
        assert_eq!(graph.nodes[0].edges[0].node, 1);
        assert_eq!(graph.nodes[1].data, child_data);

        let child_data = "Hello, other child!";
        graph.append(0, &"to other child", &child_data);
        assert_eq!(graph.nodes.len(), 3);
        assert_eq!(graph.nodes[0].edges.len(), 2);
        assert_eq!(graph.nodes[0].edges[1].data, "to other child");
        assert_eq!(graph.nodes[0].edges[1].node, 2);
        assert_eq!(graph.nodes[2].data, child_data);

        println!("{:?}", graph);
    }
}