aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorFeoramund <161657516+Feoramund@users.noreply.github.com>2024-06-21 09:56:41 -0400
committerFeoramund <161657516+Feoramund@users.noreply.github.com>2024-06-22 18:21:31 -0400
commit6da99b888a4974fbdd2fcb7d04f12342fc1c8bb2 (patch)
treeb8fd16b998bd7c07edbfd7d094b647b4c28650cf /core
parent31873ed46625823bae8d7f9b1883597ea1e1c351 (diff)
Make UUID `Identfier` only a distinct byte array
Diffstat (limited to 'core')
-rw-r--r--core/encoding/uuid/definitions.odin29
-rw-r--r--core/encoding/uuid/generation.odin35
-rw-r--r--core/encoding/uuid/reading.odin12
-rw-r--r--core/encoding/uuid/writing.odin10
4 files changed, 38 insertions, 48 deletions
diff --git a/core/encoding/uuid/definitions.odin b/core/encoding/uuid/definitions.odin
index a1862a3fd..a5cbf9c38 100644
--- a/core/encoding/uuid/definitions.odin
+++ b/core/encoding/uuid/definitions.odin
@@ -1,10 +1,7 @@
package uuid
// A RFC 4122 Universally Unique Identifier
-Identifier :: struct #raw_union {
- integer: u128be,
- bytes: [16]u8,
-}
+Identifier :: distinct [16]u8
EXPECTED_LENGTH :: 8 + 4 + 4 + 4 + 12 + 4
@@ -28,32 +25,24 @@ Variant_Type :: enum {
// Name string is a fully-qualified domain name.
Namespace_DNS := Identifier {
- bytes = {
- 0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1,
- 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
- },
+ 0x6b, 0xa7, 0xb8, 0x10, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
}
// Name string is a URL.
Namespace_URL := Identifier {
- bytes = {
- 0x6b, 0xa7, 0xb8, 0x11, 0x9d, 0xad, 0x11, 0xd1,
- 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
- },
+ 0x6b, 0xa7, 0xb8, 0x11, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
}
// Name string is an ISO OID.
Namespace_OID := Identifier {
- bytes = {
- 0x6b, 0xa7, 0xb8, 0x12, 0x9d, 0xad, 0x11, 0xd1,
- 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
- },
+ 0x6b, 0xa7, 0xb8, 0x12, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
}
// Name string is an X.500 DN (in DER or a text output format).
Namespace_X500 := Identifier {
- bytes = {
- 0x6b, 0xa7, 0xb8, 0x14, 0x9d, 0xad, 0x11, 0xd1,
- 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
- },
+ 0x6b, 0xa7, 0xb8, 0x14, 0x9d, 0xad, 0x11, 0xd1,
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
}
diff --git a/core/encoding/uuid/generation.odin b/core/encoding/uuid/generation.odin
index fe05d3ebd..9b790714c 100644
--- a/core/encoding/uuid/generation.odin
+++ b/core/encoding/uuid/generation.odin
@@ -29,15 +29,15 @@ generate_v3_bytes :: proc(
ctx: md5.Context
md5.init(&ctx)
- md5.update(&ctx, namespace.bytes[:])
+ md5.update(&ctx, namespace[:])
md5.update(&ctx, name)
- md5.final(&ctx, result.bytes[:])
+ md5.final(&ctx, result[:])
- result.bytes[VERSION_BYTE_INDEX] &= 0x0F
- result.bytes[VERSION_BYTE_INDEX] |= 0x30
+ result[VERSION_BYTE_INDEX] &= 0x0F
+ result[VERSION_BYTE_INDEX] |= 0x30
- result.bytes[VARIANT_BYTE_INDEX] &= 0x3F
- result.bytes[VARIANT_BYTE_INDEX] |= 0x80
+ result[VARIANT_BYTE_INDEX] &= 0x3F
+ result[VARIANT_BYTE_INDEX] |= 0x80
return
}
@@ -79,13 +79,14 @@ Returns:
- result: The generated UUID.
*/
generate_v4 :: proc() -> (result: Identifier) {
- result.integer = transmute(u128be)rand.uint128()
+ bytes_generated := rand.read(result[:])
+ assert(bytes_generated == 16, "RNG failed to generate 16 bytes for UUID v4.")
- result.bytes[VERSION_BYTE_INDEX] &= 0x0F
- result.bytes[VERSION_BYTE_INDEX] |= 0x40
+ result[VERSION_BYTE_INDEX] &= 0x0F
+ result[VERSION_BYTE_INDEX] |= 0x40
- result.bytes[VARIANT_BYTE_INDEX] &= 0x3F
- result.bytes[VARIANT_BYTE_INDEX] |= 0x80
+ result[VARIANT_BYTE_INDEX] &= 0x3F
+ result[VARIANT_BYTE_INDEX] |= 0x80
return
}
@@ -115,17 +116,17 @@ generate_v5_bytes :: proc(
ctx: sha1.Context
sha1.init(&ctx)
- sha1.update(&ctx, namespace.bytes[:])
+ sha1.update(&ctx, namespace[:])
sha1.update(&ctx, name)
sha1.final(&ctx, digest[:])
- mem.copy_non_overlapping(&result.bytes, &digest, 16)
+ mem.copy_non_overlapping(&result, &digest, 16)
- result.bytes[VERSION_BYTE_INDEX] &= 0x0F
- result.bytes[VERSION_BYTE_INDEX] |= 0x50
+ result[VERSION_BYTE_INDEX] &= 0x0F
+ result[VERSION_BYTE_INDEX] |= 0x50
- result.bytes[VARIANT_BYTE_INDEX] &= 0x3F
- result.bytes[VARIANT_BYTE_INDEX] |= 0x80
+ result[VARIANT_BYTE_INDEX] &= 0x3F
+ result[VARIANT_BYTE_INDEX] |= 0x80
return
}
diff --git a/core/encoding/uuid/reading.odin b/core/encoding/uuid/reading.odin
index 7f3d30ab2..0c0274e53 100644
--- a/core/encoding/uuid/reading.odin
+++ b/core/encoding/uuid/reading.odin
@@ -49,7 +49,7 @@ read :: proc "contextless" (str: string) -> (id: Identifier, error: Read_Error)
return {}, .Invalid_Hexadecimal
}
- id.bytes[octet_index] = low | high << 4
+ id[octet_index] = low | high << 4
octet_index += 1
}
@@ -69,7 +69,7 @@ Returns:
- number: The version number.
*/
version :: proc "contextless" (id: Identifier) -> (number: int) #no_bounds_check {
- return cast(int)(id.bytes[VERSION_BYTE_INDEX] & 0xF0 >> 4)
+ return cast(int)(id[VERSION_BYTE_INDEX] & 0xF0 >> 4)
}
/*
@@ -83,13 +83,13 @@ Returns:
*/
variant :: proc "contextless" (id: Identifier) -> (variant: Variant_Type) #no_bounds_check {
switch {
- case id.bytes[VARIANT_BYTE_INDEX] & 0x80 == 0:
+ case id[VARIANT_BYTE_INDEX] & 0x80 == 0:
return .Reserved_Apollo_NCS
- case id.bytes[VARIANT_BYTE_INDEX] & 0xC0 == 0x80:
+ case id[VARIANT_BYTE_INDEX] & 0xC0 == 0x80:
return .RFC_4122
- case id.bytes[VARIANT_BYTE_INDEX] & 0xE0 == 0xC0:
+ case id[VARIANT_BYTE_INDEX] & 0xE0 == 0xC0:
return .Reserved_Microsoft_COM
- case id.bytes[VARIANT_BYTE_INDEX] & 0xF0 == 0xE0:
+ case id[VARIANT_BYTE_INDEX] & 0xF0 == 0xE0:
return .Reserved_Future
case:
return .Unknown
diff --git a/core/encoding/uuid/writing.odin b/core/encoding/uuid/writing.odin
index c13d700a8..45096e84f 100644
--- a/core/encoding/uuid/writing.odin
+++ b/core/encoding/uuid/writing.odin
@@ -21,15 +21,15 @@ write :: proc(w: io.Writer, id: Identifier) #no_bounds_check {
io.write_byte(w, strconv.digits[low_nibble])
}
- for index in 0 ..< 4 { write_octet(w, id.bytes[index]) }
+ for index in 0 ..< 4 { write_octet(w, id[index]) }
io.write_byte(w, '-')
- for index in 4 ..< 6 { write_octet(w, id.bytes[index]) }
+ for index in 4 ..< 6 { write_octet(w, id[index]) }
io.write_byte(w, '-')
- for index in 6 ..< 8 { write_octet(w, id.bytes[index]) }
+ for index in 6 ..< 8 { write_octet(w, id[index]) }
io.write_byte(w, '-')
- for index in 8 ..< 10 { write_octet(w, id.bytes[index]) }
+ for index in 8 ..< 10 { write_octet(w, id[index]) }
io.write_byte(w, '-')
- for index in 10 ..< 16 { write_octet(w, id.bytes[index]) }
+ for index in 10 ..< 16 { write_octet(w, id[index]) }
}
/*