local ffi = require("ffi")

do --- byte array allocations
  local typ = ffi.typeof"uint8_t[?]"
  for i = 4, 24 do
    for d = -5, 5 do
      local sz = 2^i + d
      assert(ffi.sizeof(typ, sz) == sz)
      local mem = ffi.new(typ, sz)
      assert(ffi.sizeof(mem) == sz)
      mem[0] = 0x21
      mem[1] = 0x32
      mem[2] = 0x43
      mem[sz-3] = 0x54
      mem[sz-2] = 0x65
      mem[sz-1] = 0x76
      assert(mem[0] == 0x21)
      assert(mem[1] == 0x32)
      assert(mem[2] == 0x43)
      assert(mem[3] == 0)
      assert(mem[sz-4] == 0)
      assert(mem[sz-3] == 0x54)
      assert(mem[sz-2] == 0x65)
      assert(mem[sz-1] == 0x76)
    end
  end
end

do --- int array allocations
  local typ = ffi.typeof"int32_t[?]"
  for i = 2, 17 do
    for d = -2, 2 do
      local sz = 2^i + d
      assert(ffi.sizeof(typ, sz) == sz*4)
      local mem = ffi.new(typ, sz)
      assert(ffi.sizeof(mem) == sz*4)
      mem[0] = -3
      mem[sz-1] = -4
      assert(mem[0] == -3)
      if sz ~= 2 then
        assert(mem[1] == 0)
        assert(mem[sz-2] == 0)
      end
      assert(mem[sz-1] == -4)
    end
  end
end