team04_server/lobby/state/
matchups.rs

1#[derive(Debug)]
2pub struct Matchups {
3    players: usize,
4    matchups: Vec<u32>,
5}
6
7impl Matchups {
8    pub fn new(player_count: usize) -> Self {
9        Self {
10            players: player_count,
11            matchups: vec![0; (1..player_count).sum()],
12        }
13    }
14    pub fn get_frequency(&self, player1: usize, player2: usize) -> u32 {
15        self.matchups[self.frequency_index(player1, player2)]
16    }
17    fn frequency_index(&self, player1: usize, player2: usize) -> usize {
18        let (p1, p2) = (player1.min(player2), player1.max(player2));
19        // player 0 starts at index 0,
20        // player 1 starts at (self.players-1),
21        // player 1 starts (self.players-2) behind that, ...
22        let start: usize = (1..self.players).rev().take(p1).sum();
23        start
24            + (p2 - p1)
25                .checked_sub(1)
26                .expect("player ids must be different")
27    }
28}
29
30#[cfg(test)]
31mod test {
32    use super::Matchups;
33
34    #[test]
35    fn freq_index() {
36        let m = Matchups::new(4);
37        assert_eq!(m.frequency_index(0, 1), 0);
38        assert_eq!(m.frequency_index(0, 2), 1);
39        assert_eq!(m.frequency_index(0, 3), 2);
40        assert_eq!(m.frequency_index(1, 2), 3);
41        assert_eq!(m.frequency_index(3, 1), 4);
42        assert_eq!(m.frequency_index(3, 2), 5);
43        assert_eq!(m.matchups.len(), 6);
44    }
45}