rust/hedgewars-server/src/core/indexslab.rs
author S.D.
Tue, 27 Sep 2022 14:59:03 +0300
changeset 15900 fc3cb23fd26f
parent 15465 61a0bd0bb021
permissions -rw-r--r--
Allow to see rooms of incompatible versions in the lobby For the new clients the room version is shown in a separate column. There is also a hack for previous versions clients: the room vesion specifier is prepended to the room names for rooms of incompatible versions, and the server shows 'incompatible version' error if the client tries to join them.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15141
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     1
use std::{
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     2
    iter,
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     3
    mem::replace,
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     4
    ops::{Index, IndexMut},
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     5
};
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     6
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     7
pub struct IndexSlab<T> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     8
    data: Vec<Option<T>>,
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
     9
}
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    10
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    11
impl<T> IndexSlab<T> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    12
    pub fn new() -> Self {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    13
        Self { data: Vec::new() }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    14
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    15
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    16
    pub fn with_capacity(capacity: usize) -> Self {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    17
        Self {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    18
            data: Vec::with_capacity(capacity),
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    19
        }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    20
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    21
15465
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    22
    pub fn get(&self, index: usize) -> Option<&T> {
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    23
        self.data[index].as_ref()
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    24
    }
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    25
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    26
    pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    27
        self.data[index].as_mut()
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    28
    }
61a0bd0bb021 refactor root handler
alfadur
parents: 15463
diff changeset
    29
15141
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    30
    pub fn insert(&mut self, index: usize, value: T) {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    31
        if index >= self.data.len() {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    32
            self.data.reserve(index - self.data.len() + 1);
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    33
            self.data.extend((self.data.len()..index).map(|_| None));
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    34
            self.data.push(Some(value))
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    35
        } else {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    36
            self.data[index] = Some(value);
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    37
        }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    38
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    39
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    40
    pub fn contains(&self, index: usize) -> bool {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    41
        self.data.get(index).and_then(|x| x.as_ref()).is_some()
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    42
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    43
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    44
    pub fn remove(&mut self, index: usize) -> Option<T> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    45
        if let Some(x) = self.data.get_mut(index) {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    46
            replace(x, None)
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    47
        } else {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    48
            None
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    49
        }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    50
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    51
15463
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15141
diff changeset
    52
    pub fn iter(&self) -> impl Iterator<Item = (usize, &T)> + Clone {
15141
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    53
        self.data
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    54
            .iter()
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    55
            .enumerate()
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    56
            .filter_map(|(index, opt)| opt.as_ref().and_then(|x| Some((index, x))))
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    57
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    58
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    59
    pub fn iter_mut(&mut self) -> impl Iterator<Item = (usize, &mut T)> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    60
        self.data
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    61
            .iter_mut()
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    62
            .enumerate()
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    63
            .filter_map(|(index, opt)| opt.as_mut().and_then(|x| Some((index, x))))
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    64
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    65
}
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    66
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    67
impl<T> Index<usize> for IndexSlab<T> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    68
    type Output = T;
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    69
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    70
    fn index(&self, index: usize) -> &Self::Output {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    71
        self.data[index].as_ref().unwrap()
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    72
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    73
}
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    74
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    75
impl<T> IndexMut<usize> for IndexSlab<T> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    76
    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    77
        self.data[index].as_mut().unwrap()
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    78
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 15095
diff changeset
    79
}