nim-stint/stint/private/endians2_priv.nim

33 lines
939 B
Nim
Raw Normal View History

2019-10-09 01:51:53 +00:00
import ./bitops2_priv, ./datatypes, ./compiletime_helpers
import stew/endians2
export endians2
func swapBytes*(x: UintImpl): UintImpl {.inline.} =
let lo = swapBytes(x.hi)
let hi = swapBytes(x.lo)
UintImpl(hi: hi, lo: lo)
2019-10-09 01:51:53 +00:00
func copyMem(x: UintImpl, ret: var openArray[byte]) {.compileTime.} =
2019-10-08 13:40:27 +00:00
const size = bitsof(x) div 8
type DT = type x.leastSignificantWord
for i in 0 ..< size:
2019-10-09 01:51:53 +00:00
ret[i] = x.getByte(i)
2019-10-08 13:40:27 +00:00
func toBytes*(x: UintImpl, endian: Endianness = system.cpuEndian): auto {.inline.} =
# TODO can't use bitsof in return type (compiler bug?), hence return auto
var ret: array[bitsof(x) div 8, byte]
2019-10-08 13:40:27 +00:00
when nimvm:
if endian == system.cpuEndian:
2019-10-09 01:51:53 +00:00
copyMem(x, ret)
2019-10-08 13:40:27 +00:00
else:
let v = swapBytes(x)
2019-10-09 01:51:53 +00:00
copyMem(v, ret)
else:
2019-10-08 13:40:27 +00:00
if endian == system.cpuEndian:
copyMem(addr ret[0], unsafeAddr x, ret.len)
else:
let v = swapBytes(x)
copyMem(addr ret[0], unsafeAddr v, ret.len)
ret