1
1
package org.hexworks.cobalt.core.internal
2
2
3
3
import org.hexworks.cobalt.core.api.UUID
4
+ import kotlin.random.Random
4
5
5
6
6
- internal class DefaultUUID (private val backend : korlibs.io.util.UUID ) : UUID {
7
- override fun toString () = backend.toString()
8
- }
7
+ @Suppress(" EXPERIMENTAL_API_USAGE" )
8
+ @OptIn(ExperimentalStdlibApi ::class , ExperimentalUnsignedTypes ::class )
9
+ class DefaultUUID (val data : UByteArray ) : UUID {
10
+ override fun equals (other : Any? ): Boolean = other is DefaultUUID && this .data.contentEquals(other.data)
11
+ override fun hashCode (): Int = this .data.contentHashCode()
12
+
13
+ companion object {
14
+ private const val HEX = " 0123456789ABCDEF"
15
+
16
+ private val regex =
17
+ Regex (" [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" , RegexOption .IGNORE_CASE )
18
+
19
+ val NIL : UUID get() = DefaultUUID (" 00000000-0000-0000-0000-000000000000" )
20
+
21
+ private fun fix (data : UByteArray , version : Int , variant : Int ): UByteArray {
22
+ data[6 ] = ((data[6 ].toInt() and 0b0000_1111 ) or (version shl 4 )).toUByte()
23
+ data[8 ] = ((data[8 ].toInt() and 0x00_111111 ) or (variant shl 6 )).toUByte()
24
+ return data
25
+ }
26
+
27
+ fun randomDefaultUUID (random : Random = Random ): UUID = DefaultUUID (fix(UByteArray (16 ).apply {
28
+ random.nextBytes(this .asByteArray())
29
+ }, version = 4 , variant = 1 ))
30
+
31
+ operator fun invoke (str : String ): UUID {
32
+ if (regex.matchEntire(str) == null ) throw IllegalArgumentException (" Invalid DefaultUUID" )
33
+ return DefaultUUID (str.replace(" -" , " " ).hexToUByteArray())
34
+ }
35
+ }
36
+
37
+ val version: Int get() = (data[6 ].toInt() ushr 4 ) and 0b1111
38
+ val variant: Int get() = (data[8 ].toInt() ushr 6 ) and 0b11
39
+
40
+ override fun toString (): String = buildString(36 ) {
41
+ for (n in 0 until 16 ) {
42
+ val c = data[n].toInt()
43
+ append(HEX [c shr 4 ])
44
+ append(HEX [c and 0xF ])
45
+ if (n == 3 || n == 5 || n == 7 || n == 9 ) append(' -' )
46
+ }
47
+ }
48
+ }
0 commit comments