Estimate path length instead of hardcoding 64 bytes
This commit is contained in:
parent
53f1bed83a
commit
8f59eb6da0
2 changed files with 10 additions and 2 deletions
|
@ -30,6 +30,7 @@ use crate::formats::item_type::ItemType;
|
||||||
use crate::html::escape::Escape;
|
use crate::html::escape::Escape;
|
||||||
use crate::html::render::Context;
|
use crate::html::render::Context;
|
||||||
|
|
||||||
|
use super::url_parts_builder::estimate_item_path_byte_length;
|
||||||
use super::url_parts_builder::UrlPartsBuilder;
|
use super::url_parts_builder::UrlPartsBuilder;
|
||||||
|
|
||||||
crate trait Print {
|
crate trait Print {
|
||||||
|
@ -505,8 +506,7 @@ crate enum HrefError {
|
||||||
|
|
||||||
// Panics if `syms` is empty.
|
// Panics if `syms` is empty.
|
||||||
crate fn join_with_double_colon(syms: &[Symbol]) -> String {
|
crate fn join_with_double_colon(syms: &[Symbol]) -> String {
|
||||||
// 64 bytes covers 99.9%+ of cases.
|
let mut s = String::with_capacity(estimate_item_path_byte_length(syms.len()));
|
||||||
let mut s = String::with_capacity(64);
|
|
||||||
s.push_str(&syms[0].as_str());
|
s.push_str(&syms[0].as_str());
|
||||||
for sym in &syms[1..] {
|
for sym in &syms[1..] {
|
||||||
s.push_str("::");
|
s.push_str("::");
|
||||||
|
|
|
@ -110,6 +110,14 @@ impl UrlPartsBuilder {
|
||||||
/// This is intentionally on the lower end to avoid overallocating.
|
/// This is intentionally on the lower end to avoid overallocating.
|
||||||
const AVG_PART_LENGTH: usize = 5;
|
const AVG_PART_LENGTH: usize = 5;
|
||||||
|
|
||||||
|
/// Estimate the number of bytes in an item's path, based on how many segments it has.
|
||||||
|
///
|
||||||
|
/// **Note:** This is only to be used with, e.g., [`String::with_capacity()`];
|
||||||
|
/// the return value is just a rough estimate.
|
||||||
|
crate const fn estimate_item_path_byte_length(segment_count: usize) -> usize {
|
||||||
|
AVG_PART_LENGTH * segment_count
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> FromIterator<&'a str> for UrlPartsBuilder {
|
impl<'a> FromIterator<&'a str> for UrlPartsBuilder {
|
||||||
fn from_iter<T: IntoIterator<Item = &'a str>>(iter: T) -> Self {
|
fn from_iter<T: IntoIterator<Item = &'a str>>(iter: T) -> Self {
|
||||||
let iter = iter.into_iter();
|
let iter = iter.into_iter();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue