stack_vm/
write_many_table.rs

1//! A key/value table using strings as keys.
2
3use crate::table::Table;
4use std::collections::HashMap;
5
6/// A table which allows values to be overwritten.
7/// Useful for your language's local variables, etc.
8///
9/// ```
10/// use stack_vm::{WriteManyTable, Table};
11/// let mut table: WriteManyTable<usize> = WriteManyTable::new();
12/// assert!(table.is_empty());
13///
14/// table.insert("example", 13);
15/// assert!(!table.is_empty());
16///
17/// assert!(table.contains_key("example"));
18///
19/// let value = *table.get("example").unwrap();
20/// assert_eq!(value, 13);
21///
22/// table.insert("example", 14);
23/// assert!(table.contains_key("example"));
24///
25/// let value = *table.get("example").unwrap();
26/// assert_eq!(value, 14);
27/// ```
28#[derive(Debug, Default)]
29pub struct WriteManyTable<T>(HashMap<String, T>);
30
31impl<T> WriteManyTable<T> {
32    /// Return a new, empty `WriteManyTable`.
33    pub fn new() -> WriteManyTable<T> {
34        WriteManyTable(HashMap::new())
35    }
36}
37
38impl<T> Table for WriteManyTable<T> {
39    type Item = T;
40
41    fn insert(&mut self, name: &str, value: T) {
42        let name = String::from(name);
43        self.0.insert(name, value);
44    }
45
46    fn is_empty(&self) -> bool {
47        self.0.is_empty()
48    }
49
50    fn contains_key(&self, name: &str) -> bool {
51        self.0.contains_key(name)
52    }
53
54    fn get(&self, name: &str) -> Option<&T> {
55        self.0.get(name)
56    }
57}
58#[cfg(test)]
59mod test {
60    use super::*;
61    use crate::table::Table;
62
63    #[test]
64    fn new() {
65        let write_many_table: WriteManyTable<usize> = WriteManyTable::new();
66        assert!(write_many_table.is_empty())
67    }
68
69    #[test]
70    fn insert() {
71        let mut write_many_table: WriteManyTable<usize> = WriteManyTable::new();
72        write_many_table.insert("example", 13);
73        assert!(!write_many_table.is_empty());
74        assert_eq!(*write_many_table.get("example").unwrap(), 13);
75    }
76
77    #[test]
78    fn insert_is_mutable() {
79        let mut write_many_table: WriteManyTable<usize> = WriteManyTable::new();
80        write_many_table.insert("example", 13);
81        assert_eq!(*write_many_table.get("example").unwrap(), 13);
82        write_many_table.insert("example", 14);
83        assert_eq!(*write_many_table.get("example").unwrap(), 14);
84    }
85}