llvm_scratch/core/llvm_value/
value.rs

1use std::fmt;
2use std::fmt::Formatter;
3
4use crate::core::llvm_string;
5
6/// An representation of LLVMValue.
7/// LLVMValue を表す構造体
8#[derive(Eq, PartialEq, PartialOrd, Ord, Hash, Clone)]
9pub struct LLVMValue {
10    pub kind: LLVMValueKind,
11}
12
13impl LLVMValue {
14    fn new(value_kind: LLVMValueKind) -> Self {
15        Self { kind: value_kind }
16    }
17
18    pub fn new_register(s: llvm_string::LLVMString) -> Self {
19        Self::new(LLVMValueKind::REGISTER(s))
20    }
21
22    pub fn new_integer(v: i128) -> Self {
23        Self::new(LLVMValueKind::INTEGER(v))
24    }
25
26    pub fn new_unsigned_int(v: u128) -> Self {
27        Self::new(LLVMValueKind::UNSIGNEDINTEGER(v))
28    }
29}
30
31impl fmt::Display for LLVMValue {
32    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
33        match &self.kind {
34            LLVMValueKind::REGISTER(s) => write!(f, "%{}", s),
35            LLVMValueKind::INTEGER(v) => write!(f, "{}", v),
36            LLVMValueKind::UNSIGNEDINTEGER(v) => write!(f, "{}", v),
37        }
38    }
39}
40
41/// LLVMValue の種類
42#[derive(Eq, PartialEq, PartialOrd, Ord, Hash, Clone)]
43pub enum LLVMValueKind {
44    REGISTER(llvm_string::LLVMString),
45    INTEGER(i128),
46    UNSIGNEDINTEGER(u128),
47}