1use itertools::Itertools;
2
3#[repr(packed)]
4pub struct UserInfoHeader {
5 pub page_id: u16,
6}
7
8pub const NUM_PAGES:usize = 5000;
9
10#[repr(packed)]
11pub struct UserPagesStats {
12 pub num_free_slots: [u16; NUM_PAGES],
13}
14
15pub fn cast<T>(data: &[u8]) -> &T {
16 assert!(data.len() >= std::mem::size_of::<T>());
17 return unsafe{std::mem::transmute(data.as_ptr())};
18}
19
20pub const INVALID_PAGE_ID:u16 = u16::MAX;
21
22pub fn is_user_active(data:&[u8]) -> bool {
23 let user_info_header = cast::<UserInfoHeader>(data);
24 return user_info_header.page_id != INVALID_PAGE_ID;
25}
26
27pub fn get_best_page_id(data:&[u8]) -> u16 {
28 let user_pages_stats = cast::<UserPagesStats>(data);
29 #[allow(unaligned_references)] {
30 let max_page_id = user_pages_stats.num_free_slots.iter().position_max().unwrap();
31 assert!(max_page_id < NUM_PAGES);
32 return max_page_id as u16;
33 }
34}