llvm_scratch/core/target_datalayout/
datalayout.rs

1use std::fmt;
2
3use crate::core::target_datalayout as td;
4
5macro_rules! option_field_str {
6    ($container:ident, $member:ident) => {
7        match &$container.$member {
8            Some(v) => v.to_string(),
9            None => String::new(),
10        }
11    };
12}
13
14#[derive(PartialEq, PartialOrd, Eq, Ord, Debug)]
15pub struct TargetDataLayout {
16    pub endian: Option<td::Endian>,
17    pub mangling: Option<td::Mangling>,
18    pub integer_alignment: Option<td::IntegerAlignment>,
19    pub float_alignment: Option<td::FloatAlignment>,
20    pub native_integer_width: Option<td::NativeIntegerWidth>,
21}
22
23impl fmt::Display for TargetDataLayout {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        let layout_strs = vec![
26            option_field_str!(self, endian),
27            option_field_str!(self, mangling),
28            option_field_str!(self, integer_alignment),
29            option_field_str!(self, float_alignment),
30            option_field_str!(self, native_integer_width),
31        ]
32        .iter()
33        .filter(|st| !st.is_empty())
34        .map(|opt_str| opt_str.to_string())
35        .collect::<Vec<_>>();
36
37        write!(f, "{}", layout_strs.join("-"))
38    }
39}
40
41#[cfg(test)]
42mod macro_tests {
43    #[test]
44    fn test_option_field_str_macro() {
45        struct Sample {
46            foo: Option<i64>,
47            bar: Option<i64>,
48        }
49
50        let sample = Sample {
51            foo: Some(30),
52            bar: None,
53        };
54
55        assert_eq!("30".to_string(), option_field_str!(sample, foo));
56
57        assert_eq!(String::new(), option_field_str!(sample, bar));
58    }
59}