1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use std::cmp::Ordering;
use std::fmt;
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct Version {
pub major: u16,
pub minor: u16,
pub patch: u16,
}
impl fmt::Debug for Version {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "{}.{}.{}", self.major, self.minor, self.patch)
}
}
impl fmt::Display for Version {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(self, formatter)
}
}
impl PartialOrd for Version {
#[inline]
fn partial_cmp(&self, other: &Version) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Version {
fn cmp(&self, other: &Version) -> Ordering {
match self.major.cmp(&other.major) {
Ordering::Equal => (),
o => return o
};
match self.minor.cmp(&other.minor) {
Ordering::Equal => (),
o => return o
};
self.patch.cmp(&other.patch)
}
}
impl Version {
#[inline]
pub fn from_vulkan_version(value: u32) -> Version {
Version {
major: ((value & 0xffc00000) >> 22) as u16,
minor: ((value & 0x003ff000) >> 12) as u16,
patch: (value & 0x00000fff) as u16,
}
}
#[inline]
pub fn into_vulkan_version(&self) -> u32 {
assert!(self.major <= 0x3ff);
assert!(self.minor <= 0x3ff);
assert!(self.patch <= 0xfff);
(self.major as u32) << 22 | (self.minor as u32) << 12 | (self.patch as u32)
}
}
#[cfg(test)]
mod tests {
use super::Version;
#[test]
fn into_vk_version() {
let version = Version { major: 1, minor: 0, patch: 0 };
assert_eq!(version.into_vulkan_version(), 0x400000);
}
#[test]
fn greater_major() {
let v1 = Version { major: 1, minor: 0, patch: 0 };
let v2 = Version { major: 2, minor: 0, patch: 0 };
assert!(v2 > v1);
}
#[test]
fn greater_minor() {
let v1 = Version { major: 1, minor: 1, patch: 0 };
let v2 = Version { major: 1, minor: 3, patch: 0 };
assert!(v2 > v1);
}
#[test]
fn greater_patch() {
let v1 = Version { major: 1, minor: 0, patch: 4 };
let v2 = Version { major: 1, minor: 0, patch: 5 };
assert!(v2 > v1);
}
}