add grid/buffer
This commit is contained in:
parent
f3ebc7b919
commit
941da4ed7d
1 changed files with 90 additions and 0 deletions
90
nested/src/grid/buffer.rs
Normal file
90
nested/src/grid/buffer.rs
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
|
||||||
|
use {
|
||||||
|
std::{
|
||||||
|
sync::Arc,
|
||||||
|
collections::HashMap,
|
||||||
|
hash::Hash
|
||||||
|
},
|
||||||
|
std::sync::RwLock,
|
||||||
|
crate::{
|
||||||
|
core::{
|
||||||
|
Observer,
|
||||||
|
ObserverBroadcast,
|
||||||
|
View,
|
||||||
|
InnerViewPort
|
||||||
|
},
|
||||||
|
index::{IndexArea, IndexView}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct GridBuffer<Item> {
|
||||||
|
data: HashMap<Point2<i16>, Item>,
|
||||||
|
limit: Point2<i16>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Item> View for GridBuffer<Item>
|
||||||
|
where Item: Clone + Send + Sync + 'static
|
||||||
|
{
|
||||||
|
type Msg = IndexArea<Point2<i16>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Item> IndexView<Point2<i16>> for GridBufferView<Item>
|
||||||
|
where Item: Clone + Send + Sync + 'static
|
||||||
|
{
|
||||||
|
type Item = Item;
|
||||||
|
|
||||||
|
fn get(&self, key: &Point2<i16>) -> Option<Self::Item> {
|
||||||
|
self.data.get(key).cloned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn area(&self) -> IndexArea<Point2<i16>> {
|
||||||
|
IndexArea::Range(
|
||||||
|
Point2::new(0, 0)
|
||||||
|
..= self.limit
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct GridBufferController<Item>
|
||||||
|
where Item: Clone + Send + Sync + 'static
|
||||||
|
{
|
||||||
|
data: Arc<RwLock<HashMap<Point2<i16>, Item>>>,
|
||||||
|
cast: Arc<RwLock<ObserverBroadcast<dyn IndexView<Point2<i16>, Item = Item>>>>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Key, Item> GridBuffer<Key, Item>
|
||||||
|
where Key: Clone + Hash + Eq + Send + Sync + 'static,
|
||||||
|
Item: Clone + Send + Sync + 'static
|
||||||
|
{
|
||||||
|
pub fn new(port: InnerViewPort<dyn IndexView<Point2<i16>, Item = Item>>) -> Self {
|
||||||
|
let data = Arc::new(RwLock::new(HashMap::<Point2<i16>, Item>::new()));
|
||||||
|
port.set_view(Some(Arc::new(GridBufferView(data.clone()))));
|
||||||
|
|
||||||
|
GridBuffer {
|
||||||
|
data,
|
||||||
|
cast: port.get_broadcast()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn insert(&mut self, key: Point2<i16>, item: Item) {
|
||||||
|
self.data.write().unwrap().insert(key.clone(), item);
|
||||||
|
|
||||||
|
if
|
||||||
|
|
||||||
|
self.cast.notify(&IndexArea::Set(vec![ key ]));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn insert_iter<T>(&mut self, iter: T)
|
||||||
|
where T: IntoIterator<Item = (Point2<i16>, Item)> {
|
||||||
|
for (key, item) in iter {
|
||||||
|
self.insert(key, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn remove(&mut self, key: Point2<i16>) {
|
||||||
|
self.data.write().unwrap().remove(&key);
|
||||||
|
self.cast.notify(&IndexArea::Set(vec![ key ]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue