use std::collections::HashMap;
use crate::property::Property;
pub struct PropertyMap {
stored_num: usize,
properties: HashMap<String, Property>,
}
impl PropertyMap {
pub fn new() -> Self {
PropertyMap {
stored_num: 0,
properties: HashMap::new(),
}
}
pub fn stored_num(&self) -> usize {
self.stored_num
}
pub fn get(&self, name: &str) -> Option<&Property> {
self.properties.get(name)
}
pub fn set(&mut self, name: &str, property: Property) -> bool {
if self.properties.contains_key(name) {
false
} else {
self.stored_num += 1;
self.properties.insert(name.to_string(), property);
true
}
}
pub fn set_or_upsert(
&mut self,
name: &str,
property: Property,
) -> (Option<Property>, bool) {
if self.properties.contains_key(name) {
(self.properties.insert(name.to_string(), property), true)
} else {
self.stored_num += 1;
(self.properties.insert(name.to_string(), property), false)
}
}
pub fn remove(&mut self, name: &str) -> bool {
if self.properties.contains_key(name) {
self.stored_num -= 1;
self.properties.remove(name);
true
} else {
false
}
}
pub fn clear(&mut self) {
self.properties.clear();
self.stored_num = 0;
}
pub fn iter(&self) -> std::collections::hash_map::Iter<String, Property> {
self.properties.iter()
}
pub fn iter_mut(&mut self) -> std::collections::hash_map::IterMut<String, Property> {
self.properties.iter_mut()
}
}
impl<'a> Default for PropertyMap {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod test {
use crate::property::PropertyValue;
use super::*;
#[test]
fn propmap_insert() {
let mut propmap = PropertyMap::new();
let prop = Property::new(PropertyValue::Integer(1));
assert!(propmap.set("test", Property::new(PropertyValue::Integer(1))));
assert_eq!(propmap.stored_num(), 1);
assert!(!propmap.set("test", Property::new(PropertyValue::Integer(1))));
assert_eq!(propmap.stored_num(), 1);
}
#[test]
fn propmap_upsert() {
let mut propmap = PropertyMap::new();
let prop = Property::new(PropertyValue::Integer(1));
assert!(!propmap.set_or_upsert("test", Property::new(PropertyValue::Integer(1))).1);
assert_eq!(propmap.stored_num(), 1);
assert!(propmap.set_or_upsert("test", Property::new(PropertyValue::Integer(1))).1);
assert_eq!(propmap.stored_num(), 1);
}
#[test]
fn propmap_remove() {
let mut propmap = PropertyMap::new();
let prop = Property::new(PropertyValue::Integer(1));
assert!(propmap.set("test", prop));
assert_eq!(propmap.stored_num(), 1);
assert!(propmap.remove("test"));
assert_eq!(propmap.stored_num(), 0);
assert!(!propmap.remove("test"));
assert_eq!(propmap.stored_num(), 0);
}
#[test]
fn propmap_clear() {
let mut propmap = PropertyMap::new();
let prop = Property::new(PropertyValue::Integer(1));
assert!(propmap.set("test", prop));
assert_eq!(propmap.stored_num(), 1);
propmap.clear();
assert_eq!(propmap.stored_num(), 0);
}
}