util_memory.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package qt
  2. /*
  3. #include <stdlib.h>
  4. #include <stdint.h>
  5. */
  6. import "C"
  7. import "unsafe"
  8. type Pkg struct { *pkgImpl }
  9. type pkgImpl struct {
  10. items [] func()
  11. }
  12. func CreatePkg() (Pkg, func()) {
  13. var pkg = Pkg { &pkgImpl { make([] func(), 0) } }
  14. return pkg, pkg.dispose
  15. }
  16. func (pkg Pkg) push(item func()) {
  17. pkg.items = append(pkg.items, item)
  18. }
  19. func (pkg Pkg) pop() (func(), bool) {
  20. if len(pkg.items) > 0 {
  21. var last = (len(pkg.items) - 1)
  22. var last_item = pkg.items[last]
  23. pkg.items[last] = nil
  24. pkg.items = pkg.items[:last]
  25. return last_item, true
  26. } else {
  27. return nil, false
  28. }
  29. }
  30. func (pkg Pkg) dispose() {
  31. if pkg.items == nil {
  32. return
  33. }
  34. if len(pkg.items) == 0 {
  35. // in case we forget `defer` keyword
  36. panic("something went wrong")
  37. }
  38. for item, ok := pkg.pop(); ok; item, ok = pkg.pop() {
  39. item()
  40. }
  41. pkg.items = nil
  42. }
  43. func str(s string, ctx Pkg) *C.char {
  44. var ptr = C.CString(s)
  45. var del = func() { C.free(unsafe.Pointer(ptr)) }
  46. ctx.push(del)
  47. return ptr
  48. }
  49. func addrlen(buf ([] byte)) (*C.uint8_t, C.size_t) {
  50. if len(buf) == 0 {
  51. return nil, C.size_t(0)
  52. }
  53. return (*C.uint8_t)(unsafe.Pointer(&(buf[0]))), C.size_t(uint(len(buf)))
  54. }
  55. func ptrlen(widgets ([] Widget)) (*unsafe.Pointer, C.size_t) {
  56. if len(widgets) == 0 {
  57. return nil, C.size_t(0)
  58. }
  59. var ptr = make([] unsafe.Pointer, len(widgets))
  60. for i := range widgets {
  61. ptr[i] = widgets[i].ptr
  62. }
  63. return &(ptr[0]), C.size_t(len(ptr))
  64. }