Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ lockfree = "0.5.1"
uuid = { version = "1.11.0", features = ["v4"] }
ordered-float = "5.0.0"
# indexset = { version = "0.12.3", features = ["concurrent", "cdc", "multimap"] }
# indexset = { package = "wt-indexset", path = "../indexset", version = "0.12.5", features = ["concurrent", "cdc", "multimap"] }
indexset = { package = "wt-indexset", version = "0.12.6", features = ["concurrent", "cdc", "multimap"] }
indexset = { package = "wt-indexset", path = "../indexset", version = "0.12.6", features = ["concurrent", "cdc", "multimap"] }
# indexset = { package = "wt-indexset", version = "0.12.6", features = ["concurrent", "cdc", "multimap"] }
tokio = { version = "1", features = ["full"] }
12 changes: 6 additions & 6 deletions codegen/src/persistable/generator/obj_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ impl Generator {
if let GenericParam::Type(param) = generic {
let ident = &param.ident;
quote! {
#ident: Default + SizeMeasurable,
#ident: DefaultSizeMeasurable,
}
} else {
quote! {}
Expand Down Expand Up @@ -172,7 +172,7 @@ impl Generator {
);
quote! {
pub fn #fn_ident() -> usize {
<#ty as Default>::default().aligned_size()
<#ty as DefaultSizeMeasurable>::default_aligned_size()
}
}
}
Expand Down Expand Up @@ -218,7 +218,7 @@ impl Generator {
);
let len_in_vec = if is_primitive(&inner_ty_str) {
quote! {
align(length * <#inner_ty as Default>::default().aligned_size()) + 8
align(length * <#inner_ty as DefaultSizeMeasurable>::default_aligned_size()) + 8
}
} else {
quote! {
Expand All @@ -227,14 +227,14 @@ impl Generator {
};
let len_value = if is_primitive(&inner_ty_str) {
quote! {
<#inner_ty as Default>::default().aligned_size()
<#inner_ty as DefaultSizeMeasurable>::default_aligned_size()
}
} else {
quote! {
if <#inner_ty as SizeMeasurable>::align() == Some(8) {
align8(<#inner_ty as Default>::default().aligned_size())
align8(<#inner_ty as DefaultSizeMeasurable>::default_aligned_size())
} else {
<#inner_ty as Default>::default().aligned_size()
<#inner_ty as DefaultSizeMeasurable>::default_aligned_size()
}
}
};
Expand Down
6 changes: 3 additions & 3 deletions codegen/src/persistable/generator/persistable_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ impl Generator {
let size_type = &f.ty;
let size_ident = f.ident.as_ref().unwrap();
quote! {
let size_length = <#size_type as Default>::default().aligned_size();
let size_length = <#size_type as DefaultSizeMeasurable>::default_aligned_size();
let archived =
unsafe { rkyv::access_unchecked::<<#size_type as Archive>::Archived>(&bytes[offset..offset + size_length]) };
let #size_ident =
Expand All @@ -237,7 +237,7 @@ impl Generator {

fn gen_from_bytes_for_primitive(&self, ty: &Type, ident: &Ident) -> TokenStream {
quote! {
let length = <#ty as Default>::default().aligned_size();
let length = <#ty as DefaultSizeMeasurable>::default_aligned_size();
let mut v = rkyv::util::AlignedVec::<4>::new();
v.extend_from_slice(&bytes[offset..offset + length]);
let archived = unsafe { rkyv::access_unchecked::<<#ty as Archive>::Archived>(&v[..]) };
Expand Down Expand Up @@ -271,7 +271,7 @@ impl Generator {
let value_fn_ident = Ident::new(format!("{ident}_value_size").as_str(), Span::call_site());
let len = if is_primitive(&inner_ty_str) {
quote! {
let values_len = align(#size_ident as usize * <#inner_ty as Default>::default().aligned_size()) + 8;
let values_len = align(#size_ident as usize * <#inner_ty as DefaultSizeMeasurable>::default_aligned_size()) + 8;
}
} else {
quote! {
Expand Down
23 changes: 23 additions & 0 deletions codegen/src/size_measure/generator/enum_.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
use proc_macro2::TokenStream;
use quote::quote;
use syn::ItemEnum;

pub struct Generator {
pub enum_def: ItemEnum,
}
impl Generator {
pub fn gen_impl(&self) -> TokenStream {
let enum_ident = &self.enum_def.ident;

quote! {
impl SizeMeasurable for #enum_ident {
fn aligned_size(&self) -> usize {
std::mem::size_of::<#enum_ident>()
}
fn align() -> Option<usize> {
None
}
}
}
}
}
5 changes: 5 additions & 0 deletions codegen/src/size_measure/generator/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mod enum_;
mod structure;

pub use enum_::Generator as EnumGenerator;
pub use structure::Generator as StructGenerator;
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl Generator {
.map(|f| {
let t = &f.ty;
quote! {
if #t::align() == Some(8) {
if <#t as SizeMeasurable>::align() == Some(8) {
return Some(8)
}
}
Expand Down
30 changes: 21 additions & 9 deletions codegen/src/size_measure/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,30 @@ mod parser;
use proc_macro2::TokenStream;
use quote::quote;

use crate::size_measure::generator::Generator;
use crate::size_measure::generator::{EnumGenerator, StructGenerator};
use crate::size_measure::parser::Parser;

pub fn expand(input: &TokenStream) -> syn::Result<TokenStream> {
let input_fn = Parser::parse_struct(input)?;
let gen = Generator {
struct_def: input_fn,
};
if let Ok(input_fn) = Parser::parse_struct(input) {
let gen = StructGenerator {
struct_def: input_fn,
};
let impl_def = gen.gen_impl();

let impl_def = gen.gen_impl();
return Ok(quote! {
#impl_def
});
}
if let Ok(input_fn) = Parser::parse_enum(input) {
let gen = EnumGenerator { enum_def: input_fn };
let impl_def = gen.gen_impl();

Ok(quote! {
#impl_def
})
Ok(quote! {
#impl_def
})
} else {
Err(Parser::parse_enum(input)
.err()
.expect("should be error as checked before"))
}
}
9 changes: 8 additions & 1 deletion codegen/src/size_measure/parser.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use proc_macro2::TokenStream;
use syn::spanned::Spanned;
use syn::ItemStruct;
use syn::{ItemEnum, ItemStruct};

pub struct Parser;

Expand All @@ -11,4 +11,11 @@ impl Parser {
Err(err) => Err(syn::Error::new(input.span(), err.to_string())),
}
}

pub fn parse_enum(input: &TokenStream) -> syn::Result<ItemEnum> {
match syn::parse2::<ItemEnum>(input.clone()) {
Ok(data) => Ok(data),
Err(err) => Err(syn::Error::new(input.span(), err.to_string())),
}
}
}
5 changes: 4 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,7 @@ pub use page::{
};
pub use persistence::{PersistableIndex, PersistableTable};
pub use space::Id as SpaceId;
pub use util::{align, align8, align_vec, Persistable, SizeMeasurable, VariableSizeMeasurable};
pub use util::{
align, align8, align_vec, DefaultSizeMeasurable, Persistable, SizeMeasurable,
VariableSizeMeasurable,
};
16 changes: 16 additions & 0 deletions src/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,22 @@ pub struct Link {
pub length: u32,
}

impl Link {
/// Unites two [`Link`]'s into one if they have same border. If [`Link`]'s
/// could not be united, `None` returned.
pub fn unite(self, other: Link) -> Option<Link> {
if self.offset + self.length != other.offset || self.page_id != other.page_id {
None
} else {
Some(Link {
page_id: self.page_id,
offset: self.offset,
length: self.length + other.length,
})
}
}
}

#[cfg(test)]
mod tests {
use crate::link::Link;
Expand Down
15 changes: 8 additions & 7 deletions src/page/index/page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@ use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt};
use crate::page::index::IndexPageUtility;
use crate::page::{IndexValue, PageId};
use crate::{
align, align8, seek_to_page_start, Link, Persistable, SizeMeasurable, GENERAL_HEADER_SIZE,
align, align8, seek_to_page_start, DefaultSizeMeasurable, Link, Persistable, SizeMeasurable,
GENERAL_HEADER_SIZE,
};

pub fn get_index_page_size_from_data_length<T>(length: usize) -> usize
where
T: Default + SizeMeasurable,
T: DefaultSizeMeasurable,
{
let size_field_size = IndexPage::<T>::size_size();
let node_id_size = IndexPage::<T>::node_id_size();
Expand All @@ -51,7 +52,7 @@ where
Archive, Clone, Deserialize, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Persistable,
)]
#[persistable(by_parts)]
pub struct IndexPage<T: Default + SizeMeasurable> {
pub struct IndexPage<T: DefaultSizeMeasurable> {
pub size: u16,
pub node_id: IndexValue<T>,
pub current_index: u16,
Expand All @@ -64,15 +65,15 @@ pub struct IndexPage<T: Default + SizeMeasurable> {
Archive, Clone, Deserialize, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Persistable,
)]
#[persistable(by_parts)]
pub struct SizedIndexPageUtility<T: Default + SizeMeasurable> {
pub struct SizedIndexPageUtility<T: DefaultSizeMeasurable> {
pub size: u16,
pub node_id: IndexValue<T>,
pub current_index: u16,
pub current_length: u16,
pub slots: Vec<u16>,
}

impl<T: Default + SizeMeasurable> IndexPageUtility<T> for IndexPage<T>
impl<T: DefaultSizeMeasurable> IndexPageUtility<T> for IndexPage<T>
where
T: Archive
+ for<'a> Serialize<
Expand Down Expand Up @@ -114,7 +115,7 @@ where
}
}

impl<T: Default + SizeMeasurable> IndexPage<T> {
impl<T: DefaultSizeMeasurable> IndexPage<T> {
pub fn new(node_id: IndexValue<T>, size: usize) -> Self
where
T: Clone,
Expand Down Expand Up @@ -189,7 +190,7 @@ impl<T: Default + SizeMeasurable> IndexPage<T> {

fn get_value_offset(size: usize, value_index: usize) -> usize
where
T: Default + SizeMeasurable,
T: DefaultSizeMeasurable,
{
let mut offset = GENERAL_HEADER_SIZE;
offset += IndexPage::<T>::size_size();
Expand Down
4 changes: 2 additions & 2 deletions src/page/index/page_cdc_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ use rkyv::ser::Serializer;
use rkyv::util::AlignedVec;
use rkyv::{Archive, Deserialize, Serialize};

use crate::{IndexPage, IndexValue, Link, SizeMeasurable};
use crate::{DefaultSizeMeasurable, IndexPage, IndexValue, Link};

impl<T: Default + SizeMeasurable> IndexPage<T>
impl<T: DefaultSizeMeasurable> IndexPage<T>
where
T: Archive
+ Debug
Expand Down
14 changes: 8 additions & 6 deletions src/page/index/page_for_unsized.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt};
use crate::page::index::IndexPageUtility;
use crate::page::PageId;
use crate::{align8, VariableSizeMeasurable};
use crate::{seek_to_page_start, IndexValue, SizeMeasurable, GENERAL_HEADER_SIZE};
use crate::{
seek_to_page_start, DefaultSizeMeasurable, IndexValue, SizeMeasurable, GENERAL_HEADER_SIZE,
};
use crate::{Link, Persistable};

#[derive(Archive, Clone, Deserialize, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
pub struct UnsizedIndexPage<
T: Default + SizeMeasurable + VariableSizeMeasurable,
T: DefaultSizeMeasurable + VariableSizeMeasurable,
const DATA_LENGTH: u32,
> {
pub slots_size: u16,
Expand All @@ -37,7 +39,7 @@ pub struct UnsizedIndexPage<
Archive, Clone, Deserialize, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Persistable,
)]
#[persistable(by_parts, unsized_gens)]
pub struct UnsizedIndexPageUtility<T: Default + SizeMeasurable + VariableSizeMeasurable> {
pub struct UnsizedIndexPageUtility<T: DefaultSizeMeasurable + VariableSizeMeasurable> {
pub slots_size: u16,
pub node_id_size: u16,
pub node_id: IndexValue<T>,
Expand All @@ -46,7 +48,7 @@ pub struct UnsizedIndexPageUtility<T: Default + SizeMeasurable + VariableSizeMea
pub slots: Vec<(u32, u16)>,
}

impl<T: Default + SizeMeasurable + VariableSizeMeasurable> UnsizedIndexPageUtility<T> {
impl<T: DefaultSizeMeasurable + VariableSizeMeasurable> UnsizedIndexPageUtility<T> {
pub fn update_node_id(&mut self, node_id: IndexValue<T>) -> eyre::Result<()> {
self.node_id_size = node_id.aligned_size() as u16;
self.node_id = node_id;
Expand All @@ -55,8 +57,8 @@ impl<T: Default + SizeMeasurable + VariableSizeMeasurable> UnsizedIndexPageUtili
}
}

impl<T: Default + SizeMeasurable + VariableSizeMeasurable, const DATA_LENGTH: u32>
IndexPageUtility<T> for UnsizedIndexPage<T, DATA_LENGTH>
impl<T: DefaultSizeMeasurable + VariableSizeMeasurable, const DATA_LENGTH: u32> IndexPageUtility<T>
for UnsizedIndexPage<T, DATA_LENGTH>
where
T: Archive
+ Debug
Expand Down
4 changes: 2 additions & 2 deletions src/page/index/table_of_contents_page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::collections::BTreeMap;
use std::fmt::Debug;

use crate::page::PageId;
use crate::{align, Persistable, SizeMeasurable};
use crate::{align, DefaultSizeMeasurable, Persistable, SizeMeasurable};

#[derive(Archive, Clone, Deserialize, Debug, Serialize)]
pub struct TableOfContentsPage<T: Ord + Eq> {
Expand All @@ -21,7 +21,7 @@ where
Self {
records: BTreeMap::new(),
empty_pages: vec![],
estimated_size: usize::default().aligned_size() + 12,
estimated_size: usize::default_aligned_size() + 12,
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/util/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ mod persistable;
mod sized;

pub use persistable::Persistable;
pub use sized::{align, align8, align_vec, SizeMeasurable, VariableSizeMeasurable};
pub use sized::{
align, align8, align_vec, DefaultSizeMeasurable, SizeMeasurable, VariableSizeMeasurable,
};
Loading
Loading