rust/hwphysics/src/common.rs
author alfadur
Tue, 30 Jul 2019 19:53:23 +0300
changeset 15286 8095853811a6
parent 15280 66c987015f2d
child 15287 478d5372eb4a
permissions -rw-r--r--
add gear lookup to the physics processor
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15280
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
     1
use fpnum::{fp, FPNum};
15286
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
     2
use std::{
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
     3
    collections::BinaryHeap,
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
     4
    num::NonZeroU16,
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
     5
    ops::{Add, Index, IndexMut},
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
     6
};
15279
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
     7
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
     8
pub type GearId = NonZeroU16;
15125
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
     9
pub trait GearData {}
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    10
15280
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    11
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
15286
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    12
#[repr(transparent)]
15280
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    13
pub struct Millis(u32);
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    14
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    15
impl Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    16
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    17
    pub fn new(value: u32) -> Self {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    18
        Self(value)
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    19
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    20
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    21
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    22
    pub fn get(self) -> u32 {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    23
        self.0
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    24
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    25
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    26
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    27
    pub fn to_fixed(self) -> FPNum {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    28
        FPNum::new(self.0 as i32, 1000)
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    29
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    30
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    31
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    32
impl Add for Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    33
    type Output = Self;
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    34
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    35
    fn add(self, rhs: Self) -> Self::Output {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    36
        Self(self.0 + rhs.0)
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    37
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    38
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    39
15125
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    40
pub trait GearDataProcessor<T: GearData> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    41
    fn add(&mut self, gear_id: GearId, gear_data: T);
15279
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    42
    fn remove(&mut self, gear_id: GearId);
15125
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    43
}
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    44
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    45
pub trait GearDataAggregator<T: GearData> {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    46
    fn find_processor(&mut self) -> &mut GearDataProcessor<T>;
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
    47
}
15279
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    48
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    49
pub struct GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    50
    max_id: u16,
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    51
    free_ids: BinaryHeap<GearId>,
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    52
}
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    53
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    54
impl GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    55
    pub fn new() -> Self {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    56
        Self {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    57
            max_id: 0,
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    58
            free_ids: BinaryHeap::with_capacity(1024),
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    59
        }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    60
    }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    61
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    62
    pub fn alloc(&mut self) -> Option<GearId> {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    63
        self.free_ids.pop().or_else(|| {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    64
            self.max_id.checked_add(1).and_then(|new_max_id| {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    65
                self.max_id = new_max_id;
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    66
                NonZeroU16::new(new_max_id)
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    67
            })
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    68
        })
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    69
    }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    70
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    71
    pub fn free(&mut self, gear_id: GearId) {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    72
        self.free_ids.push(gear_id)
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    73
    }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    74
}
15286
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    75
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    76
#[derive(Clone, Copy, Default)]
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    77
pub struct LookupEntry<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    78
    pub index: u16,
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    79
    pub value: T,
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    80
}
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    81
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    82
impl<T> LookupEntry<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    83
    pub fn new(index: u16, value: T) -> Self {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    84
        Self { index, value }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    85
    }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    86
}
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    87
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    88
pub struct GearDataLookup<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    89
    lookup: [LookupEntry<T>; u16::max_value() as usize],
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    90
}
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    91
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    92
impl<T: Default + Copy> GearDataLookup<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    93
    pub fn new() -> Self {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    94
        Self {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    95
            lookup: [LookupEntry::<T>::default(); u16::max_value() as usize],
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    96
        }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    97
    }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    98
}
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
    99
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   100
impl<T> GearDataLookup<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   101
    pub fn get(&self, gear_id: GearId) -> &LookupEntry<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   102
        // All possible Gear IDs are valid indices
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   103
        unsafe { self.lookup.get_unchecked(gear_id.get() as usize - 1) }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   104
    }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   105
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   106
    pub fn get_mut(&mut self, gear_id: GearId) -> &mut LookupEntry<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   107
        // All possible Gear IDs are valid indices
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   108
        unsafe { self.lookup.get_unchecked_mut(gear_id.get() as usize - 1) }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   109
    }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   110
}
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   111
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   112
impl<T> Index<GearId> for GearDataLookup<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   113
    type Output = LookupEntry<T>;
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   114
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   115
    fn index(&self, index: GearId) -> &Self::Output {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   116
        self.get(index)
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   117
    }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   118
}
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   119
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   120
impl<T> IndexMut<GearId> for GearDataLookup<T> {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   121
    fn index_mut(&mut self, index: GearId) -> &mut Self::Output {
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   122
        self.get_mut(index)
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   123
    }
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
   124
}