Skip to main content

melior/ir/attribute/
integer.rs

1use super::{Attribute, AttributeLike};
2use crate::{
3    ir::{Type, TypeLike},
4    Error,
5};
6use mlir_sys::{
7    mlirIntegerAttrGet, mlirIntegerAttrGetValueInt, mlirIntegerAttrGetValueSInt,
8    mlirIntegerAttrGetValueUInt, MlirAttribute,
9};
10
11/// An integer attribute.
12#[derive(Clone, Copy)]
13pub struct IntegerAttribute<'c> {
14    attribute: Attribute<'c>,
15}
16
17impl<'c> IntegerAttribute<'c> {
18    /// Creates an integer attribute.
19    pub fn new(r#type: Type<'c>, integer: i64) -> Self {
20        unsafe { Self::from_raw(mlirIntegerAttrGet(r#type.to_raw(), integer)) }
21    }
22
23    /// Returns a value.
24    pub fn value(&self) -> i64 {
25        unsafe { mlirIntegerAttrGetValueInt(self.to_raw()) }
26    }
27
28    /// Returns a value as a signed integer.
29    pub fn signed_value(&self) -> i64 {
30        unsafe { mlirIntegerAttrGetValueSInt(self.to_raw()) }
31    }
32
33    /// Returns a value as an unsigned integer.
34    pub fn unsigned_value(&self) -> u64 {
35        unsafe { mlirIntegerAttrGetValueUInt(self.to_raw()) }
36    }
37}
38
39attribute_traits!(IntegerAttribute, is_integer, "integer");
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use crate::{ir::r#type::IntegerType, test::create_test_context};
45
46    #[test]
47    fn value() {
48        let context = create_test_context();
49
50        assert_eq!(
51            IntegerAttribute::new(IntegerType::new(&context, 64).into(), 42).value(),
52            42
53        );
54    }
55}