-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathlib.rs
76 lines (66 loc) · 2.8 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//! Types that can be used to serialize and deserialize types inside databases.
//!
//! How to choose the right type to store things in this database?
//! For specific types you can choose:
//! - [`Str`] to store [`str`](primitive@str)s
//! - [`Unit`] to store `()` types
//! - [`SerdeBincode`] or [`SerdeJson`] to store [`Serialize`]/[`Deserialize`] types
//!
//! But if you want to store big types that can be efficiently deserialized then
//! here is a little table to help you in your quest:
//!
//! | Available types | Encoding type | Decoding type | allocations |
//! |--------------------|:-------------:|:-------------:|----------------------------------------------------------|
//! | [`CowSlice`] | `&[T]` | `Cow<[T]>` | will allocate if memory is miss-aligned |
//! | [`CowType`] | `&T` | `Cow<T>` | will allocate if memory is miss-aligned |
//! | [`OwnedSlice`] | `&[T]` | `Vec<T>` | will _always_ allocate |
//! | [`OwnedType`] | `&T` | `T` | will _always_ allocate |
//! | [`UnalignedSlice`] | `&[T]` | `&[T]` | will _never_ allocate because alignement is always valid |
//! | [`UnalignedType`] | `&T` | `&T` | will _never_ allocate because alignement is always valid |
//!
//! [`Serialize`]: serde::Serialize
//! [`Deserialize`]: serde::Deserialize
mod cow_slice;
mod cow_type;
mod integer;
mod owned_slice;
mod owned_type;
mod str;
mod unaligned_slice;
mod unaligned_type;
mod unit;
#[cfg(feature = "serde-bincode")]
mod serde_bincode;
#[cfg(feature = "serde-json")]
mod serde_json;
use std::convert::Infallible;
pub use self::cow_slice::CowSlice;
pub use self::cow_type::CowType;
pub use self::integer::*;
pub use self::owned_slice::OwnedSlice;
pub use self::owned_type::OwnedType;
pub use self::str::Str;
pub use self::unaligned_slice::UnalignedSlice;
pub use self::unaligned_type::UnalignedType;
pub use self::unit::Unit;
/// Describes a slice of bytes `[u8]` that is totally
/// borrowed and doesn't depends on any [memory alignment].
///
/// [memory alignment]: std::mem::align_of()
pub type ByteSlice = UnalignedSlice<u8>;
/// A convenient struct made to ignore the type when decoding it.
///
/// It is appropriate to be used to count keys for example
/// or to ensure that an entry exist for example.
pub struct DecodeIgnore;
impl heed_traits::BytesDecode<'_> for DecodeIgnore {
type DItem = ();
type Err = Infallible;
fn bytes_decode(_bytes: &[u8]) -> Result<Self::DItem, Self::Err> {
Ok(())
}
}
#[cfg(feature = "serde-bincode")]
pub use self::serde_bincode::SerdeBincode;
#[cfg(feature = "serde-json")]
pub use self::serde_json::SerdeJson;