Transfer region cache draft
This commit is contained in:
parent
3982d1a7a1
commit
12a8e82015
|
@ -3,6 +3,7 @@ pub mod plate;
|
||||||
pub mod plate_instances;
|
pub mod plate_instances;
|
||||||
pub mod transfer;
|
pub mod transfer;
|
||||||
pub mod transfer_region;
|
pub mod transfer_region;
|
||||||
|
pub mod transfer_region_cache;
|
||||||
pub mod transfer_volume;
|
pub mod transfer_volume;
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
use crate::transfer::Transfer;
|
||||||
|
use crate::Well;
|
||||||
|
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct TransferRegionCache {
|
||||||
|
interior: Arc<Mutex<TransferRegionCacheInterior>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TransferRegionCache {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
TransferRegionCache {
|
||||||
|
interior: Arc::new(Mutex::new(TransferRegionCacheInterior::new()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_overwrite(&self, tr: &Transfer) {
|
||||||
|
let source = tr.transfer_region.get_source_wells();
|
||||||
|
let destination = tr.transfer_region.get_destination_wells();
|
||||||
|
let uuid = tr.id;
|
||||||
|
|
||||||
|
if let Ok(mut interior) = self.interior.lock() {
|
||||||
|
interior.cache.insert(uuid, InteriorWellSlices {
|
||||||
|
source: source.into(),
|
||||||
|
destination: destination.into(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn invalidate(&self, tr: &Transfer) {
|
||||||
|
if let Ok(mut interior) = self.interior.lock() {
|
||||||
|
interior.cache.remove(&tr.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_source(&self, tr: &Transfer) -> Option<Arc<[Well]>> {
|
||||||
|
self.get(tr, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_destination(&self, tr: &Transfer) -> Option<Arc<[Well]>> {
|
||||||
|
self.get(tr, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self, tr: &Transfer, is_source: bool) -> Option<Arc<[Well]>> {
|
||||||
|
if let Ok(interior) = self.interior.lock() {
|
||||||
|
interior.cache.get(&tr.id).map(|x|
|
||||||
|
if is_source {
|
||||||
|
x.source.clone()
|
||||||
|
} else {
|
||||||
|
x.destination.clone()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Clone for TransferRegionCache {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
// Clone the interior RC without letting anyone know
|
||||||
|
// shhhh!
|
||||||
|
TransferRegionCache {
|
||||||
|
interior: self.interior.clone(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct TransferRegionCacheInterior {
|
||||||
|
cache: HashMap<Uuid, InteriorWellSlices>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TransferRegionCacheInterior {
|
||||||
|
fn new() -> Self {
|
||||||
|
TransferRegionCacheInterior {
|
||||||
|
cache: HashMap::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct InteriorWellSlices {
|
||||||
|
source: Arc<[Well]>,
|
||||||
|
destination: Arc<[Well]>,
|
||||||
|
}
|
Loading…
Reference in New Issue