//! Test trait implementations for the unordered Current QMDB. use super::{fixed, variable}; use crate::{ mmr::Location, qmdb::{ any::{ states::{CleanAny, MerkleizedNonDurableAny, MutableAny, UnmerkleizedDurableAny}, unordered::{ fixed::Operation as FixedOperation, variable::Operation as VariableOperation, }, FixedValue, VariableValue, }, current::{ db::{Merkleized, Unmerkleized}, BitmapPrunedBits, }, Durable, Error, NonDurable, }, translator::Translator, }; use commonware_codec::Read; use commonware_cryptography::{DigestOf, Hasher}; use commonware_runtime::{Clock, Metrics, Storage}; use commonware_utils::Array; use core::ops::Range; // ============================================================================= // Fixed variant test trait implementations // ============================================================================= impl< E: Storage + Clock + Metrics, K: Array, V: FixedValue, H: Hasher, T: Translator, const N: usize, > CleanAny for fixed::Db>, Durable> { type Mutable = fixed::Db; fn into_mutable(self) -> Self::Mutable { self.into_mutable() } } impl< E: Storage + Clock + Metrics, K: Array, V: FixedValue, H: Hasher, T: Translator, const N: usize, > UnmerkleizedDurableAny for fixed::Db { type Digest = H::Digest; type Operation = FixedOperation; type Mutable = fixed::Db; type Merkleized = fixed::Db>, Durable>; fn into_mutable(self) -> Self::Mutable { self.into_mutable() } async fn into_merkleized(self) -> Result { self.into_merkleized().await } } impl< E: Storage + Clock + Metrics, K: Array, V: FixedValue, H: Hasher, T: Translator, const N: usize, > MerkleizedNonDurableAny for fixed::Db>, NonDurable> { type Mutable = fixed::Db; fn into_mutable(self) -> Self::Mutable { self.into_mutable() } } impl< E: Storage + Clock + Metrics, K: Array, V: FixedValue, H: Hasher, T: Translator, const N: usize, > MutableAny for fixed::Db { type Digest = H::Digest; type Operation = FixedOperation; type Durable = fixed::Db; type Merkleized = fixed::Db>, NonDurable>; async fn commit(self, metadata: Option) -> Result<(Self::Durable, Range), Error> { self.commit(metadata).await } async fn into_merkleized(self) -> Result { self.into_merkleized().await } fn steps(&self) -> u64 { self.any.durable_state.steps } } // ============================================================================= // Variable variant test trait implementations // ============================================================================= impl< E: Storage + Clock + Metrics, K: Array, V: VariableValue, H: Hasher, T: Translator, const N: usize, > CleanAny for variable::Db>, Durable> where VariableOperation: Read, { type Mutable = variable::Db; fn into_mutable(self) -> Self::Mutable { self.into_mutable() } } impl< E: Storage + Clock + Metrics, K: Array, V: VariableValue, H: Hasher, T: Translator, const N: usize, > UnmerkleizedDurableAny for variable::Db where VariableOperation: Read, { type Digest = H::Digest; type Operation = VariableOperation; type Mutable = variable::Db; type Merkleized = variable::Db>, Durable>; fn into_mutable(self) -> Self::Mutable { self.into_mutable() } async fn into_merkleized(self) -> Result { self.into_merkleized().await } } impl< E: Storage + Clock + Metrics, K: Array, V: VariableValue, H: Hasher, T: Translator, const N: usize, > MerkleizedNonDurableAny for variable::Db>, NonDurable> where VariableOperation: Read, { type Mutable = variable::Db; fn into_mutable(self) -> Self::Mutable { self.into_mutable() } } impl< E: Storage + Clock + Metrics, K: Array, V: VariableValue, H: Hasher, T: Translator, const N: usize, > MutableAny for variable::Db where VariableOperation: Read, { type Digest = H::Digest; type Operation = VariableOperation; type Durable = variable::Db; type Merkleized = variable::Db>, NonDurable>; async fn commit(self, metadata: Option) -> Result<(Self::Durable, Range), Error> { self.commit(metadata).await } async fn into_merkleized(self) -> Result { self.into_merkleized().await } fn steps(&self) -> u64 { self.any.durable_state.steps } } // ============================================================================= // BitmapPrunedBits trait implementations // ============================================================================= impl< E: Storage + Clock + Metrics, K: Array, V: FixedValue, H: Hasher, T: Translator, const N: usize, > BitmapPrunedBits for fixed::Db>, Durable> { fn pruned_bits(&self) -> u64 { self.status.pruned_bits() } fn get_bit(&self, index: u64) -> bool { self.status.get_bit(index) } fn oldest_retained(&self) -> u64 { *self.any.log.bounds().start } } impl< E: Storage + Clock + Metrics, K: Array, V: VariableValue, H: Hasher, T: Translator, const N: usize, > BitmapPrunedBits for variable::Db>, Durable> where VariableOperation: Read, { fn pruned_bits(&self) -> u64 { self.status.pruned_bits() } fn get_bit(&self, index: u64) -> bool { self.status.get_bit(index) } fn oldest_retained(&self) -> u64 { *self.any.log.bounds().start } }