#[cfg(test)]
mod test;
use crate::{
basic::mapx_ord_rawkey::{
MapxOrdRawKey, MapxOrdRawKeyBatchEntry, MapxOrdRawKeyIter, ValueIterMut,
ValueMut,
},
common::{
RawKey,
ende::{KeyEnDeOrdered, ValueEnDe},
},
define_map_wrapper,
};
use ruc::*;
use std::{marker::PhantomData, ops::RangeBounds};
use vsdb_core::basic::mapx_raw;
define_map_wrapper! {
#[doc = "A disk-based, `BTreeMap`-like data structure with typed, ordered keys and values."]
#[doc = ""]
#[doc = "`MapxOrd` stores key-value pairs on disk, ensuring that the keys are ordered."]
pub struct MapxOrd<K, V> {
inner: MapxOrdRawKey<V>,
_p: PhantomData<K>,
}
where K: KeyEnDeOrdered, V: ValueEnDe
}
impl<K, V> MapxOrd<K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
#[inline(always)]
pub fn get(&self, key: &K) -> Option<V> {
self.inner.get(key.to_bytes())
}
#[inline(always)]
pub fn get_mut(&mut self, key: &K) -> Option<ValueMut<'_, V>> {
self.inner.get_mut(key.to_bytes())
}
#[inline(always)]
pub fn contains_key(&self, key: &K) -> bool {
self.inner.contains_key(key.to_bytes())
}
#[inline(always)]
pub fn get_le(&self, key: &K) -> Option<(K, V)> {
self.inner
.get_le(key.to_bytes())
.map(|(k, v)| (pnk!(K::from_bytes(k)), v))
}
#[inline(always)]
pub fn get_ge(&self, key: &K) -> Option<(K, V)> {
self.inner
.get_ge(key.to_bytes())
.map(|(k, v)| (pnk!(K::from_bytes(k)), v))
}
#[inline(always)]
pub fn insert(&mut self, key: &K, value: &V) {
self.inner.insert(key.to_bytes(), value)
}
#[inline(always)]
pub unsafe fn insert_encoded_value(&mut self, key: &K, value: impl AsRef<[u8]>) {
unsafe { self.inner.insert_encoded_value(key.to_bytes(), value) }
}
#[inline(always)]
pub fn entry(&mut self, key: &K) -> Entry<'_, V> {
Entry {
key: key.to_bytes(),
hdr: &mut self.inner,
}
}
#[inline(always)]
pub fn iter(&self) -> MapxOrdIter<'_, K, V> {
MapxOrdIter {
inner: self.inner.iter(),
_p: PhantomData,
}
}
#[inline(always)]
pub fn iter_mut(&mut self) -> MapxOrdIterMut<'_, K, V> {
MapxOrdIterMut {
inner: self.inner.inner.iter_mut(),
_p: PhantomData,
}
}
#[inline(always)]
pub fn values(&self) -> MapxOrdValues<'_, V> {
MapxOrdValues {
inner: self.inner.iter(),
}
}
#[inline(always)]
pub fn values_mut(&mut self) -> MapxOrdValuesMut<'_, V> {
MapxOrdValuesMut {
inner: self.inner.inner.iter_mut(),
_p: PhantomData,
}
}
#[inline(always)]
pub fn range<R: RangeBounds<K>>(&self, bounds: R) -> MapxOrdIter<'_, K, V> {
let (l, h) = crate::cow_bytes_bounds!(bounds);
MapxOrdIter {
inner: self.inner.range((l, h)),
_p: PhantomData,
}
}
#[inline(always)]
pub fn range_mut<R: RangeBounds<K>>(
&mut self,
bounds: R,
) -> MapxOrdIterMut<'_, K, V> {
let (l, h) = crate::cow_bytes_bounds!(bounds);
MapxOrdIterMut {
inner: self.inner.inner.range_mut((l, h)),
_p: PhantomData,
}
}
#[inline(always)]
pub fn first(&self) -> Option<(K, V)> {
self.iter().next()
}
#[inline(always)]
pub fn last(&self) -> Option<(K, V)> {
self.iter().next_back()
}
#[inline(always)]
pub fn remove(&mut self, key: &K) {
self.inner.remove(key.to_bytes())
}
#[inline(always)]
pub fn batch_entry(&mut self) -> MapxOrdBatchEntry<'_, K, V> {
MapxOrdBatchEntry {
inner: self.inner.batch_entry(),
_marker: PhantomData,
}
}
#[inline(always)]
pub fn keys(&self) -> impl Iterator<Item = K> + '_ {
self.iter().map(|(k, _)| k)
}
}
impl<'a, K, V> IntoIterator for &'a MapxOrd<K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
type Item = (K, V);
type IntoIter = MapxOrdIter<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<'a, K, V> IntoIterator for &'a mut MapxOrd<K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
type Item = (K, ValueIterMut<'a, V>);
type IntoIter = MapxOrdIterMut<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
self.iter_mut()
}
}
pub struct MapxOrdBatchEntry<'a, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
inner: MapxOrdRawKeyBatchEntry<'a, V>,
_marker: PhantomData<K>,
}
impl<'a, K, V> MapxOrdBatchEntry<'a, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
pub fn insert(&mut self, key: &K, value: &V) {
self.inner.insert(key.to_bytes(), value);
}
pub fn remove(&mut self, key: &K) {
self.inner.remove(key.to_bytes());
}
pub fn commit(self) -> Result<()> {
self.inner.commit()
}
}
pub struct MapxOrdIter<'a, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
inner: MapxOrdRawKeyIter<'a, V>,
_p: PhantomData<K>,
}
impl<K, V> Iterator for MapxOrdIter<'_, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
type Item = (K, V);
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(k, v)| (pnk!(K::from_bytes(k)), v))
}
}
impl<K, V> DoubleEndedIterator for MapxOrdIter<'_, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
fn next_back(&mut self) -> Option<Self::Item> {
self.inner
.next_back()
.map(|(k, v)| (pnk!(K::from_bytes(k)), v))
}
}
pub struct MapxOrdValues<'a, V>
where
V: ValueEnDe,
{
pub(crate) inner: MapxOrdRawKeyIter<'a, V>,
}
impl<V> Iterator for MapxOrdValues<'_, V>
where
V: ValueEnDe,
{
type Item = V;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, v)| v)
}
}
impl<V> DoubleEndedIterator for MapxOrdValues<'_, V>
where
V: ValueEnDe,
{
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(_, v)| v)
}
}
pub struct MapxOrdValuesMut<'a, V>
where
V: ValueEnDe,
{
pub(crate) inner: mapx_raw::MapxRawIterMut<'a>,
pub(crate) _p: PhantomData<V>,
}
impl<'a, V> Iterator for MapxOrdValuesMut<'a, V>
where
V: ValueEnDe,
{
type Item = ValueIterMut<'a, V>;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, v)| ValueIterMut {
value: pnk!(<V as ValueEnDe>::decode(&v)),
inner: v,
})
}
}
impl<V> DoubleEndedIterator for MapxOrdValuesMut<'_, V>
where
V: ValueEnDe,
{
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(_, v)| ValueIterMut {
value: pnk!(<V as ValueEnDe>::decode(&v)),
inner: v,
})
}
}
pub struct MapxOrdIterMut<'a, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
inner: mapx_raw::MapxRawIterMut<'a>,
_p: PhantomData<(K, V)>,
}
impl<'a, K, V> Iterator for MapxOrdIterMut<'a, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
type Item = (K, ValueIterMut<'a, V>);
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(k, v)| {
(
pnk!(<K as KeyEnDeOrdered>::from_bytes(k)),
ValueIterMut {
value: <V as ValueEnDe>::decode(&v).unwrap(),
inner: v,
},
)
})
}
}
impl<K, V> DoubleEndedIterator for MapxOrdIterMut<'_, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(k, v)| {
(
pnk!(<K as KeyEnDeOrdered>::from_bytes(k)),
ValueIterMut {
value: <V as ValueEnDe>::decode(&v).unwrap(),
inner: v,
},
)
})
}
}
pub struct Entry<'a, V>
where
V: ValueEnDe,
{
pub(crate) key: RawKey,
pub(crate) hdr: &'a mut MapxOrdRawKey<V>,
}
impl<'a, V> Entry<'a, V>
where
V: ValueEnDe,
{
pub fn or_insert(self, default: V) -> ValueMut<'a, V> {
crate::entry_or_insert_via_mock!(
self,
MapxOrdRawKey<V>,
get_mut(&self.key),
mock_value_mut(self.key, default)
)
}
}