comparison rust/hg-core/src/revlog/path_encode.rs @ 50162:6baea276a985

rhg: use generic DestArr in hash_mangle This simplifies code a bit more, but comes with an extra memory copy in case [destlen == dest_vec.len()]. This is probably fine, but a follow-up change is removing that too.
author Arseniy Alekseyev <aalekseyev@janestreet.com>
date Thu, 16 Feb 2023 18:46:44 +0000
parents 5d7ba99da3b8
children 11661326b410
comparison
equal deleted inserted replaced
50161:5d7ba99da3b8 50162:6baea276a985
543 let last_dot: Option<usize> = { 543 let last_dot: Option<usize> = {
544 let s = last_slash.unwrap_or(0); 544 let s = last_slash.unwrap_or(0);
545 src[s..].iter().rposition(|b| *b == b'.').map(|i| i + s) 545 src[s..].iter().rposition(|b| *b == b'.').map(|i| i + s)
546 }; 546 };
547 547
548 let mut dest_vec = vec![0; MAXSTOREPATHLEN]; 548 let mut dest : DestArr<MAXSTOREPATHLEN> = DestArr::create();
549 let mut dest = Dest::create(&mut dest_vec);
550 dest.write_bytes(b"dh/"); 549 dest.write_bytes(b"dh/");
551 550
552 if let Some(last_slash) = last_slash { 551 if let Some(last_slash) = last_slash {
553 for slice in src[..last_slash].split(|b| *b == b'/') { 552 for slice in src[..last_slash].split(|b| *b == b'/') {
554 let slice = &slice[..std::cmp::min(slice.len(), dirprefixlen)]; 553 let slice = &slice[..std::cmp::min(slice.len(), dirprefixlen)];
588 hexencode(&mut dest, *c); 587 hexencode(&mut dest, *c);
589 } 588 }
590 if let Some(l) = last_dot { 589 if let Some(l) = last_dot {
591 dest.write_bytes(&src[l..]); 590 dest.write_bytes(&src[l..]);
592 } 591 }
593 let destlen = dest.len; 592 dest.contents().to_vec()
594 if destlen == dest_vec.len() {
595 dest_vec
596 } else {
597 // sometimes the path are shorter than MAXSTOREPATHLEN
598 dest_vec[..destlen].to_vec()
599 }
600 } 593 }
601 594
602 fn hash_encode(src: &[u8]) -> Vec<u8> { 595 fn hash_encode(src: &[u8]) -> Vec<u8> {
603 let mut dired: DestArr<MAXENCODE> = DestArr::create(); 596 let mut dired: DestArr<MAXENCODE> = DestArr::create();
604 let mut lowered: DestArr<MAXENCODE> = DestArr::create(); 597 let mut lowered: DestArr<MAXENCODE> = DestArr::create();