1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use itertools::Itertools;

#[repr(packed)]
pub struct UserInfoHeader {
    pub page_id: u16,
}

pub const NUM_PAGES:usize = 5000;

#[repr(packed)]
pub struct UserPagesStats {
    pub num_free_slots: [u16; NUM_PAGES],
}

pub fn cast<T>(data: &[u8]) -> &T {
    assert!(data.len() >= std::mem::size_of::<T>());
    return unsafe{std::mem::transmute(data.as_ptr())};
}

pub const INVALID_PAGE_ID:u16 = u16::MAX;

pub fn is_user_active(data:&[u8]) -> bool {
    let user_info_header = cast::<UserInfoHeader>(data);
    return user_info_header.page_id != INVALID_PAGE_ID;
}

pub fn get_best_page_id(data:&[u8]) -> u16 {
    let user_pages_stats = cast::<UserPagesStats>(data);
    let max_page_id = unsafe{user_pages_stats.num_free_slots.iter().position_max().unwrap()};
    assert!(max_page_id < NUM_PAGES);
    return max_page_id as u16;
}