rust/hwphysics/src/common.rs
author alfadur
Wed, 28 Aug 2019 23:06:34 +0300
changeset 15380 6e3e5be8b2e2
parent 15288 0f734fa371e1
child 15381 52844baced17
permissions -rw-r--r--
update hwphysics motion to use the new system
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15282
478d5372eb4a implement empty gear lookup entries
alfadur
parents: 15281
diff changeset
     1
use fpnum::FPNum;
15281
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15275
diff changeset
     2
use std::{
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15275
diff changeset
     3
    collections::BinaryHeap,
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15275
diff changeset
     4
    num::NonZeroU16,
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15275
diff changeset
     5
    ops::{Add, Index, IndexMut},
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15275
diff changeset
     6
};
15274
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
     7
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
     8
pub type GearId = NonZeroU16;
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14179
diff changeset
     9
15275
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    10
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
15281
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15275
diff changeset
    11
#[repr(transparent)]
15275
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    12
pub struct Millis(u32);
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    13
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    14
impl Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    15
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    16
    pub fn new(value: u32) -> Self {
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    17
        Self(value)
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    18
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    19
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    20
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    21
    pub fn get(self) -> u32 {
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    22
        self.0
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    23
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    24
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    25
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    26
    pub fn to_fixed(self) -> FPNum {
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    27
        FPNum::new(self.0 as i32, 1000)
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    28
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    29
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    30
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    31
impl Add for Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    32
    type Output = Self;
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    33
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    34
    fn add(self, rhs: Self) -> Self::Output {
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    35
        Self(self.0 + rhs.0)
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    36
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    37
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    38
15274
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    39
pub struct GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    40
    max_id: u16,
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    41
    free_ids: BinaryHeap<GearId>,
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    42
}
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    43
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    44
impl GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    45
    pub fn new() -> Self {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    46
        Self {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    47
            max_id: 0,
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    48
            free_ids: BinaryHeap::with_capacity(1024),
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    49
        }
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    50
    }
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    51
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    52
    pub fn alloc(&mut self) -> Option<GearId> {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    53
        self.free_ids.pop().or_else(|| {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    54
            self.max_id.checked_add(1).and_then(|new_max_id| {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    55
                self.max_id = new_max_id;
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    56
                NonZeroU16::new(new_max_id)
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    57
            })
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    58
        })
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    59
    }
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    60
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    61
    pub fn free(&mut self, gear_id: GearId) {
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    62
        self.free_ids.push(gear_id)
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    63
    }
42b710b0f883 add gear allocator
alfadur
parents: 15263
diff changeset
    64
}