kaspa_consensus/model/stores/
block_window_cache.rs1use crate::processes::ghostdag::ordering::SortableBlock;
2use kaspa_consensus_core::BlockHasher;
3use kaspa_database::prelude::Cache;
4use kaspa_hashes::Hash;
5use kaspa_utils::mem_size::MemSizeEstimator;
6use std::{
7 cmp::Reverse,
8 collections::BinaryHeap,
9 ops::{Deref, DerefMut},
10 sync::Arc,
11};
12
13#[derive(Clone, Copy)]
14pub enum WindowOrigin {
15 Full,
16 Sampled,
17}
18
19#[derive(Clone)]
20pub struct BlockWindowHeap {
21 pub blocks: BinaryHeap<Reverse<SortableBlock>>,
22 origin: WindowOrigin,
23}
24
25impl MemSizeEstimator for BlockWindowHeap {}
26
27impl BlockWindowHeap {
28 pub fn new(origin: WindowOrigin) -> Self {
29 Self { blocks: Default::default(), origin }
30 }
31
32 pub fn with_capacity(origin: WindowOrigin, capacity: usize) -> Self {
33 Self { blocks: BinaryHeap::with_capacity(capacity), origin }
34 }
35
36 #[inline]
37 #[must_use]
38 pub fn origin(&self) -> WindowOrigin {
39 self.origin
40 }
41}
42
43impl Deref for BlockWindowHeap {
44 type Target = BinaryHeap<Reverse<SortableBlock>>;
45
46 fn deref(&self) -> &Self::Target {
47 &self.blocks
48 }
49}
50
51impl DerefMut for BlockWindowHeap {
52 fn deref_mut(&mut self) -> &mut Self::Target {
53 &mut self.blocks
54 }
55}
56
57pub trait BlockWindowCacheReader {
59 fn get(&self, hash: &Hash) -> Option<Arc<BlockWindowHeap>>;
60}
61
62pub type BlockWindowCacheStore = Cache<Hash, Arc<BlockWindowHeap>, BlockHasher>;
63
64impl BlockWindowCacheReader for BlockWindowCacheStore {
65 #[inline(always)]
66 fn get(&self, hash: &Hash) -> Option<Arc<BlockWindowHeap>> {
67 self.get(hash)
68 }
69}