Move regex compilation to static thread locals

This commit is contained in:
Martin Dahl 2023-06-27 22:29:26 +02:00
parent f5f41baa25
commit bb6f171495
1 changed files with 12 additions and 9 deletions

View File

@ -377,15 +377,17 @@ pub fn as_map(included_msgs: &[RosMsg]) -> HashMap<&str, HashMap<&str, Vec<&str>
msgs
}
/// camel case to to snake case adapted from from ros_idl_cmake
/// note that this is not a general camel to snake converter.
thread_local! {
static UPPERCASE_BEFORE: Regex = Regex::new(r"(.)([A-Z][a-z]+)").unwrap();
static UPPERCASE_AFTER: Regex = Regex::new(r"([a-z0-9])([A-Z])").unwrap();
}
/// camel case to to snake case adapted from from ros_idl_cmake. This
/// is not a general "to snake case" converter, it only handles the
/// specific case of CamelCase to snake_case that we need.
pub fn camel_to_snake(s: &str) -> String {
let re1 = Regex::new(r"(.)([A-Z][a-z]+)").unwrap();
let re2 = Regex::new(r"([a-z0-9])([A-Z])").unwrap();
let s = re1.replace_all(s, "${1}_${2}");
let s = re2.replace_all(&s, "${1}_${2}");
let s = UPPERCASE_BEFORE.with(|ub| ub.replace_all(s, "${1}_${2}"));
let s = UPPERCASE_AFTER.with(|ua| ua.replace_all(&s, "${1}_${2}"));
s.to_lowercase()
}
@ -426,9 +428,10 @@ std_msgs/msg/String
}
#[test]
fn test_snake_case() {
fn test_camel_to_snake_case() {
assert_eq!(camel_to_snake("AB01CD02"), "ab01_cd02");
assert_eq!(camel_to_snake("UnboundedSequences"), "unbounded_sequences");
assert_eq!(camel_to_snake("BoundedPlainUnboundedSequences"), "bounded_plain_unbounded_sequences");
assert_eq!(camel_to_snake("WStrings"), "w_strings");
}
}