From 8bf328b4f0301782042021993fc48e4582743ff8 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Tue, 9 Jul 2019 15:59:24 +0200 Subject: [PATCH] stew updates * simplify int api (fixes #68) * implement endians api * implement some more bitops --- stint.nim | 4 +- stint/bitops2.nim | 16 ++ stint/endians2.nim | 105 ++++++++++++ stint/int_public.nim | 94 ----------- stint/intops.nim | 159 ++++++++++++++++++ stint/io.nim | 2 +- stint/literals_stint.nim | 2 +- stint/modular_arithmetic.nim | 2 +- .../private/{bitops2.nim => bitops2_priv.nim} | 18 ++ stint/private/datatypes.nim | 8 - stint/private/endians2_priv.nim | 21 +++ stint/private/int_bitwise_ops.nim | 2 +- stint/private/int_comparison.nim | 6 + stint/private/int_negabs.nim | 2 +- stint/private/uint_bitwise_ops.nim | 2 +- stint/private/uint_div.nim | 2 +- stint/uint_public.nim | 146 ---------------- tests/test_uint_endians2.nim | 26 +++ 18 files changed, 360 insertions(+), 257 deletions(-) create mode 100644 stint/bitops2.nim create mode 100644 stint/endians2.nim delete mode 100644 stint/int_public.nim create mode 100644 stint/intops.nim rename stint/private/{bitops2.nim => bitops2_priv.nim} (70%) create mode 100644 stint/private/endians2_priv.nim delete mode 100644 stint/uint_public.nim create mode 100644 tests/test_uint_endians2.nim diff --git a/stint.nim b/stint.nim index 900d2b1..f13f275 100644 --- a/stint.nim +++ b/stint.nim @@ -7,8 +7,8 @@ # # at your option. This file may not be copied, modified, or distributed except according to those terms. -import stint/[uint_public, int_public, io, modular_arithmetic, literals_stint] -export uint_public, int_public, io, modular_arithmetic, literals_stint +import stint/[bitops2, endians2, intops, io, modular_arithmetic, literals_stint] +export bitops2, endians2, intops, io, modular_arithmetic, literals_stint type Int128* = Stint[128] diff --git a/stint/bitops2.nim b/stint/bitops2.nim new file mode 100644 index 0000000..9bad7c8 --- /dev/null +++ b/stint/bitops2.nim @@ -0,0 +1,16 @@ +# Stint +# Copyright 2018 Status Research & Development GmbH +# Licensed under either of +# +# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +# * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) +# +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +import ./private/[bitops2_priv, datatypes] + +func countOnes*(x: StUint): int {.inline.} = countOnes(x.data) +func parity*(x: StUint): int {.inline.} = parity(x.data) +func firstOne*(x: StUint): int {.inline.} = firstOne(x.data) +func leadingZeros*(x: StUint): int {.inline.} = leadingZeros(x.data) +func trailingZeros*(x: StUint): int {.inline.} = trailingZeros(x.data) diff --git a/stint/endians2.nim b/stint/endians2.nim new file mode 100644 index 0000000..e13f87e --- /dev/null +++ b/stint/endians2.nim @@ -0,0 +1,105 @@ +# Stint +# Copyright 2018 Status Research & Development GmbH +# Licensed under either of +# +# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +# * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) +# +# at your option. This file may not be copied, modified, or distributed except according to those terms. + +import private/[bitops2_priv, endians2_priv, datatypes] + +import stew/endians2 +export endians2 + +func swapBytes*(x: StUint): StUint {.inline.} = StUint(data: swapBytes(x.data)) + +func toBytes*[bits: static int](x: StUint[bits], endian: Endianness = system.cpuEndian): + array[bits div 8, byte] {.inline.} = + toBytes(x.data, endian) + +func toBytesLE*[bits: static int](x: StUint[bits]): + array[bits div 8, byte] {.inline.} = + toBytes(x, littleEndian) + +func toBytesBE*[bits: static int](x: StUint[bits]): + array[bits div 8, byte] {.inline.} = + toBytes(x, bigEndian) + +func fromBytes*[bits: static int]( + T: typedesc[StUint[bits]], + x: array[bits div 8, byte], + endian: Endianness = system.cpuEndian): T {.inline, noinit.} = + # TODO compile-time version + copyMem(addr result, unsafeAddr x[0], bits div 8) + + if endian != system.cpuEndian: + result = swapBytes(result) + +func fromBytes*[bits: static int]( + T: typedesc[StUint[bits]], + x: openArray[byte], + endian: Endianness = system.cpuEndian): T {.inline.} = + # TODO fromBytesBE in io.nim handles this better, merge the two! + var tmp: array[bits div 8, byte] + if x.len < tmp.len: + let offset = if endian == bigEndian: tmp.len - x.len else: 0 + for i in 0..