use crate::LogId;
use crate::log_id::option_raft_log_id_ext::OptionRaftLogIdExt;
use crate::log_id::option_ref_log_id_ext::OptionRefLogIdExt;
use crate::log_id::raft_log_id::RaftLogId;
use crate::log_id::raft_log_id_ext::RaftLogIdExt;
use crate::log_id::ref_log_id::RefLogId;
use crate::vote::RaftCommittedLeaderId;
pub(crate) trait LogStateReader<CLID>
where CLID: RaftCommittedLeaderId
{
fn prev_log_id(&self, index: u64) -> Option<LogId<CLID>> {
if index == 0 { None } else { self.get_log_id(index - 1) }
}
fn has_log_id(&self, log_id: impl RaftLogId<CommittedLeaderId = CLID>) -> bool {
if log_id.index() < self.committed().next_index() {
debug_assert!(Some(log_id.to_ref()) <= self.committed().to_ref());
return true;
}
if let Some(local) = self.ref_log_id(log_id.index()) {
log_id.to_ref() == local
} else {
false
}
}
fn get_log_id(&self, index: u64) -> Option<LogId<CLID>> {
self.ref_log_id(index).to_log_id()
}
fn ref_log_id(&self, index: u64) -> Option<RefLogId<'_, CLID>>;
fn last_log_id(&self) -> Option<&LogId<CLID>>;
fn committed(&self) -> Option<&LogId<CLID>>;
fn io_applied(&self) -> Option<&LogId<CLID>>;
fn io_snapshot_last_log_id(&self) -> Option<&LogId<CLID>>;
fn io_purged(&self) -> Option<&LogId<CLID>>;
fn snapshot_last_log_id(&self) -> Option<&LogId<CLID>>;
fn purge_upto(&self) -> Option<&LogId<CLID>>;
fn last_purged_log_id(&self) -> Option<&LogId<CLID>>;
}