Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use reverse_bits from the standard library #58

Merged
merged 1 commit into from Feb 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/crc16.rs
@@ -1,6 +1,5 @@
use super::{Algorithm, Crc, Digest};
use crate::table::crc16_table;
use crate::util::reflect_16;

impl Crc<u16> {
pub const fn new(algorithm: &'static Algorithm<u16>) -> Self {
Expand All @@ -16,7 +15,7 @@ impl Crc<u16> {

const fn init(&self) -> u16 {
if self.algorithm.refin {
reflect_16(self.algorithm.init)
self.algorithm.init.reverse_bits()
} else {
self.algorithm.init
}
Expand Down Expand Up @@ -44,7 +43,7 @@ impl Crc<u16> {

const fn finalize(&self, mut crc: u16) -> u16 {
if self.algorithm.refin ^ self.algorithm.refout {
crc = reflect_16(crc);
crc = crc.reverse_bits();
}
crc ^ self.algorithm.xorout
}
Expand Down
5 changes: 2 additions & 3 deletions src/crc32.rs
@@ -1,6 +1,5 @@
use super::{Algorithm, Crc, Digest};
use crate::table::crc32_table;
use crate::util::reflect_32;

impl Crc<u32> {
pub const fn new(algorithm: &'static Algorithm<u32>) -> Self {
Expand All @@ -16,7 +15,7 @@ impl Crc<u32> {

const fn init(&self) -> u32 {
if self.algorithm.refin {
reflect_32(self.algorithm.init)
self.algorithm.init.reverse_bits()
} else {
self.algorithm.init
}
Expand Down Expand Up @@ -44,7 +43,7 @@ impl Crc<u32> {

const fn finalize(&self, mut crc: u32) -> u32 {
if self.algorithm.refin ^ self.algorithm.refout {
crc = reflect_32(crc);
crc = crc.reverse_bits();
}
crc ^ self.algorithm.xorout
}
Expand Down
5 changes: 2 additions & 3 deletions src/crc64.rs
@@ -1,6 +1,5 @@
use super::{Algorithm, Crc, Digest};
use crate::table::crc64_table;
use crate::util::reflect_64;

impl Crc<u64> {
pub const fn new(algorithm: &'static Algorithm<u64>) -> Self {
Expand All @@ -16,7 +15,7 @@ impl Crc<u64> {

const fn init(&self) -> u64 {
if self.algorithm.refin {
reflect_64(self.algorithm.init)
self.algorithm.init.reverse_bits()
} else {
self.algorithm.init
}
Expand Down Expand Up @@ -44,7 +43,7 @@ impl Crc<u64> {

const fn finalize(&self, mut crc: u64) -> u64 {
if self.algorithm.refin ^ self.algorithm.refout {
crc = reflect_64(crc);
crc = crc.reverse_bits();
}
crc ^ self.algorithm.xorout
}
Expand Down
46 changes: 6 additions & 40 deletions src/util.rs
Expand Up @@ -2,7 +2,7 @@ pub(crate) const fn crc16(poly: u16, reflect: bool, mut byte: u8) -> u16 {
const fn poly_sum_crc16(poly: u16, value: u16) -> u16 {
(value << 1) ^ ((value >> 15) * poly)
}
byte = [byte, reflect_8(byte)][reflect as usize];
byte = [byte, byte.reverse_bits()][reflect as usize];
let mut value = (byte as u16) << 8;
value = poly_sum_crc16(poly, value);
value = poly_sum_crc16(poly, value);
Expand All @@ -12,14 +12,14 @@ pub(crate) const fn crc16(poly: u16, reflect: bool, mut byte: u8) -> u16 {
value = poly_sum_crc16(poly, value);
value = poly_sum_crc16(poly, value);
value = poly_sum_crc16(poly, value);
[value, reflect_16(value)][reflect as usize]
[value, value.reverse_bits()][reflect as usize]
}

pub(crate) const fn crc32(poly: u32, reflect: bool, mut byte: u8) -> u32 {
const fn poly_sum_crc32(poly: u32, value: u32) -> u32 {
(value << 1) ^ ((value >> 31) * poly)
}
byte = [byte, reflect_8(byte)][reflect as usize];
byte = [byte, byte.reverse_bits()][reflect as usize];
let mut value = (byte as u32) << 24;
value = poly_sum_crc32(poly, value);
value = poly_sum_crc32(poly, value);
Expand All @@ -29,14 +29,14 @@ pub(crate) const fn crc32(poly: u32, reflect: bool, mut byte: u8) -> u32 {
value = poly_sum_crc32(poly, value);
value = poly_sum_crc32(poly, value);
value = poly_sum_crc32(poly, value);
[value, reflect_32(value)][reflect as usize]
[value, value.reverse_bits()][reflect as usize]
}

pub(crate) const fn crc64(poly: u64, reflect: bool, mut byte: u8) -> u64 {
const fn poly_sum_crc64(poly: u64, value: u64) -> u64 {
(value << 1) ^ ((value >> 63) * poly)
}
byte = [byte, reflect_8(byte)][reflect as usize];
byte = [byte, byte.reverse_bits()][reflect as usize];
let mut value = (byte as u64) << 56;
value = poly_sum_crc64(poly, value);
value = poly_sum_crc64(poly, value);
Expand All @@ -46,39 +46,5 @@ pub(crate) const fn crc64(poly: u64, reflect: bool, mut byte: u8) -> u64 {
value = poly_sum_crc64(poly, value);
value = poly_sum_crc64(poly, value);
value = poly_sum_crc64(poly, value);
[value, reflect_64(value)][reflect as usize]
}

pub(crate) const fn reflect_8(mut b: u8) -> u8 {
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
b
}

pub(crate) const fn reflect_16(mut b: u16) -> u16 {
b = (b & 0xFF00) >> 8 | (b & 0x00FF) << 8;
b = (b & 0xF0F0) >> 4 | (b & 0x0F0F) << 4;
b = (b & 0xCCCC) >> 2 | (b & 0x3333) << 2;
b = (b & 0xAAAA) >> 1 | (b & 0x5555) << 1;
b
}

pub(crate) const fn reflect_32(mut b: u32) -> u32 {
b = (b & 0xFFFF0000) >> 16 | (b & 0x0000FFFF) << 16;
b = (b & 0xFF00FF00) >> 8 | (b & 0x00FF00FF) << 8;
b = (b & 0xF0F0F0F0) >> 4 | (b & 0x0F0F0F0F) << 4;
b = (b & 0xCCCCCCCC) >> 2 | (b & 0x33333333) << 2;
b = (b & 0xAAAAAAAA) >> 1 | (b & 0x55555555) << 1;
b
}

pub(crate) const fn reflect_64(mut b: u64) -> u64 {
b = (b & 0xFFFFFFFF00000000) >> 32 | (b & 0x00000000FFFFFFFF) << 32;
b = (b & 0xFFFF0000FFFF0000) >> 16 | (b & 0x0000FFFF0000FFFF) << 16;
b = (b & 0xFF00FF00FF00FF00) >> 8 | (b & 0x00FF00FF00FF00FF) << 8;
b = (b & 0xF0F0F0F0F0F0F0F0) >> 4 | (b & 0x0F0F0F0F0F0F0F0F) << 4;
b = (b & 0xCCCCCCCCCCCCCCCC) >> 2 | (b & 0x3333333333333333) << 2;
b = (b & 0xAAAAAAAAAAAAAAAA) >> 1 | (b & 0x5555555555555555) << 1;
b
[value, value.reverse_bits()][reflect as usize]
}