aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Rémi Bardon <remi@remibardon.name>2025-05-30 17:53:38 +0000
committerLibravatar cel 🌸 <cel@bunny.garden>2025-05-30 22:23:21 +0100
commit36c744088b48202d708ea7a7728205e845a611cd (patch)
tree65bba43da6c4363ac3d9842a27abe1ed5698fc87
parent7f4f2d79bcd6e867fba5680c9a9de5b7fefb9be0 (diff)
downloadluz-36c744088b48202d708ea7a7728205e845a611cd.tar.gz
luz-36c744088b48202d708ea7a7728205e845a611cd.tar.bz2
luz-36c744088b48202d708ea7a7728205e845a611cd.zip
perf(filamento): use `with_capacity` intializers where possible
-rw-r--r--filamento/src/caps.rs124
1 files changed, 81 insertions, 43 deletions
diff --git a/filamento/src/caps.rs b/filamento/src/caps.rs
index 36b2b72..ed0cd7d 100644
--- a/filamento/src/caps.rs
+++ b/filamento/src/caps.rs
@@ -5,7 +5,8 @@ use sha1::Sha1;
use sha2::{Digest, Sha256};
use sha3::Sha3_256;
use stanza::{
- xep_0030::info,
+ xep_0004,
+ xep_0030::{self, info},
xep_0115::{self, C},
xep_0300::{self, Algo, Hash},
xep_0390,
@@ -57,17 +58,26 @@ pub fn caps(node: String, query: info::Query) -> Result<xep_0115::C, CapsEncodeE
let mut string = String::new();
// identities string
- let mut identities = Vec::new();
+ let mut identities = Vec::with_capacity(query.identities.len());
for identity in query.identities {
- let mut string = String::new();
- string.push_str(&identity.category);
+ let (category, r#type, lang, name) = (
+ identity.category,
+ identity.r#type,
+ identity.lang.unwrap_or_default(),
+ identity.name.unwrap_or_default(),
+ );
+
+ let mut string =
+ String::with_capacity(category.len() + r#type.len() + lang.len() + name.len() + 4);
+ string.push_str(&category);
string.push('/');
- string.push_str(&identity.r#type);
+ string.push_str(&r#type);
string.push('/');
- string.push_str(&identity.lang.unwrap_or_default());
+ string.push_str(&lang);
string.push('/');
- string.push_str(&identity.name.unwrap_or_default());
+ string.push_str(&name);
string.push('<');
+
identities.push(string);
}
identities.sort();
@@ -75,11 +85,12 @@ pub fn caps(node: String, query: info::Query) -> Result<xep_0115::C, CapsEncodeE
string.push_str(&identities_string);
// features string
- let mut features = Vec::new();
- for feature in query.features {
- let mut string = String::new();
- string.push_str(&feature.var);
+ let mut features = Vec::with_capacity(query.features.len());
+ for xep_0030::info::Feature { var, .. } in query.features {
+ let mut string = String::with_capacity(var.len() + 1);
+ string.push_str(&var);
string.push('<');
+
features.push(string);
}
features.sort();
@@ -87,9 +98,8 @@ pub fn caps(node: String, query: info::Query) -> Result<xep_0115::C, CapsEncodeE
string.push_str(&features_string);
// extensions string
- let mut extensions = Vec::new();
+ let mut extensions = Vec::with_capacity(query.extensions.len());
for extension in query.extensions {
- let mut string = String::new();
let form_type = extension
.fields
.iter()
@@ -101,31 +111,41 @@ pub fn caps(node: String, query: info::Query) -> Result<xep_0115::C, CapsEncodeE
.map(|value| value.0)
.collect::<Vec<String>>()
.concat();
- string.push_str(&form_type);
- string.push('<');
- let mut fields = Vec::new();
+
+ let mut fields = Vec::with_capacity(extension.fields.len());
for field in extension.fields {
if field.var.as_deref() == Some("FORM_TYPE") {
continue;
}
- let mut string = String::new();
- string.push_str(&field.var.unwrap_or_default());
- string.push('<');
- let mut values = Vec::new();
- for value in field.values {
- let mut string = String::new();
- string.push_str(&value.0);
+
+ let var = field.var.unwrap_or_default();
+
+ let mut values = Vec::with_capacity(field.values.len());
+ for xep_0004::Value(value) in field.values {
+ let mut string = String::with_capacity(value.len() + 1);
+ string.push_str(&value);
string.push('<');
+
values.push(string);
}
values.sort();
let values_string = values.concat();
+
+ let mut string = String::with_capacity(var.len() + values_string.len() + 1);
+ string.push_str(&var);
+ string.push('<');
string.push_str(&values_string);
+
fields.push(string);
}
fields.sort();
let fields_string = fields.concat();
+
+ let mut string = String::with_capacity(form_type.len() + fields_string.len() + 1);
+ string.push_str(&form_type);
+ string.push('<');
string.push_str(&fields_string);
+
extensions.push(string);
}
extensions.sort();
@@ -153,11 +173,12 @@ pub fn encode_caps2(query: info::Query) -> String {
let mut string = String::new();
// features string
- let mut features = Vec::new();
- for feature in query.features {
- let mut string = String::new();
- string.push_str(&feature.var);
+ let mut features = Vec::with_capacity(query.features.len());
+ for xep_0030::info::Feature { var, .. } in query.features {
+ let mut string = String::with_capacity(var.len() + 1);
+ string.push_str(&var);
string.push('\x1f');
+
features.push(string);
}
features.sort();
@@ -166,18 +187,27 @@ pub fn encode_caps2(query: info::Query) -> String {
string.push('\x1c');
// identities string
- let mut identities = Vec::new();
+ let mut identities = Vec::with_capacity(query.identities.len());
for identity in query.identities {
- let mut string = String::new();
- string.push_str(&identity.category);
+ let (category, r#type, lang, name) = (
+ identity.category,
+ identity.r#type,
+ identity.lang.unwrap_or_default(),
+ identity.name.unwrap_or_default(),
+ );
+
+ let mut string =
+ String::with_capacity(category.len() + r#type.len() + lang.len() + name.len() + 5);
+ string.push_str(&category);
string.push('\x1f');
- string.push_str(&identity.r#type);
+ string.push_str(&r#type);
string.push('\x1f');
- string.push_str(&identity.lang.unwrap_or_default());
+ string.push_str(&lang);
string.push('\x1f');
- string.push_str(&identity.name.unwrap_or_default());
+ string.push_str(&name);
string.push('\x1f');
string.push('\x1e');
+
identities.push(string);
}
identities.sort();
@@ -186,37 +216,45 @@ pub fn encode_caps2(query: info::Query) -> String {
string.push('\x1c');
// extensions string
- let mut extensions = Vec::new();
+ let mut extensions = Vec::with_capacity(query.extensions.len());
for extension in query.extensions {
- let mut string = String::new();
- let mut fields = Vec::new();
+ let mut fields = Vec::with_capacity(extension.fields.len());
for field in extension.fields {
- let mut string = String::new();
- string.push_str(&field.var.unwrap_or_default());
- string.push('\x1f');
- let mut values = Vec::new();
- for value in field.values {
- let mut string = String::new();
- string.push_str(&value.0);
+ let var = field.var.unwrap_or_default();
+
+ let mut values = Vec::with_capacity(field.values.len());
+ for xep_0004::Value(value) in field.values {
+ let mut string = String::with_capacity(value.len() + 1);
+ string.push_str(&value);
string.push('\x1f');
+
values.push(string);
}
values.sort();
let values_string = values.concat();
+
+ let mut string = String::with_capacity(var.len() + values_string.len() + 2);
+ string.push_str(&var);
+ string.push('\x1f');
string.push_str(&values_string);
string.push('\x1e');
+
fields.push(string);
}
fields.sort();
let fields_string = fields.concat();
+
+ let mut string = String::with_capacity(fields_string.len() + 1);
string.push_str(&fields_string);
string.push('\x1d');
+
extensions.push(string);
}
extensions.sort();
let extensions_string = extensions.concat();
string.push_str(&extensions_string);
string.push('\x1c');
+
string
}