aboutsummaryrefslogtreecommitdiff
path: root/vendor/lebe
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/lebe')
-rw-r--r--vendor/lebe/.cargo-checksum.json1
-rw-r--r--vendor/lebe/Cargo.toml61
-rw-r--r--vendor/lebe/LICENSE-BSD-3-Clause26
-rw-r--r--vendor/lebe/README.md90
-rw-r--r--vendor/lebe/benches/benches.rs137
-rw-r--r--vendor/lebe/src/lib.rs578
-rw-r--r--vendor/lebe/tests/tests.rs213
7 files changed, 0 insertions, 1106 deletions
diff --git a/vendor/lebe/.cargo-checksum.json b/vendor/lebe/.cargo-checksum.json
deleted file mode 100644
index 14ab426..0000000
--- a/vendor/lebe/.cargo-checksum.json
+++ /dev/null
@@ -1 +0,0 @@
-{"files":{"Cargo.toml":"365b393a87b2706f0eb52139c1ce3909e47ca4e1226cf7bdcae4e4c1d0f386b5","LICENSE-BSD-3-Clause":"f1b2855ae21da69e0a02499e13f57f3be92db7abbbffe9a89f33e04e9e21ec81","README.md":"d9f3a595b28433de13f0c88ae049a73af3d88068f08dd8364d45504224651448","benches/benches.rs":"a73feca65ddde13e082121cc2268318fc72a87029f2d7106f939a4356af3e232","src/lib.rs":"72567c8ad6ae8e59d59ce2e9ffcfa8f013bb24f104b128d92a52f034f592b777","tests/tests.rs":"76b860f51bef80c4223f06998fbed540d9bcd0ddc4fa1ed0f0c0964e3d58bdcc"},"package":"03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"} \ No newline at end of file
diff --git a/vendor/lebe/Cargo.toml b/vendor/lebe/Cargo.toml
deleted file mode 100644
index 38a619e..0000000
--- a/vendor/lebe/Cargo.toml
+++ /dev/null
@@ -1,61 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
-#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
-
-[package]
-edition = "2018"
-name = "lebe"
-version = "0.5.2"
-authors = ["johannesvollmer <johannes596@t-online.de>"]
-description = "Tiny, dead simple, high performance endianness conversions with a generic API"
-documentation = "https://docs.rs/crate/lebe/"
-readme = "README.md"
-keywords = [
- "endianness",
- "binary",
- "io",
- "byteorder",
- "endian",
-]
-categories = [
- "encoding",
- "filesystem",
- "algorithms",
-]
-license = "BSD-3-Clause"
-repository = "https://github.com/johannesvollmer/lebe"
-
-[profile.bench]
-lto = true
-debug = true
-
-[lib]
-path = "src/lib.rs"
-test = true
-doctest = true
-bench = true
-doc = true
-plugin = false
-proc-macro = false
-
-[[bench]]
-name = "benches"
-harness = false
-
-[dev-dependencies.bencher]
-version = "0.1.5"
-
-[dev-dependencies.byteorder]
-version = "1.4.3"
-
-[features]
-
-[badges.maintenance]
-status = "actively-developed"
diff --git a/vendor/lebe/LICENSE-BSD-3-Clause b/vendor/lebe/LICENSE-BSD-3-Clause
deleted file mode 100644
index 8c53234..0000000
--- a/vendor/lebe/LICENSE-BSD-3-Clause
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright (c) 2022 Contributors to the lebe Project. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holder nor the names of its contributors
-may be used to endorse or promote products derived from this software without
-specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
-USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/lebe/README.md b/vendor/lebe/README.md
deleted file mode 100644
index d32a28a..0000000
--- a/vendor/lebe/README.md
+++ /dev/null
@@ -1,90 +0,0 @@
-[![Rust Docs](https://docs.rs/lebe/badge.svg)](https://docs.rs/lebe)
-[![Crate Crate](https://img.shields.io/crates/v/lebe.svg)](https://crates.io/crates/lebe)
-![Lines of Code](https://tokei.rs/b1/github/johannesvollmer/lebe?category=code)
-
-
-# LEBE
-Tiny, dead simple, high performance endianness conversions with a generic API.
-This crate purposefully does not have a different method, like `write_u16(my_value)`, for each primitive type. Instead, this uses generic type inference: `write(my_u16)`.
-
-# Purpose
-This crate has exactly two purposes:
- 1. Simple conversion between slices of primitives and byte arrays without unsafe code
- 2. Simple and fast conversion from one endianness to the other one
-
-The [byteorder crate](https://github.com/BurntSushi/byteorder) uses ![Lines of Code](https://tokei.rs/b1/github/BurntSushi/byteorder?category=code) for this.
-
-This simplifies reading and writing binary data to files or network streams.
-
-
-# Usage
-
-Write values.
-```rust
- use lebe::io::WriteEndian;
- use std::io::Write;
-
- fn main(){
- let mut output_bytes: Vec<u8> = Vec::new();
-
- let numbers: &[i32] = &[ 32, 102, 420, 594 ];
- output_bytes.write_as_little_endian(numbers.len()).unwrap();
- output_bytes.write_as_little_endian(numbers).unwrap();
- }
-```
-
-Read numbers.
-```rust
- use lebe::io::ReadEndian;
- use std::io::Read;
-
- fn main(){
- let mut input_bytes: &[u8] = &[ 3, 244 ];
- let number: u16 = input_bytes.read_from_little_endian().unwrap();
- }
-```
-
-Read slices.
-```rust
- use lebe::io::ReadEndian;
- use std::io::Read;
-
- fn main(){
- let mut input_bytes: &[u8] = &[ 0, 2, 0, 3, 244, 1, 0, 3, 244, 1 ];
-
- let len: u16 = input_bytes.read_from_little_endian().unwrap();
- let mut numbers = vec![ 0.0; len as usize ];
-
- input_bytes.read_from_little_endian_into(numbers.as_mut_slice()).unwrap();
- }
-```
-
-Convert slices in-place.
-```rust
- use lebe::Endian;
-
- fn main(){
- let mut numbers: &[i32] = &[ 32, 102, 420, 594 ];
- numbers.convert_current_to_little_endian();
- }
-```
-
-
-# Why not use [byteorder](https://crates.io/crates/byteorder)?
-This crate supports batch-writing slices with native speed
-where the os has the matching endianness. Writing slices in `byteorder`
-must be done manually, and may be slower than expected.
-This crate does provide u8 and i8 slice operations for completeness.
-Also, the API of this crate looks simpler.
-
-# Why not use [endianness](https://crates.io/crates/endianness)?
-This crate has no runtime costs, just as `byteorder`.
-
-# Why not use this crate?
-The other crates probably have better documentation.
-
-
-# Fun Facts
-LEBE is made up from 'le' for little endian and 'be' for big endian.
-If you say that word using english pronounciation,
-a german might think you said the german word for 'love'.
diff --git a/vendor/lebe/benches/benches.rs b/vendor/lebe/benches/benches.rs
deleted file mode 100644
index eca67f5..0000000
--- a/vendor/lebe/benches/benches.rs
+++ /dev/null
@@ -1,137 +0,0 @@
-#[macro_use]
-extern crate bencher;
-
-use bencher::Bencher;
-use lebe::prelude::*;
-use byteorder::{ReadBytesExt, LittleEndian, BigEndian, WriteBytesExt};
-use std::io::{Read, Write, Cursor};
-
-const COUNT_8: usize = 2048;
-const COUNT_16: usize = COUNT_8 / 2;
-const COUNT_32: usize = COUNT_8 / 4;
-const COUNT_64: usize = COUNT_8 / 8;
-
-
-fn bytes(count: usize) -> Cursor<Vec<u8>> {
- let vec: Vec<u8> = (0..count).map(|i| (i % 256) as u8).collect();
- Cursor::new(vec)
-}
-
-fn floats(count: usize) -> Vec<f32> {
- (0..count).map(|i| i as f32).collect()
-}
-
-fn read_slice_f32_le_crate(bench: &mut Bencher) {
- bench.iter(move ||{
- let mut target = vec![ 0_f32; COUNT_32 ];
- bencher::black_box(bytes(COUNT_8).read_from_little_endian_into(target.as_mut_slice())).unwrap();
- bencher::black_box(target);
- })
-}
-
-fn read_slice_f32_le_byteorder(bench: &mut Bencher) {
- bench.iter(move ||{
- let mut target = vec![ 0_f32; COUNT_32 ];
- bencher::black_box(bytes(COUNT_8).read_f32_into::<LittleEndian>(target.as_mut_slice())).unwrap();
- bencher::black_box(target);
- })
-}
-
-fn read_slice_f32_be_crate(bench: &mut Bencher) {
- bench.iter(move ||{
- let mut target = vec![ 0_f32; COUNT_32 ];
- bencher::black_box(bytes(COUNT_8).read_from_big_endian_into(target.as_mut_slice())).unwrap();
- bencher::black_box(target);
- })
-}
-
-fn read_slice_f32_be_byteorder(bench: &mut Bencher) {
- bench.iter(move ||{
- let mut target = vec![ 0_f32; COUNT_32 ];
- bencher::black_box(bytes(COUNT_8).read_f32_into::<BigEndian>(target.as_mut_slice())).unwrap();
- bencher::black_box(target);
- })
-}
-
-// FIXME faster than baseline?!?!!
-fn write_slice_f32_le_crate(bench: &mut Bencher) {
- bench.iter(move ||{
- let data = floats(COUNT_32);
- let mut output = Vec::with_capacity(COUNT_8);
-
- bencher::black_box(output.write_as_little_endian(data.as_slice())).unwrap();
- assert_eq!(output.len(), COUNT_8);
- bencher::black_box(output);
- })
-}
-
-fn write_slice_f32_le_byteorder(bench: &mut Bencher) {
- bench.iter(move ||{
- let data = floats(COUNT_32);
- let mut output = Vec::with_capacity(COUNT_8);
-
- for number in data {
- bencher::black_box(output.write_f32::<LittleEndian>(number)).unwrap();
- }
-
- assert_eq!(output.len(), COUNT_8);
- bencher::black_box(output);
- })
-}
-
-
-fn write_slice_f32_be_crate(bench: &mut Bencher) {
- bench.iter(move ||{
- let data = floats(COUNT_32);
- let mut output = Vec::with_capacity(COUNT_8);
-
- bencher::black_box(output.write_as_big_endian(data.as_slice())).unwrap();
- assert_eq!(output.len(), COUNT_8);
- bencher::black_box(output);
- })
-}
-
-fn write_slice_f32_be_byteorder(bench: &mut Bencher) {
- bench.iter(move ||{
- let data = floats(COUNT_32);
- let mut output = Vec::with_capacity(COUNT_8);
-
- for number in data {
- bencher::black_box(output.write_f32::<BigEndian>(number)).unwrap();
- }
-
- assert_eq!(output.len(), COUNT_8);
- bencher::black_box(output);
- })
-}
-
-
-
-fn read_slice_baseline(bench: &mut Bencher) {
- bench.iter(move ||{
- let mut target = vec![ 0_u8; COUNT_8 ];
- bencher::black_box(bytes(COUNT_8).read_exact(target.as_mut_slice())).unwrap();
- bencher::black_box(target);
- })
-}
-
-
-fn write_slice_baseline(bench: &mut Bencher) {
- bench.iter(move ||{
- let data = bytes(COUNT_8).into_inner();
- let mut output = Vec::with_capacity(COUNT_8);
-
- bencher::black_box(output.write_all(data.as_slice())).unwrap();
- bencher::black_box(output);
- })
-}
-
-benchmark_group!(
- benches,
- read_slice_f32_be_byteorder, read_slice_f32_be_crate, read_slice_f32_le_byteorder,
- read_slice_f32_le_crate, write_slice_f32_le_byteorder, write_slice_f32_le_crate,
- write_slice_f32_be_byteorder, write_slice_f32_be_crate,
- read_slice_baseline, write_slice_baseline
-);
-
-benchmark_main!(benches); \ No newline at end of file
diff --git a/vendor/lebe/src/lib.rs b/vendor/lebe/src/lib.rs
deleted file mode 100644
index fbb4482..0000000
--- a/vendor/lebe/src/lib.rs
+++ /dev/null
@@ -1,578 +0,0 @@
-#![warn(
- missing_docs, unused,
- trivial_numeric_casts,
- future_incompatible,
- rust_2018_compatibility,
- rust_2018_idioms,
- clippy::all
-)]
-
-#![doc(html_root_url = "https://docs.rs/lebe/0.5.0")]
-
-//! Dead simple endianness conversions.
-//! The following operations are implemented on
-//! `u8`, `i8`, `u16`, `i16`, `u32`, `i32`, `u64`, `i64`, `u128`, `i128`, `f32`, `f64`:
-//!
-//!
-//! ### Read Numbers
-//! ```rust
-//! use lebe::prelude::*;
-//! let mut reader: &[u8] = &[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
-//!
-//! let number : u64 = reader.read_from_little_endian()?;
-//! let number = u64::read_from_big_endian(&mut reader)?;
-//! # Ok::<(), std::io::Error>(())
-//! ```
-//!
-//! ### Read Slices
-//! ```rust
-//! use std::io::Read;
-//! use lebe::prelude::*;
-//! let mut reader: &[u8] = &[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
-//!
-//! let mut numbers: &mut [u64] = &mut [0, 0];
-//! reader.read_from_little_endian_into(numbers)?;
-//! # Ok::<(), std::io::Error>(())
-//! ```
-//!
-//! ### Write Numbers
-//! ```rust
-//! use std::io::Read;
-//! use lebe::prelude::*;
-//! let mut writer: Vec<u8> = Vec::new();
-//!
-//! let number: u64 = 1237691;
-//! writer.write_as_big_endian(&number)?;
-//! # Ok::<(), std::io::Error>(())
-//! ```
-//!
-//! ### Write Slices
-//! ```rust
-//! use std::io::Write;
-//! use lebe::prelude::*;
-//! let mut writer: Vec<u8> = Vec::new();
-//!
-//! let numbers: &[u64] = &[1_u64, 234545_u64];
-//! writer.write_as_little_endian(numbers)?;
-//! # Ok::<(), std::io::Error>(())
-//! ```
-//!
-
-
-/// Exports some of the most common types.
-pub mod prelude {
- pub use super::Endian;
- pub use super::io::{ WriteEndian, ReadEndian, ReadPrimitive };
-}
-
-/// Represents values that can swap their bytes to reverse their endianness.
-///
-/// Supports converting values in-place using [`swap_bytes`] or [`convert_current_to_little_endian`]:
-/// Supports converting while transferring ownership using
-/// [`from_little_endian_into_current`] or [`from_current_into_little_endian`].
-///
-///
-/// For the types `u8`, `i8`, `&[u8]` and `&[i8]`, this trait will never transform any data,
-/// as they are just implemented for completeness.
-pub trait Endian {
-
- /// Swaps all bytes in this value, inverting its endianness.
- fn swap_bytes(&mut self);
-
- /// On a little endian machine, this does nothing.
- /// On a big endian machine, the bytes of this value are reversed.
- #[inline] fn convert_current_to_little_endian(&mut self) {
- #[cfg(target_endian = "big")] {
- self.swap_bytes();
- }
- }
-
- /// On a big endian machine, this does nothing.
- /// On a little endian machine, the bytes of this value are reversed.
- #[inline] fn convert_current_to_big_endian(&mut self) {
- #[cfg(target_endian = "little")] {
- self.swap_bytes();
- }
- }
-
- /// On a little endian machine, this does nothing.
- /// On a big endian machine, the bytes of this value are reversed.
- #[inline] fn convert_little_endian_to_current(&mut self) {
- #[cfg(target_endian = "big")] {
- self.swap_bytes();
- }
- }
-
- /// On a big endian machine, this does nothing.
- /// On a little endian machine, the bytes of this value are reversed.
- #[inline] fn convert_big_endian_to_current(&mut self) {
- #[cfg(target_endian = "little")] {
- self.swap_bytes();
- }
- }
-
- /// On a little endian machine, this does nothing.
- /// On a big endian machine, the bytes of this value are reversed.
- #[inline] fn from_current_into_little_endian(mut self) -> Self where Self: Sized {
- self.convert_current_to_little_endian();
- self
- }
-
- /// On a big endian machine, this does nothing.
- /// On a little endian machine, the bytes of this value are reversed.
- #[inline] fn from_current_into_big_endian(mut self) -> Self where Self: Sized {
- self.convert_current_to_big_endian();
- self
- }
-
- /// On a little endian machine, this does nothing.
- /// On a big endian machine, the bytes of this value are reversed.
- #[inline] fn from_little_endian_into_current(mut self) -> Self where Self: Sized {
- self.convert_little_endian_to_current();
- self
- }
-
- /// On a big endian machine, this does nothing.
- /// On a little endian machine, the bytes of this value are reversed.
- #[inline] fn from_big_endian_into_current(mut self) -> Self where Self: Sized {
- self.convert_big_endian_to_current();
- self
- }
-}
-
-
-// call a macro for each argument
-macro_rules! call_single_arg_macro_for_each {
- ($macro: ident, $( $arguments: ident ),* ) => {
- $( $macro! { $arguments } )*
- };
-}
-
-// implement this interface for primitive signed and unsigned integers
-macro_rules! implement_simple_primitive_endian {
- ($type: ident) => {
- impl Endian for $type {
- fn swap_bytes(&mut self) {
- *self = $type::swap_bytes(*self);
- }
- }
- };
-}
-
-
-call_single_arg_macro_for_each! {
- implement_simple_primitive_endian,
- u16, u32, u64, u128, i16, i32, i64, i128
-}
-
-// no-op implementations
-impl Endian for u8 { fn swap_bytes(&mut self) {} }
-impl Endian for i8 { fn swap_bytes(&mut self) {} }
-impl Endian for [u8] { fn swap_bytes(&mut self) {} }
-impl Endian for [i8] { fn swap_bytes(&mut self) {} }
-
-// implement this interface for primitive floats, because they do not have a `swap_bytes()` in `std`
-macro_rules! implement_float_primitive_by_bits {
- ($type: ident) => {
- impl Endian for $type {
- fn swap_bytes(&mut self) {
- *self = Self::from_bits(self.to_bits().swap_bytes());
- }
- }
- };
-}
-
-
-implement_float_primitive_by_bits!(f32);
-implement_float_primitive_by_bits!(f64);
-
-macro_rules! implement_slice_by_element {
- ($type: ident) => {
- impl Endian for [$type] {
- fn swap_bytes(&mut self) {
- for number in self.iter_mut() { // TODO SIMD?
- number.swap_bytes();
- }
- }
- }
- };
-}
-
-call_single_arg_macro_for_each! {
- implement_slice_by_element,
- u16, u32, u64, u128,
- i16, i32, i64, i128,
- f64, f32
-}
-
-/// Easily write primitives and slices of primitives to
-/// binary `std::io::Write` streams and easily read from binary `std::io::Read` streams.
-///
-/// Also contains the unsafe `bytes` module for reinterpreting values as byte slices and vice versa.
-pub mod io {
- use super::Endian;
- use std::io::{Read, Write, Result};
-
- /// Reinterpret values as byte slices and byte slices as values unsafely.
- pub mod bytes {
- use std::io::{Read, Write, Result};
-
- /// View this slice of values as a slice of bytes.
- #[inline]
- pub unsafe fn slice_as_bytes<T>(value: &[T]) -> &[u8] {
- std::slice::from_raw_parts(
- value.as_ptr() as *const u8,
- value.len() * std::mem::size_of::<T>()
- )
- }
-
- /// View this slice of values as a mutable slice of bytes.
- #[inline]
- pub unsafe fn slice_as_bytes_mut<T>(value: &mut [T]) -> &mut [u8] {
- std::slice::from_raw_parts_mut(
- value.as_mut_ptr() as *mut u8,
- value.len() * std::mem::size_of::<T>()
- )
- }
-
- /// View this reference as a slice of bytes.
- #[inline]
- pub unsafe fn value_as_bytes<T: Sized>(value: &T) -> &[u8] {
- std::slice::from_raw_parts(
- value as *const T as *const u8,
- std::mem::size_of::<T>()
- )
- }
-
- /// View this reference as a mutable slice of bytes.
- #[inline]
- pub unsafe fn value_as_bytes_mut<T: Sized>(value: &mut T) ->&mut [u8] {
- std::slice::from_raw_parts_mut(
- value as *mut T as *mut u8,
- std::mem::size_of::<T>()
- )
- }
-
- /// View this slice as a mutable slice of bytes and write it.
- #[inline]
- pub unsafe fn write_slice<T>(write: &mut impl Write, value: &[T]) -> Result<()> {
- write.write_all(slice_as_bytes(value))
- }
-
- /// Read a slice of bytes into the specified slice.
- #[inline]
- pub unsafe fn read_slice<T>(read: &mut impl Read, value: &mut [T]) -> Result<()> {
- read.read_exact(slice_as_bytes_mut(value))
- }
-
- /// View this reference as a mutable slice of bytes and write it.
- #[inline]
- pub unsafe fn write_value<T: Sized>(write: &mut impl Write, value: &T) -> Result<()> {
- write.write_all(value_as_bytes(value))
- }
-
- /// Read a slice of bytes into the specified reference.
- #[inline]
- pub unsafe fn read_value<T: Sized>(read: &mut impl Read, value: &mut T) -> Result<()> {
- read.read_exact(value_as_bytes_mut(value))
- }
- }
-
- /// A `std::io::Write` output stream which supports writing any primitive values as bytes.
- /// Will encode the values to be either little endian or big endian, as desired.
- ///
- /// This extension trait is implemented for all `Write` types.
- /// Add `use lebe::io::WriteEndian;` to your code
- /// to automatically unlock this functionality for all types that implement `Write`.
- pub trait WriteEndian<T: ?Sized> {
-
- /// Write the byte value of the specified reference, converting it to little endianness
- fn write_as_little_endian(&mut self, value: &T) -> Result<()>;
-
- /// Write the byte value of the specified reference, converting it to big endianness
- fn write_as_big_endian(&mut self, value: &T) -> Result<()>;
-
- /// Write the byte value of the specified reference, not converting it
- fn write_as_native_endian(&mut self, value: &T) -> Result<()> {
- #[cfg(target_endian = "little")] { self.write_as_little_endian(value) }
- #[cfg(target_endian = "big")] { self.write_as_big_endian(value) }
- }
- }
-
- /// A `std::io::Read` input stream which supports reading any primitive values from bytes.
- /// Will decode the values from either little endian or big endian, as desired.
- ///
- /// This extension trait is implemented for all `Read` types.
- /// Add `use lebe::io::ReadEndian;` to your code
- /// to automatically unlock this functionality for all types that implement `Read`.
- pub trait ReadEndian<T: ?Sized> {
-
- /// Read into the supplied reference. Acts the same as `std::io::Read::read_exact`.
- fn read_from_little_endian_into(&mut self, value: &mut T) -> Result<()>;
-
- /// Read into the supplied reference. Acts the same as `std::io::Read::read_exact`.
- fn read_from_big_endian_into(&mut self, value: &mut T) -> Result<()>;
-
- /// Read into the supplied reference. Acts the same as `std::io::Read::read_exact`.
- fn read_from_native_endian_into(&mut self, value: &mut T) -> Result<()> {
- #[cfg(target_endian = "little")] { self.read_from_little_endian_into(value) }
- #[cfg(target_endian = "big")] { self.read_from_big_endian_into(value) }
- }
-
- /// Read the byte value of the inferred type
- #[inline]
- fn read_from_little_endian(&mut self) -> Result<T> where T: Sized + Default {
- let mut value = T::default();
- self.read_from_little_endian_into(&mut value)?;
- Ok(value)
- }
-
- /// Read the byte value of the inferred type
- #[inline]
- fn read_from_big_endian(&mut self) -> Result<T> where T: Sized + Default {
- let mut value = T::default();
- self.read_from_big_endian_into(&mut value)?;
- Ok(value)
- }
-
- /// Read the byte value of the inferred type
- #[inline]
- fn read_from_native_endian(&mut self) -> Result<T> where T: Sized + Default {
- #[cfg(target_endian = "little")] { self.read_from_little_endian() }
- #[cfg(target_endian = "big")] { self.read_from_big_endian() }
- }
- }
-
- // implement primitive for all types that are implemented by `Read`
- impl<R: Read + ReadEndian<P>, P: Default> ReadPrimitive<R> for P {}
-
-
- /// Offers a prettier versions of reading a primitive number.
- ///
- /// The default way of reading a value is:
- /// ```rust
- /// # use std::io::Read;
- /// # use lebe::prelude::*;
- /// # let mut reader : &[u8] = &[2, 1];
- ///
- /// let number: u16 = reader.read_from_little_endian()?;
- /// println!("{}", number);
- /// # Ok::<(), std::io::Error>(())
- ///
- /// ```
- ///
- /// This trait enables you to use expressions:
- /// ```rust
- /// # use std::io::Read;
- /// # use lebe::prelude::*;
- /// # let mut reader : &[u8] = &[2, 1];
- ///
- /// println!("{}", u16::read_from_little_endian(&mut reader)?);
- /// # Ok::<(), std::io::Error>(())
- /// ```
- /// .
- ///
- pub trait ReadPrimitive<R: Read + ReadEndian<Self>> : Sized + Default {
- /// Read this value from the supplied reader. Same as `ReadEndian::read_from_little_endian()`.
- fn read_from_little_endian(read: &mut R) -> Result<Self> {
- read.read_from_little_endian()
- }
-
- /// Read this value from the supplied reader. Same as `ReadEndian::read_from_big_endian()`.
- fn read_from_big_endian(read: &mut R) -> Result<Self> {
- read.read_from_big_endian()
- }
-
- /// Read this value from the supplied reader. Same as `ReadEndian::read_from_native_endian()`.
- fn read_from_native_endian(read: &mut R) -> Result<Self> {
- read.read_from_native_endian()
- }
- }
-
- macro_rules! implement_simple_primitive_write {
- ($type: ident) => {
- impl<W: Write> WriteEndian<$type> for W {
- fn write_as_little_endian(&mut self, value: &$type) -> Result<()> {
- unsafe { bytes::write_value(self, &value.from_current_into_little_endian()) }
- }
-
- fn write_as_big_endian(&mut self, value: &$type) -> Result<()> {
- unsafe { bytes::write_value(self, &value.from_current_into_big_endian()) }
- }
- }
-
- impl<R: Read> ReadEndian<$type> for R {
- #[inline]
- fn read_from_little_endian_into(&mut self, value: &mut $type) -> Result<()> {
- unsafe { bytes::read_value(self, value)?; }
- value.convert_little_endian_to_current();
- Ok(())
- }
-
- #[inline]
- fn read_from_big_endian_into(&mut self, value: &mut $type) -> Result<()> {
- unsafe { bytes::read_value(self, value)?; }
- value.convert_big_endian_to_current();
- Ok(())
- }
- }
- };
- }
-
- call_single_arg_macro_for_each! {
- implement_simple_primitive_write,
- u8, u16, u32, u64, u128,
- i8, i16, i32, i64, i128,
- f32, f64
- }
-
-
- macro_rules! implement_slice_io {
- ($type: ident) => {
- impl<W: Write> WriteEndian<[$type]> for W {
- fn write_as_little_endian(&mut self, value: &[$type]) -> Result<()> {
- #[cfg(target_endian = "big")] {
- for number in value { // TODO SIMD!
- self.write_as_little_endian(number)?;
- }
- }
-
- // else write whole slice
- #[cfg(target_endian = "little")]
- unsafe { bytes::write_slice(self, value)?; }
-
- Ok(())
- }
-
- fn write_as_big_endian(&mut self, value: &[$type]) -> Result<()> {
- #[cfg(target_endian = "little")] {
- for number in value { // TODO SIMD!
- self.write_as_big_endian(number)?;
- }
- }
-
- // else write whole slice
- #[cfg(target_endian = "big")]
- unsafe { bytes::write_slice(self, value)?; }
-
- Ok(())
- }
- }
-
- impl<R: Read> ReadEndian<[$type]> for R {
- fn read_from_little_endian_into(&mut self, value: &mut [$type]) -> Result<()> {
- unsafe { bytes::read_slice(self, value)? };
- value.convert_little_endian_to_current();
- Ok(())
- }
-
- fn read_from_big_endian_into(&mut self, value: &mut [$type]) -> Result<()> {
- unsafe { bytes::read_slice(self, value)? };
- value.convert_big_endian_to_current();
- Ok(())
- }
- }
- };
- }
-
- call_single_arg_macro_for_each! {
- implement_slice_io,
- u8, u16, u32, u64, u128,
- i8, i16, i32, i64, i128,
- f64, f32
- }
-
-
-
- // TODO: SIMD
- /*impl<R: Read> ReadEndian<[f32]> for R {
- fn read_from_little_endian_into(&mut self, value: &mut [f32]) -> Result<()> {
- unsafe { bytes::read_slice(self, value)? };
- value.convert_little_endian_to_current();
- Ok(())
- }
-
- fn read_from_big_endian_into(&mut self, value: &mut [f32]) -> Result<()> {
- unsafe { bytes::read_slice(self, value)? };
- value.convert_big_endian_to_current();
- Ok(())
- }
- }
-
- impl<W: Write> WriteEndian<[f32]> for W {
- fn write_as_big_endian(&mut self, value: &[f32]) -> Result<()> {
- if cfg!(target_endian = "little") {
-
- // FIX ME this SIMD optimization makes no difference ... why? like, ZERO difference, not even worse
-// #[cfg(feature = "simd")]
- #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
- unsafe {
- if is_x86_feature_detected!("avx2") {
- write_bytes_avx(self, value);
- return Ok(());
- }
- }
-
- // otherwise (no avx2 available)
-// for number in value {
-// self.write_as_little_endian(number);
-// }
-//
-// return Ok(());
- unimplemented!();
-
- #[target_feature(enable = "avx2")]
- #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
- unsafe fn write_bytes_avx(write: &mut impl Write, slice: &[f32]) -> Result<()> {
- #[cfg(target_arch = "x86")] use std::arch::x86 as mm;
- #[cfg(target_arch = "x86_64")] use std::arch::x86_64 as mm;
-
- let bytes: &[u8] = crate::io::bytes::slice_as_bytes(slice);
- let mut chunks = bytes.chunks_exact(32);
-
- let indices = mm::_mm256_set_epi8(
- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
-// 3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12,
-// 3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12
- );
-
- for chunk in &mut chunks {
- let data = mm::_mm256_loadu_si256(chunk.as_ptr() as _);
- let result = mm::_mm256_shuffle_epi8(data, indices);
- let mut out = [0_u8; 32];
- mm::_mm256_storeu_si256(out.as_mut_ptr() as _, result);
- write.write_all(&out)?;
- }
-
- let remainder = chunks.remainder();
-
- { // copy remainder into larger slice, with zeroes at the end
- let mut last_chunk = [0_u8; 32];
- last_chunk[0..remainder.len()].copy_from_slice(remainder);
- let data = mm::_mm256_loadu_si256(last_chunk.as_ptr() as _);
- let result = mm::_mm256_shuffle_epi8(data, indices);
- mm::_mm256_storeu_si256(last_chunk.as_mut_ptr() as _, result);
- write.write_all(&last_chunk[0..remainder.len()])?;
- }
-
- Ok(())
- }
- }
-
- else {
- unsafe { bytes::write_slice(self, value)?; }
- Ok(())
- }
- }
-
- fn write_as_little_endian(&mut self, value: &[f32]) -> Result<()> {
- for number in value {
- self.write_as_little_endian(number)?;
- }
-
- Ok(())
- }
- }*/
-}
-
diff --git a/vendor/lebe/tests/tests.rs b/vendor/lebe/tests/tests.rs
deleted file mode 100644
index fb88bdd..0000000
--- a/vendor/lebe/tests/tests.rs
+++ /dev/null
@@ -1,213 +0,0 @@
-extern crate lebe;
-
-use lebe::prelude::*;
-use std::mem;
-
-use byteorder::{WriteBytesExt, LittleEndian, BigEndian, ReadBytesExt};
-
-#[test]
-fn make_le_u32_slice() {
- // as seen on https://doc.rust-lang.org/std/primitive.u32.html#method.to_le
- let n = 0x1Au32;
-
- let mut n_le = [n];
- n_le.convert_current_to_little_endian();
-
- if cfg!(target_endian = "little") {
- assert_eq!(n_le, [n])
- }
- else {
- assert_eq!(n_le, [u32::swap_bytes(n)])
- }
-
-// assert_eq!(n_le, byteorder::LittleEndian::from_)
-}
-
-#[test]
-fn make_be_u32_slice() {
- // as seen on https://doc.rust-lang.org/std/primitive.u32.html#method.to_be
- let n = 0x1Au32;
-
- let mut n_be = [n];
- n_be.convert_current_to_big_endian();
-
- if cfg!(target_endian = "big") {
- assert_eq!(n_be, [n])
- }
- else {
- assert_eq!(n_be, [n.swap_bytes()])
- }
-}
-
-#[test]
-fn make_le_u16_slice() {
- // as seen on https://doc.rust-lang.org/std/primitive.u16.html#method.to_le
- let n = 0x1Au16;
-
- let mut n_le = [n];
- n_le.convert_current_to_little_endian();
-
- if cfg!(target_endian = "little") {
- assert_eq!(n_le, [n])
- }
- else {
- assert_eq!(n_le, [n.swap_bytes()])
- }
-}
-
-#[test]
-fn make_le_i64_slice() {
- // as seen on https://doc.rust-lang.org/std/primitive.u64.html#method.to_be
- let n1 = 0x14F3EEBCCD93895A_i64;
- let n2 = 0x114F3EF99B81CC5A_i64;
-
- let mut n_be = [n1, n2];
- n_be.convert_current_to_big_endian();
-
- if cfg!(target_endian = "big") {
- assert_eq!(n_be, [n1, n2])
- }
- else {
- assert_eq!(n_be, [n1.swap_bytes(), n2.swap_bytes()])
- }
-}
-
-#[test]
-fn make_be_f64() {
- let i = 0x14F3EEBCCD93895A_u64;
-
- let mut f: f64 = unsafe { mem::transmute(i) };
- f.convert_current_to_big_endian();
-
- assert_eq!(f, unsafe { mem::transmute(i.to_be()) })
-}
-
-#[test]
-fn into_be_f64() {
- let i = 0x14F3EEBCCD93895A_u64;
-
- let f: f64 = unsafe { mem::transmute(i) };
- let f = f.from_current_into_big_endian();
-
- assert_eq!(f, unsafe { mem::transmute(i.to_be()) })
-}
-
-#[test]
-fn into_be_i16() {
- let i = 0x195A_i16;
- let be = i.from_current_into_big_endian();
-
- if cfg!(target_endian = "big") {
- assert_eq!(be, i)
- }
- else {
- assert_eq!(be, i.swap_bytes())
- }
-}
-
-#[test]
-fn into_be_u32() {
- let i = 0x1220943_u32;
- let be = i.from_current_into_big_endian();
-
- if cfg!(target_endian = "big") {
- assert_eq!(be, i)
- }
- else {
- assert_eq!(be, i.swap_bytes())
- }
-}
-
-#[test]
-fn cmp_read_be_u16() {
- let read: &[u8] = &[0x33, 0xbb];
- let a = u16::read_from_big_endian(&mut read.clone()).unwrap();
- let b: u16 = read.clone().read_from_big_endian().unwrap();
- let c = read.clone().read_u16::<BigEndian>().unwrap();
-
- assert_eq!(a, b);
- assert_eq!(a, c);
-}
-
-#[test]
-fn cmp_read_le_u16() {
- let read: &[u8] = &[0x33, 0xbb];
- let a = u16::read_from_little_endian(&mut read.clone()).unwrap();
- let b: u16 = read.clone().read_from_little_endian().unwrap();
- let c = read.clone().read_u16::<LittleEndian>().unwrap();
-
- assert_eq!(a, b);
- assert_eq!(a, c);
-}
-
-#[test]
-fn cmp_read_le_f32() {
- let read: &[u8] = &[0x33, 0xBB, 0x44, 0xCC];
- let a = f32::read_from_little_endian(&mut read.clone()).unwrap();
- let b: f32 = read.clone().read_from_little_endian().unwrap();
- let c = read.clone().read_f32::<LittleEndian>().unwrap();
-
- assert_eq!(a, b);
- assert_eq!(a, c);
-}
-
-#[test]
-fn cmp_read_be_slice() {
- let mut write_expected = Vec::new();
- let mut write_actual = Vec::new();
-
- let data: Vec<f32> = (0..31*31).map(|i| i as f32).collect();
-
- for number in &data {
- write_expected.write_f32::<BigEndian>(*number).unwrap();
- }
-
- write_actual.write_as_big_endian(data.as_slice()).unwrap();
- assert_eq!(write_actual, write_expected);
-}
-
-#[test]
-fn cmp_write_le_slice() {
- let mut write_expected = Vec::new();
- let mut write_actual = Vec::new();
-
- let data: Vec<f32> = (0..31*31).map(|i| i as f32).collect();
-
- for number in &data {
- write_expected.write_f32::<LittleEndian>(*number).unwrap();
- }
-
- write_actual.write_as_little_endian(data.as_slice()).unwrap();
-
- assert_eq!(write_actual, write_expected);
-}
-
-#[test]
-fn cmp_write_le_u32() {
- let mut write_expected = Vec::new();
- let mut write_actual = Vec::new();
-
- let data = 0x23573688_u32;
- write_expected.write_u32::<LittleEndian>(data).unwrap();
- write_actual.write_as_little_endian(&data).unwrap();
-
- assert_eq!(write_actual, write_expected);
-}
-
-
-
-#[test]
-fn cmp_write_le_slice_u64() {
- let mut write_expected = Vec::new();
- let mut write_actual = Vec::new();
-
- let data: Vec<u64> = (1000..1000+310*31).map(|i| i as u64).collect();
-
- for number in &data {
- write_expected.write_u64::<LittleEndian>(*number).unwrap();
- }
-
- write_actual.write_as_little_endian(data.as_slice()).unwrap();
-
- assert_eq!(write_actual, write_expected);
-} \ No newline at end of file