use crate::internals::bptree::cursor::CursorReadOps;
use crate::internals::bptree::cursor::{CursorRead, CursorWrite, SuperBlock};
use crate::internals::bptree::iter::{Iter, KeyIter, RangeIter, ValueIter};
use crate::internals::bptree::mutiter::RangeMutIter;
use crate::internals::lincowcell::LinCowCellCapable;
use std::borrow::Borrow;
use std::fmt::Debug;
use std::iter::FromIterator;
use std::ops::RangeBounds;
pub struct BptreeMap<K, V>
where
K: Ord + Clone + Debug + Sync + Send + 'static,
V: Clone + Sync + Send + 'static,
{
inner: LinCowCell<SuperBlock<K, V>, CursorRead<K, V>, CursorWrite<K, V>>,
}
unsafe impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static> Send
for BptreeMap<K, V>
{
}
unsafe impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static> Sync
for BptreeMap<K, V>
{
}
pub struct BptreeMapReadTxn<'a, K, V>
where
K: Ord + Clone + Debug + Sync + Send + 'static,
V: Clone + Sync + Send + 'static,
{
inner: LinCowCellReadTxn<'a, SuperBlock<K, V>, CursorRead<K, V>, CursorWrite<K, V>>,
}
unsafe impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static> Send
for BptreeMapReadTxn<'_, K, V>
{
}
unsafe impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static> Sync
for BptreeMapReadTxn<'_, K, V>
{
}
pub struct BptreeMapWriteTxn<'a, K, V>
where
K: Ord + Clone + Debug + Sync + Send + 'static,
V: Clone + Sync + Send + 'static,
{
inner: LinCowCellWriteTxn<'a, SuperBlock<K, V>, CursorRead<K, V>, CursorWrite<K, V>>,
}
enum SnapshotType<'a, K, V>
where
K: Ord + Clone + Debug + Sync + Send + 'static,
V: Clone + Sync + Send + 'static,
{
R(&'a CursorRead<K, V>),
W(&'a CursorWrite<K, V>),
}
pub struct BptreeMapReadSnapshot<'a, K, V>
where
K: Ord + Clone + Debug + Sync + Send + 'static,
V: Clone + Sync + Send + 'static,
{
inner: SnapshotType<'a, K, V>,
}
impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static> Default
for BptreeMap<K, V>
{
fn default() -> Self {
Self::new()
}
}
impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static>
BptreeMap<K, V>
{
pub fn new() -> Self {
BptreeMap {
inner: LinCowCell::new(unsafe { SuperBlock::new() }),
}
}
pub fn try_write(&self) -> Option<BptreeMapWriteTxn<'_, K, V>> {
self.inner
.try_write()
.map(|inner| BptreeMapWriteTxn { inner })
}
}
impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static>
FromIterator<(K, V)> for BptreeMap<K, V>
{
fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
let mut new_sblock = unsafe { SuperBlock::new() };
let prev = new_sblock.create_reader();
let mut cursor = new_sblock.create_writer();
cursor.extend(iter);
let _ = new_sblock.pre_commit(cursor, &prev);
BptreeMap {
inner: LinCowCell::new(new_sblock),
}
}
}
impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static>
Extend<(K, V)> for BptreeMapWriteTxn<'_, K, V>
{
fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iter: I) {
self.inner.as_mut().extend(iter);
}
}
impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static>
BptreeMapWriteTxn<'_, K, V>
{
pub fn get<Q>(&self, k: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Ord + ?Sized,
{
self.inner.as_ref().search(k)
}
pub fn contains_key<Q>(&self, k: &Q) -> bool
where
K: Borrow<Q>,
Q: Ord + ?Sized,
{
self.inner.as_ref().contains_key(k)
}
pub fn len(&self) -> usize {
self.inner.as_ref().len()
}
pub fn is_empty(&self) -> bool {
self.inner.as_ref().len() == 0
}
pub fn range<R, T>(&self, range: R) -> RangeIter<'_, K, V>
where
K: Borrow<T>,
T: Ord + ?Sized,
R: RangeBounds<T>,
{
self.inner.as_ref().range(range)
}
pub fn iter(&self) -> Iter<'_, K, V> {
self.inner.as_ref().kv_iter()
}
pub fn values(&self) -> ValueIter<'_, K, V> {
self.inner.as_ref().v_iter()
}
pub fn keys(&self) -> KeyIter<'_, K, V> {
self.inner.as_ref().k_iter()
}
pub fn first_key_value(&self) -> Option<(&K, &V)> {
self.inner.as_ref().first_key_value()
}
pub fn last_key_value(&self) -> Option<(&K, &V)> {
self.inner.as_ref().last_key_value()
}
#[allow(unused)]
pub(crate) fn get_txid(&self) -> u64 {
self.inner.as_ref().get_txid()
}
pub fn clear(&mut self) {
self.inner.as_mut().clear()
}
pub fn insert(&mut self, k: K, v: V) -> Option<V> {
self.inner.as_mut().insert(k, v)
}
pub fn remove(&mut self, k: &K) -> Option<V> {
self.inner.as_mut().remove(k)
}
pub fn split_off_lt(&mut self, key: &K) {
self.inner.as_mut().split_off_lt(key)
}
pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
self.inner.as_mut().get_mut_ref(key)
}
pub fn range_mut<R, T>(&mut self, range: R) -> RangeMutIter<'_, K, V>
where
K: Borrow<T>,
T: Ord + ?Sized,
R: RangeBounds<T>,
{
self.inner.as_mut().range_mut(range)
}
#[cfg(test)]
pub(crate) fn tree_density(&self) -> (usize, usize) {
self.inner.as_ref().tree_density()
}
#[cfg(test)]
pub(crate) fn verify(&self) -> bool {
self.inner.as_ref().verify()
}
pub fn to_snapshot(&self) -> BptreeMapReadSnapshot<'_, K, V> {
BptreeMapReadSnapshot {
inner: SnapshotType::W(self.inner.as_ref()),
}
}
}
impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static>
BptreeMapReadTxn<'_, K, V>
{
pub fn get<Q>(&self, k: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Ord + ?Sized,
{
self.inner.as_ref().search(k)
}
pub fn contains_key<Q>(&self, k: &Q) -> bool
where
K: Borrow<Q>,
Q: Ord + ?Sized,
{
self.inner.as_ref().contains_key(k)
}
pub fn len(&self) -> usize {
self.inner.as_ref().len()
}
pub fn is_empty(&self) -> bool {
self.inner.as_ref().len() == 0
}
#[allow(unused)]
pub(crate) fn get_txid(&self) -> u64 {
self.inner.as_ref().get_txid()
}
pub fn range<R, T>(&self, range: R) -> RangeIter<'_, K, V>
where
K: Borrow<T>,
T: Ord + ?Sized,
R: RangeBounds<T>,
{
self.inner.as_ref().range(range)
}
pub fn iter(&self) -> Iter<'_, K, V> {
self.inner.as_ref().kv_iter()
}
pub fn values(&self) -> ValueIter<'_, K, V> {
self.inner.as_ref().v_iter()
}
pub fn keys(&self) -> KeyIter<'_, K, V> {
self.inner.as_ref().k_iter()
}
pub fn first_key_value(&self) -> Option<(&K, &V)> {
self.inner.as_ref().first_key_value()
}
pub fn last_key_value(&self) -> Option<(&K, &V)> {
self.inner.as_ref().last_key_value()
}
pub fn to_snapshot(&self) -> BptreeMapReadSnapshot<'_, K, V> {
BptreeMapReadSnapshot {
inner: SnapshotType::R(self.inner.as_ref()),
}
}
#[cfg(test)]
#[allow(dead_code)]
pub(crate) fn verify(&self) -> bool {
self.inner.as_ref().verify()
}
}
impl<K: Clone + Ord + Debug + Sync + Send + 'static, V: Clone + Sync + Send + 'static>
BptreeMapReadSnapshot<'_, K, V>
{
pub fn get<Q>(&self, k: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Ord + ?Sized,
{
match self.inner {
SnapshotType::R(inner) => inner.search(k),
SnapshotType::W(inner) => inner.search(k),
}
}
pub fn contains_key<Q>(&self, k: &Q) -> bool
where
K: Borrow<Q>,
Q: Ord + ?Sized,
{
match self.inner {
SnapshotType::R(inner) => inner.contains_key(k),
SnapshotType::W(inner) => inner.contains_key(k),
}
}
pub fn len(&self) -> usize {
match self.inner {
SnapshotType::R(inner) => inner.len(),
SnapshotType::W(inner) => inner.len(),
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn range<R, T>(&self, range: R) -> RangeIter<'_, K, V>
where
K: Borrow<T>,
T: Ord + ?Sized,
R: RangeBounds<T>,
{
match self.inner {
SnapshotType::R(inner) => inner.range(range),
SnapshotType::W(inner) => inner.range(range),
}
}
pub fn iter(&self) -> Iter<'_, K, V> {
match self.inner {
SnapshotType::R(inner) => inner.kv_iter(),
SnapshotType::W(inner) => inner.kv_iter(),
}
}
pub fn values(&self) -> ValueIter<'_, K, V> {
match self.inner {
SnapshotType::R(inner) => inner.v_iter(),
SnapshotType::W(inner) => inner.v_iter(),
}
}
pub fn keys(&self) -> KeyIter<'_, K, V> {
match self.inner {
SnapshotType::R(inner) => inner.k_iter(),
SnapshotType::W(inner) => inner.k_iter(),
}
}
}