pub struct VFunc<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic = usize, S: BitFieldSlice<O> = BitFieldVec<O>> { /* private fields */ }
Expand description
Static functions with 10%-11% space overhead for large key sets, fast parallel construction, and fast queries.
Instances of this structure are immutable; they are built using a VFuncBuilder
,
and can be serialized using ε-serde.
Implementations§
source§impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S: BitFieldSlice<O>> VFunc<T, O, S>where
O::AtomicType: AtomicUnsignedInt + AsBytes,
BitFieldVec<O>: From<AtomicBitFieldVec<O, Vec<O::AtomicType>>>,
impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S: BitFieldSlice<O>> VFunc<T, O, S>where
O::AtomicType: AtomicUnsignedInt + AsBytes,
BitFieldVec<O>: From<AtomicBitFieldVec<O, Vec<O::AtomicType>>>,
sourcepub fn get_by_sig(&self, sig: &[u64; 2]) -> O
pub fn get_by_sig(&self, sig: &[u64; 2]) -> O
Return the value associated with the given signature.
This method is mainly useful in the construction of compound functions.
sourcepub fn get(&self, key: &T) -> O
pub fn get(&self, key: &T) -> O
Return the value associated with the given key, or a random value if the key is not present.
Examples found in repository?
examples/bench_vfunc.rs (line 45)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
fn main() -> Result<()> {
env_logger::builder()
.filter_level(log::LevelFilter::Info)
.try_init()?;
let mut pl = ProgressLogger::default();
let args = Args::parse();
if let Some(filename) = args.filename {
let func = VFunc::<_>::load_mem(&args.func)?;
let keys: Vec<_> = LineLender::from_path(filename)?
.map_into_iter(|x| x.unwrap().to_owned())
.take(args.n)
.collect();
pl.start("Querying...");
for (i, key) in keys.iter().enumerate() {
assert_eq!(i, func.get(key));
}
pl.done_with_count(keys.len());
} else {
let func = VFunc::<_>::load_mem(&args.func)?;
pl.start("Querying...");
for i in 0..args.n {
assert_eq!(i, func.get(&i));
}
pl.done_with_count(args.n);
}
Ok(())
}
Trait Implementations§
source§impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S: BitFieldSlice<O>> CopyType for VFunc<T, O, S>
impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S: BitFieldSlice<O>> CopyType for VFunc<T, O, S>
source§impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> CopyType for VFunc<T, O, S>where
u64: MemSize,
u32: MemSize,
usize: MemSize,
S: MemSize + BitFieldSlice<O>,
PhantomData<T>: MemSize,
PhantomData<O>: MemSize,
impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> CopyType for VFunc<T, O, S>where
u64: MemSize,
u32: MemSize,
usize: MemSize,
S: MemSize + BitFieldSlice<O>,
PhantomData<T>: MemSize,
PhantomData<O>: MemSize,
source§impl<T: Debug + ?Sized + ToSig, O: Debug + ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S: Debug + BitFieldSlice<O>> Debug for VFunc<T, O, S>
impl<T: Debug + ?Sized + ToSig, O: Debug + ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S: Debug + BitFieldSlice<O>> Debug for VFunc<T, O, S>
source§impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> DeserializeInner for VFunc<T, O, S>where
u64: DeserializeInner,
u32: DeserializeInner,
usize: DeserializeInner,
S: DeserializeInner + BitFieldSlice<O>,
PhantomData<T>: DeserializeInner,
PhantomData<O>: DeserializeInner,
for<'epserde_desertype> <S as DeserializeInner>::DeserType<'epserde_desertype>: BitFieldSlice<O>,
impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> DeserializeInner for VFunc<T, O, S>where
u64: DeserializeInner,
u32: DeserializeInner,
usize: DeserializeInner,
S: DeserializeInner + BitFieldSlice<O>,
PhantomData<T>: DeserializeInner,
PhantomData<O>: DeserializeInner,
for<'epserde_desertype> <S as DeserializeInner>::DeserType<'epserde_desertype>: BitFieldSlice<O>,
fn _deserialize_full_inner( backend: &mut impl ReadWithPos ) -> Result<Self, Error>
§type DeserType<'epserde_desertype> = VFunc<T, O, <S as DeserializeInner>::DeserType<'epserde_desertype>>
type DeserType<'epserde_desertype> = VFunc<T, O, <S as DeserializeInner>::DeserType<'epserde_desertype>>
The deserialization type associated with this type. It can be
retrieved conveniently with the alias
DeserType
.fn _deserialize_eps_inner<'a>( backend: &mut SliceWithPos<'a> ) -> Result<Self::DeserType<'a>, Error>
source§impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> MemDbgImpl for VFunc<T, O, S>where
u64: MemDbgImpl,
u32: MemDbgImpl,
usize: MemDbgImpl,
S: MemDbgImpl + BitFieldSlice<O>,
PhantomData<T>: MemDbgImpl,
PhantomData<O>: MemDbgImpl,
impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> MemDbgImpl for VFunc<T, O, S>where
u64: MemDbgImpl,
u32: MemDbgImpl,
usize: MemDbgImpl,
S: MemDbgImpl + BitFieldSlice<O>,
PhantomData<T>: MemDbgImpl,
PhantomData<O>: MemDbgImpl,
source§impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> MemSize for VFunc<T, O, S>where
u64: MemSize,
u32: MemSize,
usize: MemSize,
S: MemSize + BitFieldSlice<O>,
PhantomData<T>: MemSize,
PhantomData<O>: MemSize,
impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> MemSize for VFunc<T, O, S>where
u64: MemSize,
u32: MemSize,
usize: MemSize,
S: MemSize + BitFieldSlice<O>,
PhantomData<T>: MemSize,
PhantomData<O>: MemSize,
source§impl<T: ?Sized + ToSig + ReprHash, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic + ReprHash, S: BitFieldSlice<O> + ReprHash> ReprHash for VFunc<T, O, S>
impl<T: ?Sized + ToSig + ReprHash, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic + ReprHash, S: BitFieldSlice<O> + ReprHash> ReprHash for VFunc<T, O, S>
source§impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> SerializeInner for VFunc<T, O, S>where
u64: SerializeInner,
u32: SerializeInner,
usize: SerializeInner,
S: SerializeInner + BitFieldSlice<O>,
PhantomData<T>: SerializeInner,
PhantomData<O>: SerializeInner,
impl<T: ?Sized + ToSig, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic, S> SerializeInner for VFunc<T, O, S>where
u64: SerializeInner,
u32: SerializeInner,
usize: SerializeInner,
S: SerializeInner + BitFieldSlice<O>,
PhantomData<T>: SerializeInner,
PhantomData<O>: SerializeInner,
source§const IS_ZERO_COPY: bool = _
const IS_ZERO_COPY: bool = _
Inner constant used by the derive macros to keep
track recursively of whether the type
satisfies the conditions for being zero-copy. It is checked
at runtime against the trait implemented by the type, and
if a
ZeroCopy
type has this constant set to false
serialization will panic.source§const ZERO_COPY_MISMATCH: bool = _
const ZERO_COPY_MISMATCH: bool = _
Inner constant used by the derive macros to keep
track of whether all fields of a type are zero-copy
but neither the attribute
#[zero_copy]
nor the attribute #[deep_copy]
was specified. It is checked at runtime, and if it is true
a warning will be issued, as the type could be zero-copy,
which would be more efficient.source§fn _serialize_inner(&self, backend: &mut impl WriteWithNames) -> Result<()>
fn _serialize_inner(&self, backend: &mut impl WriteWithNames) -> Result<()>
Serialize this structure using the given backend.
source§impl<T: ?Sized + ToSig + TypeHash, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic + TypeHash, S: BitFieldSlice<O> + TypeHash> TypeHash for VFunc<T, O, S>
impl<T: ?Sized + ToSig + TypeHash, O: ZeroCopy + SerializeInner + DeserializeInner + Word + IntoAtomic + TypeHash, S: BitFieldSlice<O> + TypeHash> TypeHash for VFunc<T, O, S>
source§fn type_hash_val(&self, hasher: &mut impl Hasher)
fn type_hash_val(&self, hasher: &mut impl Hasher)
Call
TypeHash::type_hash
on a value.Auto Trait Implementations§
impl<T: ?Sized, O, S> Freeze for VFunc<T, O, S>where
S: Freeze,
impl<T: ?Sized, O, S> RefUnwindSafe for VFunc<T, O, S>
impl<T: ?Sized, O, S> Send for VFunc<T, O, S>
impl<T: ?Sized, O, S> Sync for VFunc<T, O, S>
impl<T: ?Sized, O, S> Unpin for VFunc<T, O, S>
impl<T: ?Sized, O, S> UnwindSafe for VFunc<T, O, S>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T, U> CastableInto<U> for Twhere
U: CastableFrom<T>,
impl<T, U> CastableInto<U> for Twhere
U: CastableFrom<T>,
source§impl<T> Deserialize for T
impl<T> Deserialize for T
source§fn deserialize_full(backend: &mut impl ReadNoStd) -> Result<T, Error>
fn deserialize_full(backend: &mut impl ReadNoStd) -> Result<T, Error>
Fully deserialize a structure of this type from the given backend.
source§fn deserialize_eps(
backend: &[u8]
) -> Result<<T as DeserializeInner>::DeserType<'_>, Error>
fn deserialize_eps( backend: &[u8] ) -> Result<<T as DeserializeInner>::DeserType<'_>, Error>
ε-copy deserialize a structure of this type from the given backend.
source§fn load_full(path: impl AsRef<Path>) -> Result<Self, Error>
fn load_full(path: impl AsRef<Path>) -> Result<Self, Error>
Commodity method to fully deserialize from a file.
source§impl<T> DowncastableFrom<T> for T
impl<T> DowncastableFrom<T> for T
source§fn downcast_from(value: T) -> T
fn downcast_from(value: T) -> T
Truncate the current UnsignedInt to a possibly smaller size
source§impl<T, U> DowncastableInto<U> for Twhere
U: DowncastableFrom<T>,
impl<T, U> DowncastableInto<U> for Twhere
U: DowncastableFrom<T>,
source§impl<T> MemDbg for Twhere
T: MemDbgImpl,
impl<T> MemDbg for Twhere
T: MemDbgImpl,
source§fn mem_dbg(&self, flags: DbgFlags) -> Result<(), Error>
fn mem_dbg(&self, flags: DbgFlags) -> Result<(), Error>
Write to stdout debug infos about the structure memory usage, expanding
all levels of nested structures.
source§fn mem_dbg_on(
&self,
writer: &mut impl Write,
flags: DbgFlags
) -> Result<(), Error>
fn mem_dbg_on( &self, writer: &mut impl Write, flags: DbgFlags ) -> Result<(), Error>
Write to a
core::fmt::Write
debug infos about the structure memory usage,
expanding all levels of nested structures.source§fn mem_dbg_depth(
&self,
total_size: usize,
max_depth: usize,
flags: DbgFlags
) -> Result<(), Error>
fn mem_dbg_depth( &self, total_size: usize, max_depth: usize, flags: DbgFlags ) -> Result<(), Error>
Write to stdout debug infos about the structure memory usage, but expanding only
up to
max_depth
levels of nested structures.source§fn mem_dbg_depth_on(
&self,
writer: &mut impl Write,
total_size: usize,
max_depth: usize,
prefix: &mut String,
field_name: Option<&str>,
is_last: bool,
flags: DbgFlags
) -> Result<(), Error>
fn mem_dbg_depth_on( &self, writer: &mut impl Write, total_size: usize, max_depth: usize, prefix: &mut String, field_name: Option<&str>, is_last: bool, flags: DbgFlags ) -> Result<(), Error>
Write to a
core::fmt::Write
debug infos about the structure memory usage,
but expanding only up to max_depth
levels of nested structures.source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> Serialize for T
impl<T> Serialize for T
source§fn serialize_on_field_write(
&self,
backend: &mut impl WriteWithNames
) -> Result<(), Error>
fn serialize_on_field_write( &self, backend: &mut impl WriteWithNames ) -> Result<(), Error>
Serialize the type using the given WriteWithNames
.
source§fn serialize(&self, backend: &mut impl WriteNoStd) -> Result<usize, Error>
fn serialize(&self, backend: &mut impl WriteNoStd) -> Result<usize, Error>
Serialize the type using the given backend.
source§fn serialize_with_schema(
&self,
backend: &mut impl WriteNoStd
) -> Result<Schema, Error>
fn serialize_with_schema( &self, backend: &mut impl WriteNoStd ) -> Result<Schema, Error>
source§impl<T> UpcastableFrom<T> for T
impl<T> UpcastableFrom<T> for T
source§fn upcast_from(value: T) -> T
fn upcast_from(value: T) -> T
Extend the current UnsignedInt to a possibly bigger size.