#[cfg(test)]
mod test;
use crate::{ValueEnDe, basic::mapx_ord_rawkey::MapxOrdRawKey};
use ruc::*;
use serde::{Deserialize, Serialize};
use std::{
cmp::Ordering,
ops::{
Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign,
Deref, DerefMut, Div, DivAssign, Mul, MulAssign, Neg, Not, Rem, RemAssign, Shl,
ShlAssign, Shr, ShrAssign, Sub, SubAssign,
},
};
#[derive(Debug)]
pub struct Orphan<T> {
inner: MapxOrdRawKey<T>,
}
impl<T> Serialize for Orphan<T> {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.inner.serialize(serializer)
}
}
impl<'de, T> Deserialize<'de> for Orphan<T> {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
MapxOrdRawKey::deserialize(deserializer).map(|inner| Self { inner })
}
}
impl<T> Orphan<T>
where
T: ValueEnDe,
{
#[inline(always)]
pub unsafe fn shadow(&self) -> Self {
unsafe {
Self {
inner: self.inner.shadow(),
}
}
}
#[inline(always)]
pub unsafe fn from_bytes(s: impl AsRef<[u8]>) -> Self {
unsafe {
Self {
inner: MapxOrdRawKey::from_bytes(s),
}
}
}
#[inline(always)]
pub fn as_bytes(&self) -> &[u8] {
self.inner.as_bytes()
}
pub fn new(v: T) -> Self {
let mut hdr = MapxOrdRawKey::new();
hdr.insert([], &v);
Self { inner: hdr }
}
pub fn get_value(&self) -> T {
self.inner.get([]).unwrap()
}
pub fn set_value(&mut self, v: &T) {
self.inner.set_value([], v);
}
pub fn is_uninitialized(&self) -> bool {
self.inner.get([]).is_none()
}
pub fn initialize_if_empty(&mut self, v: T) {
if self.is_uninitialized() {
self.set_value(&v)
}
}
pub fn get_mut(&mut self) -> ValueMut<'_, T> {
let value = self.get_value();
ValueMut { hdr: self, value }
}
#[inline(always)]
pub fn is_the_same_instance(&self, other_hdr: &Self) -> bool {
self.inner.is_the_same_instance(&other_hdr.inner)
}
#[inline(always)]
pub fn instance_id(&self) -> u64 {
self.inner.instance_id()
}
pub fn save_meta(&self) -> ruc::Result<u64> {
let id = self.instance_id();
crate::common::save_instance_meta(id, self).c(d!())?;
Ok(id)
}
pub fn from_meta(instance_id: u64) -> ruc::Result<Self> {
crate::common::load_instance_meta(instance_id).c(d!())
}
}
impl<T> Clone for Orphan<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl<T: Default + ValueEnDe> Default for Orphan<T> {
fn default() -> Self {
let mut hdr = MapxOrdRawKey::new();
hdr.insert([], &T::default());
Self { inner: hdr }
}
}
impl<T> Eq for Orphan<T> where T: ValueEnDe + PartialEq {}
impl<T> PartialEq for Orphan<T>
where
T: ValueEnDe + PartialEq,
{
fn eq(&self, other: &Self) -> bool {
self.get_value() == other.get_value()
}
}
impl<T> PartialEq<T> for Orphan<T>
where
T: ValueEnDe + PartialEq,
{
fn eq(&self, other: &T) -> bool {
self.get_value() == *other
}
}
impl<T> Ord for Orphan<T>
where
T: ValueEnDe + Ord,
{
fn cmp(&self, other: &Self) -> Ordering {
self.get_value().cmp(&other.get_value())
}
}
impl<T> PartialOrd for Orphan<T>
where
T: ValueEnDe + Ord,
{
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl<T> PartialOrd<T> for Orphan<T>
where
T: ValueEnDe + Ord,
{
fn partial_cmp(&self, other: &T) -> Option<Ordering> {
self.get_value().partial_cmp(other)
}
}
macro_rules! impl_ops {
($ops: tt, $fn: tt, $op: tt) => {
impl<T> $ops for Orphan<T>
where
T: ValueEnDe + Ord + Eq + $ops<Output = T>,
{
type Output = T;
fn $fn(self, other: Self) -> Self::Output {
self.get_value() $op other.get_value()
}
}
impl<T> $ops<T> for Orphan<T>
where
T: ValueEnDe + Ord + Eq + $ops<Output = T>,
{
type Output = T;
fn $fn(self, other: T) -> Self::Output {
self.get_value() $op other
}
}
};
($ops: tt, $fn: tt, $op: tt, $ops_assign: tt, $fn_assign: tt, $op_assign: tt) => {
impl_ops!($ops, $fn, $op);
impl<T> $ops_assign for Orphan<T>
where
T: ValueEnDe + Ord + Eq + $ops_assign,
{
fn $fn_assign(&mut self, other: Self) {
*self.get_mut() $op_assign other.get_value();
}
}
impl<T> $ops_assign<T> for Orphan<T>
where
T: ValueEnDe + Ord + Eq + $ops_assign,
{
fn $fn_assign(&mut self, other: T) {
*self.get_mut() $op_assign other;
}
}
};
(@$ops: tt, $fn: tt, $op: tt) => {
impl<T> $ops for Orphan<T>
where
T: ValueEnDe + Ord + Eq + $ops<Output = T>,
{
type Output = T;
fn $fn(self) -> Self::Output {
$op self.get_value()
}
}
};
}
impl_ops!(Add, add, +, AddAssign, add_assign, +=);
impl_ops!(Sub, sub, -, SubAssign, sub_assign, -=);
impl_ops!(Mul, mul, *, MulAssign, mul_assign, *=);
impl_ops!(Div, div, /, DivAssign, div_assign, /=);
impl_ops!(Rem, rem, %, RemAssign, rem_assign, %=);
impl_ops!(BitAnd, bitand, &, BitAndAssign, bitand_assign, &=);
impl_ops!(BitOr, bitor, |, BitOrAssign, bitor_assign, |=);
impl_ops!(BitXor, bitxor, ^, BitXorAssign, bitxor_assign, ^=);
impl_ops!(Shl, shl, <<, ShlAssign, shl_assign, <<=);
impl_ops!(Shr, shr, >>, ShrAssign, shr_assign, >>=);
impl_ops!(@Not, not, !);
impl_ops!(@Neg, neg, -);
pub struct ValueMut<'a, T>
where
T: ValueEnDe,
{
hdr: &'a mut Orphan<T>,
value: T,
}
impl<T> Drop for ValueMut<'_, T>
where
T: ValueEnDe,
{
fn drop(&mut self) {
self.hdr.set_value(&self.value);
}
}
impl<T> Deref for ValueMut<'_, T>
where
T: ValueEnDe,
{
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<T> DerefMut for ValueMut<'_, T>
where
T: ValueEnDe,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.value
}
}