Mercurial > public > mercurial-scm > hg
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 } |