pub fn vec_string_to_static_str(strings: &Vec<String>) -> Vec<&'static str> {
let mut strs: Vec<&'static str> = Vec::new();
for string in strings {
strs.push(Box::leak(string.clone().into_boxed_str()));
}
strs
}
#[cfg(feature = "unsafe")]
pub fn unsafe_vec_string_to_static_str(strings: &Vec<String>) -> Vec<&'static str> {
let mut strs: Vec<&'static str> = Vec::new();
for string in strings {
strs.push(unsafe { std::mem::transmute::<&str, &'static str>(string.as_str()) });
}
strs
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn vec_string_to_static_str_from_literals() {
let strings = vec!["string_a".to_string(), "string_b".to_string()];
let actual = vec_string_to_static_str(&strings);
assert_eq!(vec!["string_a", "string_b"], actual);
}
#[test]
fn vec_string_to_static_str_from_dynamic_allocation() {
let strings = vec![String::from("string_a"), String::from("string_b")];
let actual = vec_string_to_static_str(&strings);
assert_eq!(vec!["string_a", "string_b"], actual);
}
#[test]
fn vec_string_to_static_str_empty_vector() {
let strings: Vec<String> = Vec::new();
let actual = vec_string_to_static_str(&strings);
assert_eq!(Vec::<&'static str>::new(), actual);
}
#[test]
fn vec_string_to_static_str_mixed_content() {
let strings = vec!["".to_string(), "a".to_string(), "longer string".to_string()];
let actual = vec_string_to_static_str(&strings);
assert_eq!(vec!["", "a", "longer string"], actual);
}
#[test]
fn vec_string_to_static_str_special_characters() {
let strings = vec![
"hello, world!".to_string(),
"你好,世界!".to_string(),
"こんにちは、世界!".to_string(),
"안녕하세요, 세계!".to_string(),
];
let actual = vec_string_to_static_str(&strings);
assert_eq!(
vec![
"hello, world!",
"你好,世界!",
"こんにちは、世界!",
"안녕하세요, 세계!"
],
actual
);
}
#[test]
#[cfg(feature = "unsafe")]
fn unsafe_vec_string_to_static_str_from_literals() {
let strings = vec!["string_a".to_string(), "string_b".to_string()];
let actual = unsafe_vec_string_to_static_str(&strings);
assert_eq!(vec!["string_a", "string_b"], actual);
}
#[test]
#[cfg(feature = "unsafe")]
fn unsafe_vec_string_to_static_str_from_dynamic_allocation() {
let strings = vec![String::from("string_a"), String::from("string_b")];
let actual = unsafe_vec_string_to_static_str(&strings);
assert_eq!(vec!["string_a", "string_b"], actual);
}
#[test]
#[cfg(feature = "unsafe")]
fn unsafe_vec_string_to_static_str_empty_vector() {
let strings: Vec<String> = Vec::new();
let actual = unsafe_vec_string_to_static_str(&strings);
assert_eq!(Vec::<&'static str>::new(), actual);
}
#[test]
#[cfg(feature = "unsafe")]
fn unsafe_vec_string_to_static_str_mixed_content() {
let strings = vec!["".to_string(), "a".to_string(), "longer string".to_string()];
let actual = unsafe_vec_string_to_static_str(&strings);
assert_eq!(vec!["", "a", "longer string"], actual);
}
#[test]
#[cfg(feature = "unsafe")]
fn unsafe_vec_string_to_static_str_special_characters() {
let strings = vec![
"hello, world!".to_string(),
"你好,世界!".to_string(),
"こんにちは、世界!".to_string(),
"안녕하세요, 세계!".to_string(),
];
let actual = unsafe_vec_string_to_static_str(&strings);
assert_eq!(
vec![
"hello, world!",
"你好,世界!",
"こんにちは、世界!",
"안녕하세요, 세계!"
],
actual
);
}
}