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 transfer;
 | 
			
		||||
pub mod transfer_region;
 | 
			
		||||
pub mod transfer_region_cache;
 | 
			
		||||
pub mod transfer_volume;
 | 
			
		||||
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