use std::sync::Arc;
use crate::blocks::{BlockId, BlockMetadata, MutableBlock, SequenceHash};
use crate::pools::BlockStore;
pub struct CompleteBlock<T: BlockMetadata> {
store: Arc<BlockStore<T>>,
block_id: BlockId,
block_size: usize,
seq_hash: SequenceHash,
armed: bool,
}
impl<T: BlockMetadata + Sync> CompleteBlock<T> {
pub(crate) fn from_store(
store: Arc<BlockStore<T>>,
block_id: BlockId,
block_size: usize,
seq_hash: SequenceHash,
) -> Self {
Self {
store,
block_id,
block_size,
seq_hash,
armed: true,
}
}
pub fn block_id(&self) -> BlockId {
self.block_id
}
pub fn block_size(&self) -> usize {
self.block_size
}
pub fn sequence_hash(&self) -> SequenceHash {
self.seq_hash
}
pub fn reset(mut self) -> MutableBlock<T> {
self.store.transition_back_to_mutable(self.block_id);
self.armed = false;
MutableBlock::from_store(self.store.clone(), self.block_id, self.block_size)
}
pub(crate) fn disarm(&mut self) {
self.armed = false;
}
pub(crate) fn rearm(&mut self) {
self.armed = true;
}
}
impl<T: BlockMetadata> Drop for CompleteBlock<T> {
#[inline]
fn drop(&mut self) {
if self.armed {
self.store.release_staged(self.block_id);
}
}
}
impl<T: BlockMetadata> std::fmt::Debug for CompleteBlock<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CompleteBlock")
.field("block_id", &self.block_id)
.field("seq_hash", &self.seq_hash)
.finish()
}
}