ncollide3d/utils/sort.rs
1// FIXME: do this out-of-place?
2
3/// Sorts two values in increasing order.
4#[inline]
5pub fn sort2<'a, N: PartialOrd>(a: &'a N, b: &'a N) -> (&'a N, &'a N) {
6 if *a <= *b {
7 (a, b)
8 } else {
9 (b, a)
10 }
11}
12
13/// Sorts a set of three values in increasing order.
14#[inline]
15pub fn sort3<'a, N: PartialOrd>(a: &'a N, b: &'a N, c: &'a N) -> (&'a N, &'a N, &'a N) {
16 let a_b = *a > *b;
17 let a_c = *a > *c;
18 let b_c = *b > *c;
19
20 let sa;
21 let sb;
22 let sc;
23
24 // Sort the three values.
25 // FIXME: move this to the utilities?
26 if a_b {
27 // a > b
28 if a_c {
29 // a > c
30 sc = a;
31
32 if b_c {
33 // b > c
34 sa = c;
35 sb = b;
36 } else {
37 // b <= c
38 sa = b;
39 sb = c;
40 }
41 } else {
42 // a <= c
43 sa = b;
44 sb = a;
45 sc = c;
46 }
47 } else {
48 // a < b
49 if !a_c {
50 // a <= c
51 sa = a;
52
53 if b_c {
54 // b > c
55 sb = c;
56 sc = b;
57 } else {
58 sb = b;
59 sc = c;
60 }
61 } else {
62 // a > c
63 sa = c;
64 sb = a;
65 sc = b;
66 }
67 }
68
69 (sa, sb, sc)
70}