1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
use std::mem; use information::InformationAssociator; use information::InformationProvider; use information::InformationOrganizer; pub struct VecGraphInformation<TInformation> { information: Vec<Option<TInformation>>, } impl <TInformation> VecGraphInformation<TInformation> { pub fn new() -> Self { VecGraphInformation{ information: Vec::<Option<TInformation>>::new() } } fn take_information_option(&mut self, vertex_id: usize) -> Option<TInformation> { mem::replace(&mut self.information[vertex_id], None) } } impl <TInformation> InformationAssociator<TInformation> for VecGraphInformation<TInformation> { fn add_information(&mut self, vertex_id: usize, information: TInformation) { let length_to_grow = (self.information.len() - vertex_id) + 1; if length_to_grow > 0 { self.information.extend((0..length_to_grow).map(|_| None)); } self.information[vertex_id] = Some(information); } fn remove_information(&mut self, vertex_id: usize) { self.take_information_option(vertex_id); } } impl <TInformation> InformationProvider<TInformation> for VecGraphInformation<TInformation> { fn get_all_information(&self) -> Vec<&TInformation> { let information = &self.information; information .into_iter() .filter(|item| item.is_some()) .map(|item| item.as_ref().unwrap()) .collect() } fn get_all_information_mut<'a>(&'a mut self) -> Vec<&'a mut TInformation> { let information = &mut self.information; information .into_iter() .filter(|item| item.is_some()) .map(|item| item.as_mut().unwrap()) .collect() } fn get_information(&self, vertex_id: usize) -> &TInformation { self.information[vertex_id].as_ref().unwrap() } fn get_information_mut<'a>(&'a mut self, vertex_id: usize) -> &'a mut TInformation { self.information[vertex_id].as_mut().unwrap() } } impl <TInformation> InformationOrganizer for VecGraphInformation<TInformation> { fn reorganize_information(&mut self, new_vertex_id_layout: &Vec<usize>) { let amount_of_new_information = new_vertex_id_layout.len(); let mut new_information: Vec<Option<TInformation>> = (0..amount_of_new_information).map(|_| None).collect(); let amount_of_old_information = self.information.len(); for old_vertex_id in 0..amount_of_old_information { if self.information[old_vertex_id].is_some() { let old_vertex_information_option = self.take_information_option(old_vertex_id); let new_vertex_id = new_vertex_id_layout[old_vertex_id]; new_information[new_vertex_id] = old_vertex_information_option; } } self.information = new_information } }