rg3d_core/
numeric_range.rs1use 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}