80_c.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import c
  2. c_int = c.refl("int")
  3. assert c_int.size() == c.sizeof("int")
  4. array = c.malloc(c.sizeof("int") * 10)
  5. array.set_base_offset("int")
  6. assert array.get_base_offset() == c_int.size()
  7. for i in range(10):
  8. array.offset(i).write_int(i)
  9. x = c_int()
  10. x.addr().write_int(0)
  11. for i in range(10):
  12. i = array.offset(i).read_int()
  13. x.addr().write_int(
  14. x.addr().read_int() + i
  15. )
  16. assert x.addr().read_int() == (0+9)*10//2
  17. c.memset(array, 0, c.sizeof("int") * 10)
  18. for i in range(10):
  19. assert array.offset(i).read_char() == 0
  20. array2 = c.malloc(c.sizeof("int") * 10)
  21. array2.set_base_offset("int")
  22. c.memcpy(array2, array, c.sizeof("int") * 10)
  23. for i in range(10):
  24. assert array2.offset(i).read_char() == 0
  25. c.free(array)
  26. c.free(array2)
  27. class Vec2(c.struct):
  28. def __new__(cls, x: float, y: float):
  29. obj = c.struct.__new__(cls, 8)
  30. obj.write_float(x, 0)
  31. obj.write_float(y, 4)
  32. return obj
  33. @property
  34. def x(self) -> float:
  35. return self.read_float(0)
  36. @property
  37. def y(self) -> float:
  38. return self.read_float(4)
  39. def __repr__(self) -> str:
  40. return f"Vec2({self.x}, {self.y})"
  41. a = Vec2(1, 2)
  42. assert isinstance(a, c.struct)
  43. assert type(a) is Vec2
  44. assert repr(a) == "Vec2(1.0, 2.0)"