Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.38 KB | None | 0 0
  1. mod array {
  2. use std::marker::PhantomData;
  3.  
  4. #[derive(Debug)]
  5. pub struct Wrapper<'id, T: 'id> {
  6. array: &'id mut Vec<T>,
  7. }
  8.  
  9. #[derive(Clone, Copy, Debug)]
  10. pub struct Index<'id> {
  11. at: usize,
  12. _marker: PhantomData<&'id ()>,
  13. }
  14.  
  15. impl<'id, T: 'id> Wrapper<'id, T> {
  16. pub fn new(array: &'id mut Vec<T>) -> Self {
  17. Wrapper { array, }
  18. }
  19.  
  20. pub fn find(&self, index: usize) -> Option<Index<'id>> {
  21. if index >= self.array.len() {
  22. None
  23. } else {
  24. Some(Index { at: index, _marker: PhantomData, })
  25. }
  26. }
  27.  
  28. pub fn get(&self, index: Index<'id>) -> &T {
  29. unsafe { self.array.get_unchecked(index.at) }
  30. }
  31. }
  32. }
  33.  
  34. fn main() {
  35. let mut xs = vec![0, 1, 2, 3, 4];
  36. let wrapper = array::Wrapper::new(&mut xs);
  37. // xs.push(5);
  38. let i = wrapper.find(3).unwrap();
  39. println!("found it in xs! value @ {:?}: {}", i, wrapper.get(i));
  40.  
  41. // xs.clear();
  42. // println!("still have it! value @ {:?}: {}", i, wrapper.get(i));
  43.  
  44. let mut ys = vec![21, 22, 23, 24, 25, 26, 27, 28, 29, 30];
  45. let other = array::Wrapper::new(&mut ys);
  46. let j = other.find(8).unwrap();
  47. println!("found it in ys! value @ {:?}: {}", j, other.get(j));
  48. // println!("found it in xs! value @ {:?}: {}", j, wrapper.get(j));
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement