Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- mod array {
- use std::marker::PhantomData;
- #[derive(Debug)]
- pub struct Wrapper<'id, T: 'id> {
- array: &'id mut Vec<T>,
- }
- #[derive(Clone, Copy, Debug)]
- pub struct Index<'id> {
- at: usize,
- _marker: PhantomData<&'id ()>,
- }
- impl<'id, T: 'id> Wrapper<'id, T> {
- pub fn new(array: &'id mut Vec<T>) -> Self {
- Wrapper { array, }
- }
- pub fn find(&self, index: usize) -> Option<Index<'id>> {
- if index >= self.array.len() {
- None
- } else {
- Some(Index { at: index, _marker: PhantomData, })
- }
- }
- pub fn get(&self, index: Index<'id>) -> &T {
- unsafe { self.array.get_unchecked(index.at) }
- }
- }
- }
- fn main() {
- let mut xs = vec![0, 1, 2, 3, 4];
- let wrapper = array::Wrapper::new(&mut xs);
- // xs.push(5);
- let i = wrapper.find(3).unwrap();
- println!("found it in xs! value @ {:?}: {}", i, wrapper.get(i));
- // xs.clear();
- // println!("still have it! value @ {:?}: {}", i, wrapper.get(i));
- let mut ys = vec![21, 22, 23, 24, 25, 26, 27, 28, 29, 30];
- let other = array::Wrapper::new(&mut ys);
- let j = other.find(8).unwrap();
- println!("found it in ys! value @ {:?}: {}", j, other.get(j));
- // println!("found it in xs! value @ {:?}: {}", j, wrapper.get(j));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement