Skip to content

Commit

Permalink
Merge pull request #58 from akhilles/const-fn
Browse files Browse the repository at this point in the history
Use reverse_bits from the standard library
  • Loading branch information
akhilles committed Feb 14, 2021
2 parents 6253953 + 01f07ef commit 1273c9e
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 49 deletions.
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]
}

0 comments on commit 1273c9e

Please sign in to comment.