t7097.nim 913 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. type
  2. Byte* = uint8
  3. Bytes* = seq[Byte]
  4. BytesRange* = object
  5. bytes: Bytes
  6. ibegin, iend: int
  7. proc initBytesRange*(s: var Bytes, ibegin = 0, iend = -1): BytesRange =
  8. let e = if iend < 0: s.len + iend + 1
  9. else: iend
  10. assert ibegin > 0 and e <= s.len
  11. when defined(gcRefc):
  12. shallow(s)
  13. result.bytes = s
  14. result.ibegin = ibegin
  15. result.iend = e
  16. template `[]=`*(r: var BytesRange, i: int, v: Byte) =
  17. r.bytes[r.ibegin + i] = v
  18. converter fromSeq*(s: Bytes): BytesRange =
  19. var seqCopy = s
  20. return initBytesRange(seqCopy)
  21. type
  22. Reader* = object
  23. data: BytesRange
  24. position: int
  25. proc readerFromHex*(input: string): Reader =
  26. let totalBytes = input.len div 2
  27. var backingStore = newSeq[Byte](totalBytes)
  28. result.data = initBytesRange(backingStore)
  29. for i in 0 ..< totalBytes:
  30. var nextByte = 0
  31. result.data[i] = Byte(nextByte) # <-------- instantiated from here