senax-common 0.4.10

Senax common library
Documentation
pub mod db_cache;
pub mod fast_cache;
pub mod msec;

#[cfg(all(feature = "uring", target_os = "linux"))]
pub mod storage_cache;
#[cfg(not(all(feature = "uring", target_os = "linux")))]
#[path = "cache/storage_cache_dummy.rs"]
pub mod storage_cache;

pub trait CycleCounter {
    #[must_use]
    fn cycle_add(&self, rhs: Self) -> Self;
    /// <
    #[must_use]
    fn less_than(&self, rhs: Self) -> bool;
    /// >=
    #[must_use]
    fn greater_equal(&self, rhs: Self) -> bool;
}

impl CycleCounter for u32 {
    fn cycle_add(&self, rhs: Self) -> Self {
        self.wrapping_add(rhs)
    }
    fn less_than(&self, rhs: Self) -> bool {
        self.wrapping_sub(rhs) > Self::MAX / 2
    }
    fn greater_equal(&self, rhs: Self) -> bool {
        !self.less_than(rhs)
    }
}

impl CycleCounter for i32 {
    fn cycle_add(&self, rhs: Self) -> Self {
        let result = self.wrapping_add(rhs);
        if result < 0 {
            result - Self::MIN
        } else {
            result
        }
    }
    fn less_than(&self, rhs: Self) -> bool {
        ((*self as u32) << 1).wrapping_sub((rhs as u32) << 1) > u32::MAX / 2
    }
    fn greater_equal(&self, rhs: Self) -> bool {
        !self.less_than(rhs)
    }
}

impl CycleCounter for u64 {
    fn cycle_add(&self, rhs: Self) -> Self {
        self.wrapping_add(rhs)
    }
    fn less_than(&self, rhs: Self) -> bool {
        self.wrapping_sub(rhs) > Self::MAX / 2
    }
    fn greater_equal(&self, rhs: Self) -> bool {
        !self.less_than(rhs)
    }
}

/// assuming MiMalloc
pub fn calc_mem_size(size: usize) -> usize {
    if size >= 512 * 1024 {
        return size.div_ceil(4096) * 4096;
    }
    let uintptr_t = std::mem::size_of::<usize>();
    let mut wsize = size.div_ceil(uintptr_t);
    if wsize <= 1 {
        return 8;
    }
    if wsize <= 8 {
        return ((wsize + 1) & !1) * 8;
    }
    wsize -= 1;
    let b = uintptr_t * 8 - 1 - wsize.leading_zeros() as usize;
    let bin = ((b << 2) + ((wsize >> (b - 2)) & 0x03)) - 3;
    let rank = bin.div_ceil(4);
    (16 << rank) - (rank * 4 - bin) * (2 << rank)
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test() {
        assert_eq!(1u32.cycle_add(1), 2);
        assert!(1u32.less_than(2));
        assert!(!2u32.less_than(2));
        assert!(!3u32.less_than(2));
        assert!(u32::MAX.less_than(1));
        assert!(0u32.cycle_add(u32::MAX).less_than(1.cycle_add(u32::MAX)));
        assert!(!1u32.cycle_add(u32::MAX).less_than(0.cycle_add(u32::MAX)));
        assert!(1u32.cycle_add(u32::MAX).less_than(2.cycle_add(u32::MAX)));
        assert!(!2u32.cycle_add(u32::MAX).less_than(1.cycle_add(u32::MAX)));
        assert!(0u32.cycle_add(u32::MAX).less_than(2.cycle_add(u32::MAX)));
        assert!(!2u32.cycle_add(u32::MAX).less_than(0.cycle_add(u32::MAX)));

        assert_eq!(1i32.cycle_add(1), 2);
        assert!(1i32.less_than(2));
        assert!(!2i32.less_than(2));
        assert!(!3i32.less_than(2));
        assert!(i32::MAX.less_than(1));
        assert!(0i32.cycle_add(i32::MAX).less_than(1.cycle_add(i32::MAX)));
        assert!(!1i32.cycle_add(i32::MAX).less_than(0.cycle_add(i32::MAX)));
        assert!(1i32.cycle_add(i32::MAX).less_than(2.cycle_add(i32::MAX)));
        assert!(!2i32.cycle_add(i32::MAX).less_than(1.cycle_add(i32::MAX)));
        assert!(0i32.cycle_add(i32::MAX).less_than(2.cycle_add(i32::MAX)));
        assert!(!2i32.cycle_add(i32::MAX).less_than(0.cycle_add(i32::MAX)));
    }

    #[test]
    fn test_mem_size() {
        assert_eq!(calc_mem_size(15), 16);
        assert_eq!(calc_mem_size(16), 16);
        assert_eq!(calc_mem_size(17), 32);
        assert_eq!(calc_mem_size(31), 32);
        assert_eq!(calc_mem_size(32), 32);
        assert_eq!(calc_mem_size(33), 48);
        assert_eq!(calc_mem_size(47), 48);
        assert_eq!(calc_mem_size(48), 48);
        assert_eq!(calc_mem_size(49), 64);
        assert_eq!(calc_mem_size(63), 64);
        assert_eq!(calc_mem_size(64), 64);
        assert_eq!(calc_mem_size(65), 80);
        assert_eq!(calc_mem_size(79), 80);
        assert_eq!(calc_mem_size(80), 80);
        assert_eq!(calc_mem_size(81), 96);
        assert_eq!(calc_mem_size(95), 96);
        assert_eq!(calc_mem_size(96), 96);
        assert_eq!(calc_mem_size(97), 112);
        assert_eq!(calc_mem_size(111), 112);
        assert_eq!(calc_mem_size(112), 112);
        assert_eq!(calc_mem_size(113), 128);
        assert_eq!(calc_mem_size(128), 128);
        assert_eq!(calc_mem_size(129), 160);
        assert_eq!(calc_mem_size(160), 160);
        assert_eq!(calc_mem_size(161), 192);
        assert_eq!(calc_mem_size(192), 192);
        assert_eq!(calc_mem_size(193), 224);
        assert_eq!(calc_mem_size(224), 224);
        assert_eq!(calc_mem_size(225), 256);
        assert_eq!(calc_mem_size(256), 256);
        assert_eq!(calc_mem_size(257), 320);
        assert_eq!(calc_mem_size(320), 320);
        assert_eq!(calc_mem_size(321), 384);
        assert_eq!(calc_mem_size(384), 384);
        assert_eq!(calc_mem_size(385), 448);
        assert_eq!(calc_mem_size(448), 448);
        assert_eq!(calc_mem_size(449), 512);
        assert_eq!(calc_mem_size(7169), 8192);
        assert_eq!(calc_mem_size(524288), 524288);
        assert_eq!(calc_mem_size(524289), 528384);
    }
}