mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-31 18:32:12 +00:00
90 lines
2.0 KiB
Odin
90 lines
2.0 KiB
Odin
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 = 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,
|
|
}
|