rg3d_core/
numeric_range.rs

1use crate::num_traits::Num;
2use rand::{distributions::uniform::SampleUniform, Rng};
3use std::ops::Range;
4
5fn min<T>(a: T, b: T) -> T
6where
7    T: PartialOrd,
8{
9    if a > b {
10        b
11    } else {
12        a
13    }
14}
15
16fn max<T>(a: T, b: T) -> T
17where
18    T: PartialOrd,
19{
20    if a > b {
21        a
22    } else {
23        b
24    }
25}
26
27pub trait RangeExt<T>
28where
29    T: Num + PartialOrd + SampleUniform + Copy,
30{
31    fn random(&self) -> T;
32
33    fn clamp_value(&self, value: &mut T) -> T;
34}
35
36impl<T: Num + PartialOrd + SampleUniform + Copy> RangeExt<T> for Range<T> {
37    #[inline]
38    fn random(&self) -> T {
39        let start = min(self.start, self.end);
40        let end = max(self.start, self.end);
41        rand::thread_rng().gen_range(Range { start, end })
42    }
43
44    #[inline]
45    fn clamp_value(&self, value: &mut T) -> T {
46        let start = min(self.start, self.end);
47        let end = max(self.start, self.end);
48
49        if *value < start {
50            start
51        } else if *value > end {
52            end
53        } else {
54            *value
55        }
56    }
57}