arc-malachitebft-engine 0.7.0-pre

Implementation of the Malachite BFT consensus engine
Documentation
use std::collections::VecDeque;

use malachitebft_core_types::Context;
use tracing::{info, warn};

use crate::consensus::ConsensusMsg;

pub struct MessageBuffer<Ctx: Context> {
    messages: VecDeque<ConsensusMsg<Ctx>>,
    max_size: usize,
}

impl<Ctx: Context> MessageBuffer<Ctx> {
    pub fn new(max_size: usize) -> Self {
        Self {
            messages: VecDeque::new(),
            max_size,
        }
    }

    pub fn buffer(&mut self, msg: ConsensusMsg<Ctx>) -> bool {
        if self.messages.len() < self.max_size {
            info!("Buffering message: {msg:?}");
            self.messages.push_back(msg);
            true
        } else {
            warn!("Buffer is full, dropping message: {msg:?}");
            false
        }
    }

    pub fn pop(&mut self) -> Option<ConsensusMsg<Ctx>> {
        self.messages.pop_front()
    }

    pub fn is_empty(&self) -> bool {
        self.messages.is_empty()
    }

    pub fn len(&self) -> usize {
        self.messages.len()
    }
}