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

Make more things const #535

Merged
merged 1 commit into from Oct 28, 2021
Merged
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
106 changes: 54 additions & 52 deletions src/lib.rs
Expand Up @@ -307,7 +307,7 @@ impl Uuid {
/// Currently only the RFC4122 variant is generated by this module.
///
/// * [Variant Reference](http://tools.ietf.org/html/rfc4122#section-4.1.1)
pub fn get_variant(&self) -> Option<Variant> {
pub const fn get_variant(&self) -> Option<Variant> {
match self.as_bytes()[8] {
x if x & 0x80 == 0x00 => Some(Variant::NCS),
x if x & 0xc0 == 0x80 => Some(Variant::RFC4122),
Expand Down Expand Up @@ -335,7 +335,7 @@ impl Uuid {
/// Returns the version of the UUID.
///
/// This represents the algorithm used to generate the contents
pub fn get_version(&self) -> Option<Version> {
pub const fn get_version(&self) -> Option<Version> {
let v = self.as_bytes()[6] >> 4;
match v {
0 if self.is_nil() => Some(Version::Nil),
Expand Down Expand Up @@ -392,19 +392,21 @@ impl Uuid {
/// }
/// ```
pub fn as_fields(&self) -> (u32, u16, u16, &[u8; 8]) {
let d1 = u32::from(self.as_bytes()[0]) << 24
| u32::from(self.as_bytes()[1]) << 16
| u32::from(self.as_bytes()[2]) << 8
| u32::from(self.as_bytes()[3]);
let bytes = self.as_bytes();

let d1 = (bytes[0] as u32) << 24
| (bytes[1] as u32) << 16
| (bytes[2] as u32) << 8
| (bytes[3] as u32);

let d2 =
u16::from(self.as_bytes()[4]) << 8 | u16::from(self.as_bytes()[5]);
(bytes[4] as u16) << 8 | (bytes[5] as u16);

let d3 =
u16::from(self.as_bytes()[6]) << 8 | u16::from(self.as_bytes()[7]);
(bytes[6] as u16) << 8 | (bytes[7] as u16);

let d4: &[u8; 8] =
convert::TryInto::try_into(&self.as_bytes()[8..16]).unwrap();
convert::TryInto::try_into(&bytes[8..16]).unwrap();
(d1, d2, d3, d4)
}

Expand Down Expand Up @@ -435,16 +437,16 @@ impl Uuid {
/// }
/// ```
pub fn to_fields_le(&self) -> (u32, u16, u16, &[u8; 8]) {
let d1 = u32::from(self.as_bytes()[0])
| u32::from(self.as_bytes()[1]) << 8
| u32::from(self.as_bytes()[2]) << 16
| u32::from(self.as_bytes()[3]) << 24;
let d1 = (self.as_bytes()[0] as u32)
| (self.as_bytes()[1] as u32) << 8
| (self.as_bytes()[2] as u32) << 16
| (self.as_bytes()[3] as u32) << 24;

let d2 =
u16::from(self.as_bytes()[4]) | u16::from(self.as_bytes()[5]) << 8;
(self.as_bytes()[4] as u16) | (self.as_bytes()[5] as u16) << 8;

let d3 =
u16::from(self.as_bytes()[6]) | u16::from(self.as_bytes()[7]) << 8;
(self.as_bytes()[6] as u16) | (self.as_bytes()[7] as u16) << 8;

let d4: &[u8; 8] =
convert::TryInto::try_into(&self.as_bytes()[8..16]).unwrap();
Expand All @@ -470,23 +472,23 @@ impl Uuid {
/// Ok(())
/// }
/// ```
pub fn as_u128(&self) -> u128 {
u128::from(self.as_bytes()[0]) << 120
| u128::from(self.as_bytes()[1]) << 112
| u128::from(self.as_bytes()[2]) << 104
| u128::from(self.as_bytes()[3]) << 96
| u128::from(self.as_bytes()[4]) << 88
| u128::from(self.as_bytes()[5]) << 80
| u128::from(self.as_bytes()[6]) << 72
| u128::from(self.as_bytes()[7]) << 64
| u128::from(self.as_bytes()[8]) << 56
| u128::from(self.as_bytes()[9]) << 48
| u128::from(self.as_bytes()[10]) << 40
| u128::from(self.as_bytes()[11]) << 32
| u128::from(self.as_bytes()[12]) << 24
| u128::from(self.as_bytes()[13]) << 16
| u128::from(self.as_bytes()[14]) << 8
| u128::from(self.as_bytes()[15])
pub const fn as_u128(&self) -> u128 {
(self.as_bytes()[0] as u128) << 120
| (self.as_bytes()[1] as u128) << 112
| (self.as_bytes()[2] as u128) << 104
| (self.as_bytes()[3] as u128) << 96
| (self.as_bytes()[4] as u128) << 88
| (self.as_bytes()[5] as u128) << 80
| (self.as_bytes()[6] as u128) << 72
| (self.as_bytes()[7] as u128) << 64
| (self.as_bytes()[8] as u128) << 56
| (self.as_bytes()[9] as u128) << 48
| (self.as_bytes()[10] as u128) << 40
| (self.as_bytes()[11] as u128) << 32
| (self.as_bytes()[12] as u128) << 24
| (self.as_bytes()[13] as u128) << 16
| (self.as_bytes()[14] as u128) << 8
| (self.as_bytes()[15] as u128)
}

/// Returns a 128bit little-endian value containing the UUID data.
Expand Down Expand Up @@ -515,23 +517,23 @@ impl Uuid {
/// Ok(())
/// }
/// ```
pub fn to_u128_le(&self) -> u128 {
u128::from(self.as_bytes()[0])
| u128::from(self.as_bytes()[1]) << 8
| u128::from(self.as_bytes()[2]) << 16
| u128::from(self.as_bytes()[3]) << 24
| u128::from(self.as_bytes()[4]) << 32
| u128::from(self.as_bytes()[5]) << 40
| u128::from(self.as_bytes()[6]) << 48
| u128::from(self.as_bytes()[7]) << 56
| u128::from(self.as_bytes()[8]) << 64
| u128::from(self.as_bytes()[9]) << 72
| u128::from(self.as_bytes()[10]) << 80
| u128::from(self.as_bytes()[11]) << 88
| u128::from(self.as_bytes()[12]) << 96
| u128::from(self.as_bytes()[13]) << 104
| u128::from(self.as_bytes()[14]) << 112
| u128::from(self.as_bytes()[15]) << 120
pub const fn to_u128_le(&self) -> u128 {
(self.as_bytes()[0] as u128)
| (self.as_bytes()[1] as u128) << 8
| (self.as_bytes()[2] as u128) << 16
| (self.as_bytes()[3] as u128) << 24
| (self.as_bytes()[4] as u128) << 32
| (self.as_bytes()[5] as u128) << 40
| (self.as_bytes()[6] as u128) << 48
| (self.as_bytes()[7] as u128) << 56
| (self.as_bytes()[8] as u128) << 64
| (self.as_bytes()[9] as u128) << 72
| (self.as_bytes()[10] as u128) << 80
| (self.as_bytes()[11] as u128) << 88
| (self.as_bytes()[12] as u128) << 96
| (self.as_bytes()[13] as u128) << 104
| (self.as_bytes()[14] as u128) << 112
| (self.as_bytes()[15] as u128) << 120
}

/// Returns two 64bit values containing the UUID data.
Expand All @@ -555,7 +557,7 @@ impl Uuid {
/// Ok(())
/// }
/// ```
pub fn as_u64_pair(&self) -> (u64, u64) {
pub const fn as_u64_pair(&self) -> (u64, u64) {
let value = self.as_u128();
((value >> 64) as u64, value as u64)
}
Expand All @@ -566,8 +568,8 @@ impl Uuid {
}

/// Tests if the UUID is nil.
pub fn is_nil(&self) -> bool {
self.as_bytes().iter().all(|&b| b == 0)
pub const fn is_nil(&self) -> bool {
self.as_u128() == 0
}

/// A buffer that can be used for `encode_...` calls, that is
Expand Down