0 | module Data.Bytes.Impls
3 | import public Data.Bits
4 | import Data.Bytes.Interfaces
5 | import Data.Bytes.Proofs
6 | import Data.Bytes.Prims
12 | implBytesForFiniteBits :
13 | {auto _ : FiniteBits num}
14 | -> {auto _ : Cast num Bits8}
15 | -> {auto _ : Cast Bits8 num}
16 | -> {auto prfMult8: IsJust (isMultN 8 (bitSize {a = num}))}
18 | implBytesForFiniteBits = finiteBytes byteSView.fst {prf = byteSView.snd} where
19 | byteSView: (x : Nat ** bitSize {a = num} = (mult x 8))
20 | byteSView = viewMultN 8 (bitSize {a = num}) (fromJust (isMultN 8 (bitSize {a = num})))
22 | finiteBytes : (byteS:Nat) -> {auto prf: bitSize {a = num} = (mult byteS 8)} -> Bytes num
23 | finiteBytes byteS = MkBytes byteS toBytes fromBytes where
24 | byteToIndex : Fin byteS -> Index {a = num}
26 | let f: Fin byteS -> Fin (bitSize {a = num}) = rewrite prf in byteToBits
29 | getByte : num -> Fin byteS -> Bits8
30 | getByte value byteIndex = cast (value `shiftR` (byteToIndex byteIndex))
32 | toBytes : Endian -> num -> Vect byteS Bits8
33 | toBytes LittleEndian value = (allFins byteS) |> map (\shiftAmount => getByte value shiftAmount)
34 | toBytes _ value = assert_total reverse (toBytes LittleEndian value)
36 | fromBytes: Endian -> Vect byteS Bits8 -> num
37 | fromBytes LittleEndian bytes =
39 | |> map (\value => cast value)
40 | |> zip (allFins byteS)
41 | |> foldl (\acc,(shiftAmount, value) =>
42 | acc .|. (value `shiftL` (byteToIndex shiftAmount)))
44 | fromBytes _ value = assert_total fromBytes LittleEndian (reverse value)
49 | toBytes endian x = toBytes endian (prim__flBitField x)
50 | fromBytes endian x = prim__bitFieldFl (fromBytes endian x)
60 | bytesForBits8: Bytes Bits8
61 | bytesForBits8 = implBytesForFiniteBits
65 | bytesForBits16: Bytes Bits16
66 | bytesForBits16 = implBytesForFiniteBits
70 | bytesForBits32: Bytes Bits32
71 | bytesForBits32 = implBytesForFiniteBits
75 | bytesForBits64: Bytes Bits64
76 | bytesForBits64 = implBytesForFiniteBits
80 | bytesForInt8: Bytes Int8
81 | bytesForInt8 = implBytesForFiniteBits
85 | bytesForInt16: Bytes Int16
86 | bytesForInt16 = implBytesForFiniteBits
90 | bytesForInt32: Bytes Int32
91 | bytesForInt32 = implBytesForFiniteBits
95 | bytesForInt64: Bytes Int64
96 | bytesForInt64 = implBytesForFiniteBits
100 | bytesForInt: Bytes Int
101 | bytesForInt = implBytesForFiniteBits