1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
use crate::{Entry, GraphError, Query, ValueProvider};
use std::collections::BTreeMap;
/// # Arguments
///
/// * `index`:
///
/// returns: Option<Cow<Self::Node>>
///
/// # Examples
///
/// ```
/// use graph_theory::GraphEngine;
/// ```
#[derive(Clone, Debug)]
pub struct DictStorage<T> {
nodes: BTreeMap<usize, T>,
edges: BTreeMap<usize, T>,
}
// noinspection DuplicatedCode
impl<'i, T> ValueProvider<'i, T> for DictStorage<T>
where
T: 'i + Send + Sync,
{
type ValueRef = &'i T;
type ValueMut = &'i mut T;
fn get_value(&'i self, query: Query) -> Result<Self::ValueRef, GraphError> {
match self.get_data(query) {
Some(item) => Ok(item),
None => Err(GraphError::not_found(query)),
}
}
fn mut_value(&'i mut self, query: Query) -> Result<Self::ValueMut, GraphError> {
match self.mut_data(query) {
Some(item) => Ok(item),
None => Err(GraphError::not_found(query)),
}
}
}
impl<T> DictStorage<T> {
/// # Arguments
///
/// * `index`:
///
/// returns: Option<Cow<Self::Node>>
///
/// # Examples
///
/// ```
/// use graph_theory::GraphEngine;
/// ```
pub fn get_data(&self, query: Query) -> Option<&T> {
let item = match query.entry {
Entry::Node => self.nodes.get(&query.index)?,
Entry::Edge => self.edges.get(&query.index)?,
};
Some(item)
}
/// # Arguments
///
/// * `index`:
///
/// returns: Option<Cow<Self::Node>>
///
/// # Examples
///
/// ```
/// use graph_theory::GraphEngine;
/// ```
pub fn mut_data(&mut self, query: Query) -> Option<&mut T> {
let item = match query.entry {
Entry::Node => self.nodes.get_mut(&query.index)?,
Entry::Edge => self.edges.get_mut(&query.index)?,
};
Some(item)
}
/// # Arguments
///
/// * `index`:
///
/// returns: Option<Cow<Self::Node>>
///
/// # Examples
///
/// ```
/// use graph_theory::GraphEngine;
/// ```
pub fn set_data(&mut self, query: Query, data: T) {
match query.entry {
Entry::Node => {
self.nodes.insert(query.index, data);
}
Entry::Edge => {
self.edges.insert(query.index, data);
}
};
}
}