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
use std::ops::{Deref, DerefMut}; #[derive(Debug)] pub struct IncompleteVector<T> { next_marker: Option<String>, vector: Vec<T>, } #[allow(dead_code)] impl<'a, T> IncompleteVector<T> { pub fn new(next_marker: Option<String>, vector: Vec<T>) -> IncompleteVector<T> { IncompleteVector { next_marker: next_marker, vector: vector, } } pub fn next_marker(&self) -> Option<&str> { match self.next_marker { Some(ref nm) => Some(nm), None => None, } } pub fn is_complete(&self) -> bool { self.next_marker().is_none() } } impl<T> DerefMut for IncompleteVector<T> { fn deref_mut(&mut self) -> &mut [T] { &mut self.vector } } impl<T> Deref for IncompleteVector<T> { type Target = [T]; fn deref(&self) -> &[T] { &self.vector } } #[cfg(test)] mod test { #[allow(unused_imports)] use super::IncompleteVector; #[test] fn test_incomplete_vector_complete() { let v = vec![0, 1, 2, 3, 4, 5]; let ic = IncompleteVector::new(None, v); assert_eq!(ic.is_complete(), true); } #[test] fn test_incomplete_vector_incomplete() { let v = vec![0, 1, 2, 3, 4, 5]; let ic = IncompleteVector::new(Some("aaa".to_owned()), v); assert_eq!(ic.is_complete(), false); } #[test] fn test_incomplete_vector_deref() { let v = vec![0, 1, 2, 3, 4, 5]; let ic = IncompleteVector::new(None, v); assert_eq!(ic[0], 0); } }