cita_vm/state/
object_entry.rs1use crate::state::account::StateObject;
2
3#[derive(Eq, PartialEq, Clone, Debug)]
4pub enum ObjectStatus {
5 Clean,
6 Dirty,
7 Committed,
8}
9
10#[derive(Debug, Clone)]
11pub struct StateObjectEntry {
12 pub state_object: Option<StateObject>,
14 pub status: ObjectStatus,
15}
16
17impl StateObjectEntry {
18 pub fn new_clean(state_object: Option<StateObject>) -> StateObjectEntry {
20 StateObjectEntry {
21 state_object,
22 status: ObjectStatus::Clean,
23 }
24 }
25
26 pub fn new_dirty(state_object: Option<StateObject>) -> StateObjectEntry {
28 StateObjectEntry {
29 state_object,
30 status: ObjectStatus::Dirty,
31 }
32 }
33
34 pub fn is_dirty(&self) -> bool {
36 self.status == ObjectStatus::Dirty
37 }
38
39 pub fn clone_dirty(&self) -> StateObjectEntry {
42 StateObjectEntry {
43 state_object: self.state_object.as_ref().map(StateObject::clone_dirty),
44 status: self.status.clone(),
45 }
46 }
47
48 pub fn merge(&mut self, other: StateObjectEntry) {
50 self.status = other.status;
51 match other.state_object {
52 Some(acc) => {
53 if let Some(ref mut ours) = self.state_object {
54 ours.merge(acc);
55 } else {
56 self.state_object = Some(acc);
57 }
58 }
59 None => self.state_object = None,
60 }
61 }
62}