Advertisement
Guest User

Untitled

a guest
Aug 5th, 2016
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 2.24 KB | None | 0 0
  1. import random, streams, strutils
  2.  
  3. type
  4.   GuidVariant* {.pure.} = enum
  5.     ncs, rfc4122, microsoft, future
  6.  
  7.   GuidVersion* {.pure.} = enum
  8.     unknown = -1
  9.     timeBased = 1
  10.     dceSecurity = 2
  11.     nameBasedMd5 = 3
  12.     randomNumberBased = 4
  13.     nameBasedSha1 = 5
  14.  
  15.   Guid* = array[0..15, uint8]
  16.  
  17. proc randomGuid*(): Guid =
  18.   randomize()
  19.   for i in 0..15: result[i] = uint8(random(255))
  20.  
  21.   # variant
  22.   result[8] = result[8] and 0xBF'u8
  23.   result[8] = result[8] or 0x80'u8
  24.  
  25.   # version
  26.   result[6] = result[6] and 0x4F'u8
  27.   result[6] = result[6] or 0x40'u8
  28.  
  29. proc variant*(self: Guid): GuidVariant =
  30.   if (self[8] and 0x80'u8) == 0'u8: return GuidVariant.ncs
  31.   elif (self[8] and 0xC0'u8) == 0x80'u8: return GuidVariant.rfc4122
  32.   elif (self[8] and 0xE0'u8) == 0xC0'u8: return GuidVariant.microsoft
  33.   else: return GuidVariant.future
  34.  
  35. proc version*(self: Guid): GuidVersion =
  36.   case self[6] and 0xF0'u8
  37.   of 0x10'u8: return GuidVersion.timeBased
  38.   of 0x20'u8: return GuidVersion.dceSecurity
  39.   of 0x30'u8: return GuidVersion.nameBasedMd5
  40.   of 0x40'u8: return GuidVersion.randomNumberBased
  41.   of 0x50'u8: return GuidVersion.nameBasedSha1
  42.   else: return GuidVersion.unknown
  43.  
  44. proc `==`*(lhs, rhs: Guid): bool {.inline.} =
  45.   for i in 0..15: result = lhs[i] == rhs[i]
  46.  
  47. proc `<`*(lhs, rhs: Guid): bool {.inline.} =
  48.   for i in 0..15: result = lhs[i] < rhs[i]
  49.  
  50. proc `!=`*(lhs, rhs: Guid): bool {.inline.} =
  51.   for i in 0..15: result = lhs[i] != rhs[i]
  52.  
  53. proc `>`*(lhs, rhs: Guid): bool {.inline.} =
  54.   for i in 0..15: result = lhs[i] > rhs[i]
  55.  
  56. proc `<=`*(lhs, rhs: Guid): bool {.inline.} =
  57.   for i in 0..15: result = lhs[i] <= rhs[i]
  58.  
  59. proc `>=`*(lhs, rhs: Guid): bool {.inline.} =
  60.   for i in 0..15: result = lhs[i] >= rhs[i]
  61.  
  62. proc hash*(self: Guid): int {.inline.} =
  63.   for i in self:
  64.     result = result xor (int(i) + int(0x9E3779B9) + (result shl 6) + (result shr 2))
  65.  
  66. proc `$`*(self: Guid): string {.inline.} =
  67.   result = ""
  68.   for i in 0..15:
  69.     result = result & int(self[i]).toHex(2)
  70.     if (i == 3) or (i == 5) or (i == 7) or (i == 9):
  71.       result = result & '-'
  72.  
  73. proc readGuid*(s: Stream): Guid {.inline.} =
  74.   s.readData(addr(result[0]), 16)
  75.  
  76. proc writeGuid*(s: Stream, g: Guid) {.inline.} =
  77.   s.writeData(addr(g[0]), 16)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement