1use 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), 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 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}