Skip to content

Commit 5cee826

Browse files
authored
Optimize parse_version in find_tools.rs (#1527)
* Optimize parse_version in find_tools.rs Avoid heap alloc given that it can have at most 4 numbers * Fix find_msvc_15plus in find_tools.rs * Fix find_tools.rs * More optimization for parse_version find_tools.rs Use 0 onstead of None * Fmt find_tools.rs * Fix find_tools.rs
1 parent 3b6457d commit 5cee826

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/windows/find_tools.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -632,11 +632,19 @@ mod impl_ {
632632

633633
// Inspired from official microsoft/vswhere ParseVersionString
634634
// i.e. at most four u16 numbers separated by '.'
635-
fn parse_version(version: &str) -> Option<Vec<u16>> {
636-
version
637-
.split('.')
638-
.map(|chunk| u16::from_str(chunk).ok())
639-
.collect()
635+
fn parse_version(version: &str) -> Option<[u16; 4]> {
636+
let mut iter = version.split('.').map(u16::from_str).fuse();
637+
let mut get_next_number = move || match iter.next() {
638+
Some(Ok(version_part)) => Some(version_part),
639+
Some(Err(_)) => None,
640+
None => Some(0),
641+
};
642+
Some([
643+
get_next_number()?,
644+
get_next_number()?,
645+
get_next_number()?,
646+
get_next_number()?,
647+
])
640648
}
641649

642650
pub(super) fn find_msvc_15plus(

0 commit comments

Comments
 (0)