kaspa_consensus/model/stores/
block_window_cache.rs

1use 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
57/// Reader API for `BlockWindowCacheStore`.
58pub 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}