aboutsummaryrefslogtreecommitdiff
path: root/core/encoding/uuid
diff options
context:
space:
mode:
authorFeoramund <161657516+Feoramund@users.noreply.github.com>2024-06-22 17:06:32 -0400
committerFeoramund <161657516+Feoramund@users.noreply.github.com>2024-06-22 18:21:32 -0400
commit5a75cac5b9d9173d2d2f23baf189dacb21f8ae83 (patch)
tree6a15f701fe063294343849b7a8d94cbbda784393 /core/encoding/uuid
parente9b882be058f08f014ea0e598c18b5df05a86a8a (diff)
Add API for creating custom version 8 UUIDs
Diffstat (limited to 'core/encoding/uuid')
-rw-r--r--core/encoding/uuid/stamping.odin89
1 files changed, 89 insertions, 0 deletions
diff --git a/core/encoding/uuid/stamping.odin b/core/encoding/uuid/stamping.odin
new file mode 100644
index 000000000..0c07725c3
--- /dev/null
+++ b/core/encoding/uuid/stamping.odin
@@ -0,0 +1,89 @@
+package uuid
+
+import "base:runtime"
+
+/*
+Stamp a 128-bit integer as being a valid version 8 UUID.
+
+Per the specification, all version 8 UUIDs are either for experimental or
+vendor-specific purposes. This procedure allows for converting arbitrary data
+into custom UUIDs.
+
+Inputs:
+- integer: Any integer type.
+
+Returns:
+- result: A valid version 8 UUID.
+*/
+stamp_v8_int :: proc(#any_int integer: u128) -> (result: Identifier) {
+ result = transmute(Identifier)cast(u128be)integer
+
+ result[VERSION_BYTE_INDEX] &= 0x0F
+ result[VERSION_BYTE_INDEX] |= 0x80
+
+ result[VARIANT_BYTE_INDEX] &= 0x3F
+ result[VARIANT_BYTE_INDEX] |= 0x80
+
+ return
+}
+
+/*
+Stamp an array of 16 bytes as being a valid version 8 UUID.
+
+Per the specification, all version 8 UUIDs are either for experimental or
+vendor-specific purposes. This procedure allows for converting arbitrary data
+into custom UUIDs.
+
+Inputs:
+- array: An array of 16 bytes.
+
+Returns:
+- result: A valid version 8 UUID.
+*/
+stamp_v8_array :: proc(array: [16]u8) -> (result: Identifier) {
+ result = transmute(Identifier)array
+
+ result[VERSION_BYTE_INDEX] &= 0x0F
+ result[VERSION_BYTE_INDEX] |= 0x80
+
+ result[VARIANT_BYTE_INDEX] &= 0x3F
+ result[VARIANT_BYTE_INDEX] |= 0x80
+
+ return
+}
+
+/*
+Stamp a slice of bytes as being a valid version 8 UUID.
+
+If the slice is less than 16 bytes long, the data available will be used.
+If it is longer than 16 bytes, only the first 16 will be used.
+
+This procedure does not modify the underlying slice.
+
+Per the specification, all version 8 UUIDs are either for experimental or
+vendor-specific purposes. This procedure allows for converting arbitrary data
+into custom UUIDs.
+
+Inputs:
+- slice: A slice of bytes.
+
+Returns:
+- result: A valid version 8 UUID.
+*/
+stamp_v8_slice :: proc(slice: []u8) -> (result: Identifier) {
+ runtime.mem_copy_non_overlapping(&result, &slice[0], min(16, len(slice)))
+
+ result[VERSION_BYTE_INDEX] &= 0x0F
+ result[VERSION_BYTE_INDEX] |= 0x80
+
+ result[VARIANT_BYTE_INDEX] &= 0x3F
+ result[VARIANT_BYTE_INDEX] |= 0x80
+
+ return
+}
+
+stamp_v8 :: proc {
+ stamp_v8_int,
+ stamp_v8_array,
+ stamp_v8_slice,
+}