comparison rust/hg-core/src/revlog/path_encode.rs @ 50164:8e50aa0db347

rhg: in path_encode, use Vec directly instead of VecDest No need to have a trivial wrapper over the type. There's nothing confusing about vec.write_bytes(...), after all.
author Arseniy Alekseyev <aalekseyev@janestreet.com>
date Thu, 16 Feb 2023 19:03:17 +0000
parents 11661326b410
children 4180c988d1d5
comparison
equal deleted inserted replaced
50163:11661326b410 50164:8e50aa0db347
75 self.buf[self.len..self.len + src.len()].copy_from_slice(src); 75 self.buf[self.len..self.len + src.len()].copy_from_slice(src);
76 self.len += src.len(); 76 self.len += src.len();
77 } 77 }
78 } 78 }
79 79
80 struct VecDest {
81 buf: Vec<u8>,
82 }
83
84 struct MeasureDest { 80 struct MeasureDest {
85 pub len: usize, 81 pub len: usize,
86 } 82 }
87 83
88 impl VecDest { 84 impl Sink for Vec<u8> {
89 pub fn create(capacity : usize) -> Self {
90 Self {
91 buf: Vec::with_capacity(capacity),
92 }
93 }
94 }
95
96 impl Sink for VecDest {
97 fn write_byte(&mut self, c: u8) { 85 fn write_byte(&mut self, c: u8) {
98 self.buf.push(c) 86 self.push(c)
99 } 87 }
100 88
101 fn write_bytes(&mut self, src: &[u8]) { 89 fn write_bytes(&mut self, src: &[u8]) {
102 self.buf.extend_from_slice(src) 90 self.extend_from_slice(src)
103 } 91 }
104 } 92 }
105 93
106 impl MeasureDest { 94 impl MeasureDest {
107 fn create() -> Self { 95 fn create() -> Self {
542 let last_dot: Option<usize> = { 530 let last_dot: Option<usize> = {
543 let s = last_slash.unwrap_or(0); 531 let s = last_slash.unwrap_or(0);
544 src[s..].iter().rposition(|b| *b == b'.').map(|i| i + s) 532 src[s..].iter().rposition(|b| *b == b'.').map(|i| i + s)
545 }; 533 };
546 534
547 let mut dest : VecDest = VecDest::create(MAXSTOREPATHLEN); 535 let mut dest = Vec::with_capacity(MAXSTOREPATHLEN);
548 dest.write_bytes(b"dh/"); 536 dest.write_bytes(b"dh/");
549 537
550 if let Some(last_slash) = last_slash { 538 if let Some(last_slash) = last_slash {
551 for slice in src[..last_slash].split(|b| *b == b'/') { 539 for slice in src[..last_slash].split(|b| *b == b'/') {
552 let slice = &slice[..std::cmp::min(slice.len(), dirprefixlen)]; 540 let slice = &slice[..std::cmp::min(slice.len(), dirprefixlen)];
553 if dest.buf.len() + slice.len() > maxshortdirslen + 3 { 541 if dest.len() + slice.len() > maxshortdirslen + 3 {
554 break; 542 break;
555 } else { 543 } else {
556 dest.write_bytes(slice); 544 dest.write_bytes(slice);
557 } 545 }
558 dest.write_byte(b'/'); 546 dest.write_byte(b'/');
559 } 547 }
560 } 548 }
561 549
562 let used = dest.buf.len() + 40 + { 550 let used = dest.len() + 40 + {
563 if let Some(l) = last_dot { 551 if let Some(l) = last_dot {
564 src.len() - l 552 src.len() - l
565 } else { 553 } else {
566 0 554 0
567 } 555 }
586 hexencode(&mut dest, *c); 574 hexencode(&mut dest, *c);
587 } 575 }
588 if let Some(l) = last_dot { 576 if let Some(l) = last_dot {
589 dest.write_bytes(&src[l..]); 577 dest.write_bytes(&src[l..]);
590 } 578 }
591 dest.buf 579 dest
592 } 580 }
593 581
594 fn hash_encode(src: &[u8]) -> Vec<u8> { 582 fn hash_encode(src: &[u8]) -> Vec<u8> {
595 let mut dired: DestArr<MAXENCODE> = DestArr::create(); 583 let mut dired: DestArr<MAXENCODE> = DestArr::create();
596 let mut lowered: DestArr<MAXENCODE> = DestArr::create(); 584 let mut lowered: DestArr<MAXENCODE> = DestArr::create();
616 }; 604 };
617 if newlen <= MAXSTOREPATHLEN { 605 if newlen <= MAXSTOREPATHLEN {
618 if newlen == path.len() { 606 if newlen == path.len() {
619 path.to_vec() 607 path.to_vec()
620 } else { 608 } else {
621 let mut dest = VecDest::create(newlen); 609 let mut dest = Vec::with_capacity(newlen);
622 basic_encode(&mut dest, path); 610 basic_encode(&mut dest, path);
623 assert!(dest.buf.len() == newlen); 611 assert!(dest.len() == newlen);
624 dest.buf 612 dest
625 } 613 }
626 } else { 614 } else {
627 hash_encode(path) 615 hash_encode(path)
628 } 616 }
629 } 617 }