cranelift_codegen_meta/cdsl/
mod.rs

1//! Cranelift DSL classes.
2//!
3//! This module defines the classes that are used to define Cranelift
4//! instructions and other entities.
5
6pub mod formats;
7pub mod instructions;
8pub mod isa;
9pub mod operands;
10pub mod settings;
11pub mod types;
12pub mod typevar;
13
14/// A macro that converts boolean settings into predicates to look more natural.
15#[macro_export]
16macro_rules! predicate {
17    ($a:ident && $($b:tt)*) => {
18        PredicateNode::And(Box::new($a.into()), Box::new(predicate!($($b)*)))
19    };
20    ($a:ident) => {
21        $a.into()
22    };
23}
24
25/// A macro that joins boolean settings into a list (e.g. `preset!(feature_a && feature_b)`).
26#[macro_export]
27macro_rules! preset {
28    () => {
29        vec![]
30    };
31    ($($x:tt)&&*) => {
32        {
33            let mut v = Vec::new();
34            $(
35                v.push($x.into());
36            )*
37            v
38        }
39    };
40}
41
42/// Convert the string `s` to CamelCase.
43pub fn camel_case(s: &str) -> String {
44    let mut output_chars = String::with_capacity(s.len());
45
46    let mut capitalize = true;
47    for curr_char in s.chars() {
48        if curr_char == '_' {
49            capitalize = true;
50        } else {
51            if capitalize {
52                output_chars.extend(curr_char.to_uppercase());
53            } else {
54                output_chars.push(curr_char);
55            }
56            capitalize = false;
57        }
58    }
59
60    output_chars
61}
62
63#[cfg(test)]
64mod tests {
65    use super::camel_case;
66
67    #[test]
68    fn camel_case_works() {
69        assert_eq!(camel_case("x"), "X");
70        assert_eq!(camel_case("camel_case"), "CamelCase");
71    }
72}