team04_server/lobby/state/
matchups.rs1#[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 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}