Advertisement
Guest User

Untitled

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