rust/hedgewars-server/src/server/indexslab.rs
author alfadur <mail@none>
Thu, 07 Feb 2019 14:49:51 +0300
changeset 14692 e5415faa117b
child 14693 6a2e13e36b7f
permissions -rw-r--r--
add data structure for extending slabs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14692
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     1
use std::{
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     2
    iter,
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     3
    ops::{Index, IndexMut},
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     4
};
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     5
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     6
pub struct IndexSlab<T> {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     7
    data: Vec<Option<T>>,
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     8
}
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
     9
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    10
impl<T> IndexSlab<T> {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    11
    pub fn new() -> Self {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    12
        Self { data: Vec::new() }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    13
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    14
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    15
    pub fn with_capacity(capacity: usize) -> Self {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    16
        Self {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    17
            data: Vec::with_capacity(capacity),
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    18
        }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    19
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    20
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    21
    pub fn insert(&mut self, index: usize, value: T) {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    22
        if index >= self.data.len() {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    23
            self.data.reserve(index - self.data.len() + 1);
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    24
            self.data.extend((self.data.len()..index).map(|_| None));
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    25
            self.data.push(Some(value))
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    26
        } else {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    27
            self.data[index] = Some(value);
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    28
        }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    29
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    30
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    31
    pub fn contains(&self, index: usize) -> bool {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    32
        self.data.get(index).and_then(|x| x.as_ref()).is_some()
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    33
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    34
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    35
    pub fn remove(&mut self, index: usize) {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    36
        if let Some(x) = self.data.get_mut(index) {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    37
            *x = None
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    38
        }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    39
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    40
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    41
    pub fn iter(&self) -> impl Iterator<Item = (usize, &T)> {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    42
        self.data
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    43
            .iter()
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    44
            .enumerate()
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    45
            .filter_map(|(index, opt)| opt.as_ref().and_then(|x| Some((index, x))))
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    46
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    47
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    48
    pub fn iter_mut(&mut self) -> impl Iterator<Item = (usize, &mut T)> {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    49
        self.data
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    50
            .iter_mut()
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    51
            .enumerate()
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    52
            .filter_map(|(index, opt)| opt.as_mut().and_then(|x| Some((index, x))))
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    53
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    54
}
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    55
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    56
impl<T> Index<usize> for IndexSlab<T> {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    57
    type Output = T;
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    58
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    59
    fn index(&self, index: usize) -> &Self::Output {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    60
        self.data[index].as_ref().unwrap()
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    61
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    62
}
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    63
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    64
impl<T> IndexMut<usize> for IndexSlab<T> {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    65
    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    66
        self.data[index].as_mut().unwrap()
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    67
    }
e5415faa117b add data structure for extending slabs
alfadur <mail@none>
parents:
diff changeset
    68
}