bee_tangle/
vertex.rs

1// Copyright 2020-2021 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use crate::{metadata::MessageMetadata, MessageRef, VecSet};
5
6use bee_message::{Message, MessageId};
7
8use std::sync::Arc;
9
10#[derive(Clone)]
11pub struct Vertex {
12    message: Option<(MessageRef, MessageMetadata)>,
13    children: (VecSet<MessageId>, bool), // Exhaustive flag
14    eviction_blocks: isize,
15}
16
17impl Vertex {
18    pub fn empty() -> Self {
19        Self {
20            message: None,
21            children: (VecSet::default(), false),
22            eviction_blocks: 0,
23        }
24    }
25
26    pub fn new(message: Message, metadata: MessageMetadata) -> Self {
27        Self {
28            message: Some((MessageRef(Arc::new(message)), metadata)),
29            children: (VecSet::default(), false),
30            eviction_blocks: 0,
31        }
32    }
33
34    pub fn parents(&self) -> Option<impl Iterator<Item = &MessageId> + '_> {
35        self.message().map(|m| m.parents().iter())
36    }
37
38    pub fn message_and_metadata(&self) -> Option<&(MessageRef, MessageMetadata)> {
39        self.message.as_ref()
40    }
41
42    pub fn message(&self) -> Option<&MessageRef> {
43        self.message_and_metadata().map(|(m, _)| m)
44    }
45
46    pub fn metadata(&self) -> Option<&MessageMetadata> {
47        self.message_and_metadata().map(|(_, m)| m)
48    }
49
50    pub fn metadata_mut(&mut self) -> Option<&mut MessageMetadata> {
51        self.message.as_mut().map(|(_, m)| m)
52    }
53
54    pub fn add_child(&mut self, child: MessageId) {
55        self.children.0.insert(child);
56    }
57
58    pub fn children(&self) -> &[MessageId] {
59        &self.children.0
60    }
61
62    pub fn children_exhaustive(&self) -> bool {
63        self.children.1
64    }
65
66    /// Set the exhaustive flag. This should not be done if the vertex's children are exhaustive.
67    pub(crate) fn set_exhaustive(&mut self) {
68        self.children.1 = true;
69    }
70
71    pub(crate) fn insert_message_and_metadata(&mut self, message: Message, metadata: MessageMetadata) {
72        self.message = Some((MessageRef(Arc::new(message)), metadata));
73    }
74
75    pub(crate) fn prevent_eviction(&mut self) {
76        self.eviction_blocks += 1;
77    }
78
79    pub(crate) fn allow_eviction(&mut self) {
80        self.eviction_blocks -= 1;
81        assert!(self.eviction_blocks >= 0);
82    }
83
84    pub(crate) fn can_evict(&self) -> bool {
85        self.eviction_blocks == 0
86    }
87}