From 8f59eb6da014cb146c1477ab0ddf35729c88e99f Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Mon, 10 Jan 2022 12:23:58 -0800 Subject: [PATCH] Estimate path length instead of hardcoding 64 bytes --- src/librustdoc/html/format.rs | 4 ++-- src/librustdoc/html/url_parts_builder.rs | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index 342c15855d2..8571a6a137f 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -30,6 +30,7 @@ use crate::formats::item_type::ItemType; use crate::html::escape::Escape; use crate::html::render::Context; +use super::url_parts_builder::estimate_item_path_byte_length; use super::url_parts_builder::UrlPartsBuilder; crate trait Print { @@ -505,8 +506,7 @@ crate enum HrefError { // Panics if `syms` is empty. crate fn join_with_double_colon(syms: &[Symbol]) -> String { - // 64 bytes covers 99.9%+ of cases. - let mut s = String::with_capacity(64); + let mut s = String::with_capacity(estimate_item_path_byte_length(syms.len())); s.push_str(&syms[0].as_str()); for sym in &syms[1..] { s.push_str("::"); diff --git a/src/librustdoc/html/url_parts_builder.rs b/src/librustdoc/html/url_parts_builder.rs index 5c1557078aa..26cebe8c72b 100644 --- a/src/librustdoc/html/url_parts_builder.rs +++ b/src/librustdoc/html/url_parts_builder.rs @@ -110,6 +110,14 @@ impl UrlPartsBuilder { /// This is intentionally on the lower end to avoid overallocating. 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 { fn from_iter>(iter: T) -> Self { let iter = iter.into_iter();