WrapperConverter.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package imgui
  2. // #include "imguiWrapperTypes.h"
  3. // #include <memory.h>
  4. // #include <stdlib.h>
  5. import "C"
  6. import "unsafe"
  7. func castBool(value bool) (cast C.IggBool) {
  8. if value {
  9. cast = 1
  10. }
  11. return
  12. }
  13. func wrapBool(goValue *bool) (wrapped *C.IggBool, finisher func()) {
  14. if goValue != nil {
  15. var cValue C.IggBool
  16. if *goValue {
  17. cValue = 1
  18. }
  19. wrapped = &cValue
  20. finisher = func() {
  21. *goValue = cValue != 0
  22. }
  23. } else {
  24. finisher = func() {}
  25. }
  26. return
  27. }
  28. func wrapInt32(goValue *int32) (wrapped *C.int, finisher func()) {
  29. if goValue != nil {
  30. cValue := C.int(*goValue)
  31. wrapped = &cValue
  32. finisher = func() {
  33. *goValue = int32(cValue)
  34. }
  35. } else {
  36. finisher = func() {}
  37. }
  38. return
  39. }
  40. func wrapFloat(goValue *float32) (wrapped *C.float, finisher func()) {
  41. if goValue != nil {
  42. cValue := C.float(*goValue)
  43. wrapped = &cValue
  44. finisher = func() {
  45. *goValue = float32(cValue)
  46. }
  47. } else {
  48. finisher = func() {}
  49. }
  50. return
  51. }
  52. func wrapString(value string) (wrapped *C.char, finisher func()) {
  53. wrapped = C.CString(value)
  54. finisher = func() { C.free(unsafe.Pointer(wrapped)) } // nolint: gas
  55. return
  56. }
  57. type stringBuffer struct {
  58. ptr unsafe.Pointer
  59. size int
  60. }
  61. func newStringBuffer(initialValue string) *stringBuffer {
  62. rawText := []byte(initialValue)
  63. bufSize := len(rawText) + 1
  64. newPtr := C.malloc(C.size_t(bufSize))
  65. zeroOffset := bufSize - 1
  66. copy(((*[1 << 30]byte)(newPtr))[:zeroOffset], rawText)
  67. ((*[1 << 30]byte)(newPtr))[zeroOffset] = 0
  68. return &stringBuffer{ptr: newPtr, size: bufSize}
  69. }
  70. func (buf *stringBuffer) free() {
  71. C.free(buf.ptr)
  72. buf.size = 0
  73. }
  74. func (buf *stringBuffer) resizeTo(requestedSize int) {
  75. bufSize := requestedSize
  76. if bufSize < 1 {
  77. bufSize = 1
  78. }
  79. newPtr := C.malloc(C.size_t(bufSize))
  80. copySize := bufSize
  81. if copySize > buf.size {
  82. copySize = buf.size
  83. }
  84. if copySize > 0 {
  85. C.memcpy(newPtr, buf.ptr, C.size_t(copySize))
  86. }
  87. ((*[1 << 30]byte)(newPtr))[bufSize-1] = 0
  88. C.free(buf.ptr)
  89. buf.ptr = newPtr
  90. buf.size = bufSize
  91. }
  92. func (buf stringBuffer) toGo() string {
  93. if (buf.ptr == nil) || (buf.size < 1) {
  94. return ""
  95. }
  96. ((*[1 << 30]byte)(buf.ptr))[buf.size-1] = 0
  97. return C.GoString((*C.char)(buf.ptr))
  98. }