summary refs log tree commit diff stats
path: root/tests/misc/tsizeof3.nim
blob: f0ba8c4d0a8319904d9eb8553beff10b80f4cf37 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
discard """
output: '''
@[48, 57]
'''
"""
# bug #7238

type ByteArrayBE*[N: static[int]] = array[N, byte]
  ## A byte array that stores bytes in big-endian order

proc toByteArrayBE*[T: SomeInteger](num: T): ByteArrayBE[sizeof(T)]=
  ## Convert an integer (in native host endianness) to a big-endian byte array
  ## Notice the result type
  const N = T.sizeof
  for i in 0 ..< N:
    result[i] = byte((num shr ((N-1-i) * 8)) and high(int8))

let a = 12345.toByteArrayBE
echo a[^2 .. ^1] # to make it work on both 32-bit and 64-bit

#---------------------------------------------------------------------

type
  Payload = object
    something: int
    vals: UncheckedArray[int]

static:
  doAssert(compiles(offsetOf(Payload, vals)))


type
  GoodboySave* {.bycopy.} = object
    saveCount: uint8
    savePoint: uint16
    shards: uint32
    friendCount: uint8
    friendCards: set[0..255]
    locationsKnown: set[0..127]
    locationsUnlocked: set[0..127]
    pickupsObtained: set[0..127]
    pickupsUsed: set[0..127]
    pickupCount: uint8

block: # bug #20914
  block:
    proc csizeof[T](a: T): int {.importc:"sizeof", nodecl.}

    var s: GoodboySave
    doAssert sizeof(s) == 108
    doAssert csizeof(s) == static(sizeof(s))

  block:
    proc calignof[T](a: T): int {.importc:"alignof", header: "<stdalign.h>".}

    var s: set[0..256]
    doAssert alignof(s) == 1
    doAssert calignof(s) == static(alignof(s))