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
//! Safe memory comparison between types.
//!
//! Types found in this crate serve as safe wrappers around `memcmp` operations.
//!
//! # Usage
//!
//! This crate is available [on crates.io][crate] and can be used by adding the
//! following to your project's `Cargo.toml`:
//!
//! ```toml
//! [dependencies]
//! mem_cmp = "0.1.4"
//! ```
//!
//! and this to your crate root:
//!
//! ```
//! extern crate mem_cmp;
//! # fn main() {}
//! ```
//!
//! # Comparing Memory
//!
//! The [`MemOrd`] trait provides convenience around the result of a `memcmp`
//! call by returning an `Ordering`.
//!
//! If the only thing that matters is equality, [`MemEq`] is also available.
//!
//! ```
//! use mem_cmp::*;
//!
//! let a = [0u8; 256];
//! let b = [0u32; 64];
//! let c = [4u32; 64];
//!
//! assert!(a.mem_eq(&b));
//! assert!(a.mem_neq(&c));
//!
//! // Also works with types of different sizes:
//! assert!(a.mem_neq(&42));
//! ```
//!
//! # Safety
//!
//! Generally, comparing memory directly is safe. However, there are cases where
//! undefined behavior may be encountered.
//!
//! - **Types with padding:**
//!
//!   One such case is with types where the inner values are padded for
//!   alignment. Such a type would be `(u8, u32)`. It has an alignment of 4
//!   bytes, resulting in 3 bytes of padding between the first value and the
//!   second. It's up to the compiler to decide what the byte values are for
//!   the padding.
//!
//! [crate]: https://crates.io/crates/mem_cmp
//! [`MemEq`]: trait.MemEq.html
//! [`MemOrd`]: trait.MemOrd.html

#![no_std]
#![cfg_attr(feature = "simd", feature(repr_simd))]
#![cfg_attr(feature = "specialization", feature(specialization))]

#[cfg(feature = "simd")]
extern crate simd;

mod ext;
mod mem_eq;
mod mem_ord;
mod mem_ordered;

pub use mem_eq::*;
pub use mem_ord::*;
pub use mem_ordered::*;