Removed dup file
This commit is contained in:
		
							parent
							
								
									edea8d56e3
								
							
						
					
					
						commit
						9b28d4cff6
					
				@ -1,136 +0,0 @@
 | 
			
		||||
 | 
			
		||||
pub trait RangeCollection<K, V> {
 | 
			
		||||
	fn have_item(&self, key: &K) -> bool;
 | 
			
		||||
	fn find_item(&self, key: &K) -> Option<&V>;
 | 
			
		||||
	fn get_tail(&mut self, key: &K) -> Range<K>;
 | 
			
		||||
	fn remove_head(&mut self, start: &K);
 | 
			
		||||
	fn remove_tail(&mut self, start: &K);
 | 
			
		||||
	fn insert_item(&mut self, key: K, value: V);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<K, V> RangeCollection<K, V> for Vec<(K, Vec<V>)> where K: Ord + PartialEq + Add<Output = K> + Sub<Output = K> + Copy + FromUsize + ToUsize {
 | 
			
		||||
	fn have_item(&self, key: &K) -> bool {
 | 
			
		||||
		match self.binary_search_by(|&(k, _)| k.cmp(key).reverse()) {
 | 
			
		||||
			Ok(_) => true,
 | 
			
		||||
			Err(index) => match self.get(index + 1) {
 | 
			
		||||
				Some(&(ref k, ref v)) => k <= key && (*k + FromUsize::from_usize(v.len())) > *key,
 | 
			
		||||
				_ => false
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn find_item(&self, key: &K) -> Option<&V> {
 | 
			
		||||
		match self.binary_search_by(|&(k, _)| k.cmp(key).reverse()) {
 | 
			
		||||
			Ok(index) => self.get(index).unwrap().1.get(0),
 | 
			
		||||
			Err(index) => match self.get(index + 1) {
 | 
			
		||||
				Some(&(ref k, ref v)) if k <= key && (*k + FromUsize::from_usize(v.len())) > *key => v.get((*key - *k).to_usize()),
 | 
			
		||||
				_ => None
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Get a range of elements from start till the end of the range
 | 
			
		||||
	fn get_tail(&mut self, key: &K) -> Range<K> {
 | 
			
		||||
		let kv = *key;
 | 
			
		||||
		match self.binary_search_by(|&(k, _)| k.cmp(key).reverse()) {
 | 
			
		||||
			Ok(index) => kv..(kv + FromUsize::from_usize(self[index].1.len())),
 | 
			
		||||
			Err(index) => {
 | 
			
		||||
				let mut empty = false;
 | 
			
		||||
				match self.get_mut(index + 1) {
 | 
			
		||||
					Some(&mut (ref k, ref mut v)) if k <= key && (*k + FromUsize::from_usize(v.len())) > *key => {
 | 
			
		||||
						kv..(*k + FromUsize::from_usize(v.len()))
 | 
			
		||||
					}
 | 
			
		||||
					_ => kv..kv
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	/// Remove element key and following elements in the same range
 | 
			
		||||
	fn remove_tail(&mut self, key: &K) {
 | 
			
		||||
		match self.binary_search_by(|&(k, _)| k.cmp(key).reverse()) {
 | 
			
		||||
			Ok(index) => { self.remove(index); },
 | 
			
		||||
			Err(index) =>{
 | 
			
		||||
				let mut empty = false;
 | 
			
		||||
				match self.get_mut(index + 1) {
 | 
			
		||||
					Some(&mut (ref k, ref mut v)) if k <= key && (*k + FromUsize::from_usize(v.len())) > *key => {
 | 
			
		||||
						v.truncate((*key - *k).to_usize());
 | 
			
		||||
						empty = v.is_empty();
 | 
			
		||||
					}
 | 
			
		||||
					_ => {}
 | 
			
		||||
				}
 | 
			
		||||
				if empty {
 | 
			
		||||
					self.remove(index + 1);
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Remove range elements up to key
 | 
			
		||||
	fn remove_head(&mut self, key: &K) {
 | 
			
		||||
		if *key == FromUsize::from_usize(0) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		let prev = *key - FromUsize::from_usize(1);
 | 
			
		||||
		match self.binary_search_by(|&(k, _)| k.cmp(&prev).reverse()) {
 | 
			
		||||
			Ok(index) => { self.remove(index); },
 | 
			
		||||
			Err(index) => {
 | 
			
		||||
				let mut empty = false;
 | 
			
		||||
				match self.get_mut(index + 1) {
 | 
			
		||||
					Some(&mut (ref mut k, ref mut v)) if *k <= prev && (*k + FromUsize::from_usize(v.len())) > *key => {
 | 
			
		||||
						let head = v.split_off((*key - *k).to_usize());
 | 
			
		||||
						empty = head.is_empty();
 | 
			
		||||
						let removed = ::std::mem::replace(v, head);
 | 
			
		||||
						let new_k = *k - FromUsize::from_usize(removed.len());
 | 
			
		||||
						::std::mem::replace(k, new_k);
 | 
			
		||||
					}
 | 
			
		||||
					_ => {}
 | 
			
		||||
				}
 | 
			
		||||
				if empty {
 | 
			
		||||
					self.remove(index + 1);
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn insert_item(&mut self, key: K, value: V) {
 | 
			
		||||
		assert!(!self.have_item(&key));
 | 
			
		||||
 | 
			
		||||
		let mut lower = match self.binary_search_by(|&(k, _)| k.cmp(&key).reverse()) {
 | 
			
		||||
			Ok(index) => index,
 | 
			
		||||
			Err(index) => index,
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		lower += 1;
 | 
			
		||||
 | 
			
		||||
		let mut to_remove: Option<usize> = None;
 | 
			
		||||
		if lower < self.len() && self[lower].0 + FromUsize::from_usize(self[lower].1.len()) == key {
 | 
			
		||||
				// extend into existing chunk
 | 
			
		||||
				self[lower].1.push(value);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			// insert a new chunk
 | 
			
		||||
			let mut range: Vec<V> = vec![value];
 | 
			
		||||
			self.insert(lower, (key, range));
 | 
			
		||||
		};
 | 
			
		||||
		let next = lower - 1;
 | 
			
		||||
		if next < self.len()
 | 
			
		||||
		{
 | 
			
		||||
			{
 | 
			
		||||
				let (mut next, mut inserted) = self.split_at_mut(lower);
 | 
			
		||||
				let mut next = next.last_mut().unwrap();
 | 
			
		||||
				let mut inserted = inserted.first_mut().unwrap();
 | 
			
		||||
				if next.0 == key + FromUsize::from_usize(1)
 | 
			
		||||
				{
 | 
			
		||||
					inserted.1.append(&mut next.1);
 | 
			
		||||
					to_remove = Some(lower - 1);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if let Some(r) = to_remove {
 | 
			
		||||
				self.remove(r);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user