Skip to content

Commit da3452e

Browse files
committed
refactor(ffmpeg): extract generic factory for ToXXXArray functions
- Add newArray[T any] factory function to encapsulate nil-check and Array construction pattern - Refactor 12 ToXXXArray functions to use the generic factory - Reduce code duplication from ~200 lines to ~70 lines
1 parent aad6124 commit da3452e

1 file changed

Lines changed: 59 additions & 189 deletions

File tree

ffmpeg.go

Lines changed: 59 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -191,230 +191,100 @@ func (a *Array[T]) RawPtr() unsafe.Pointer {
191191
return a.ptr
192192
}
193193

194-
func ToIntArray(ptr unsafe.Pointer) *Array[int] {
194+
// newArray creates an Array wrapper for a C array pointer.
195+
// This is a factory function that encapsulates the common nil-check and Array construction pattern.
196+
func newArray[T any](ptr unsafe.Pointer, elemSize uintptr, load func(unsafe.Pointer) T, store func(unsafe.Pointer, T)) *Array[T] {
195197
if ptr == nil {
196198
return nil
197199
}
198-
199-
return &Array[int]{
200-
elemSize: intSize,
201-
loadPtr: func(pointer unsafe.Pointer) int {
202-
ptr := (*C.int)(pointer)
203-
return int(*ptr)
204-
},
205-
ptr: ptr,
206-
storePtr: func(pointer unsafe.Pointer, value int) {
207-
ptr := (*C.int)(pointer)
208-
*ptr = C.int(value)
209-
},
200+
return &Array[T]{
201+
ptr: ptr,
202+
elemSize: elemSize,
203+
loadPtr: load,
204+
storePtr: store,
210205
}
211206
}
212207

213-
func ToUintArray(ptr unsafe.Pointer) *Array[uint] {
214-
if ptr == nil {
215-
return nil
216-
}
208+
func ToIntArray(ptr unsafe.Pointer) *Array[int] {
209+
return newArray(ptr, intSize,
210+
func(p unsafe.Pointer) int { return int(*(*C.int)(p)) },
211+
func(p unsafe.Pointer, v int) { *(*C.int)(p) = C.int(v) },
212+
)
213+
}
217214

218-
return &Array[uint]{
219-
elemSize: intSize, // uint is same size as int
220-
loadPtr: func(pointer unsafe.Pointer) uint {
221-
ptr := (*C.uint)(pointer)
222-
return uint(*ptr)
223-
},
224-
ptr: ptr,
225-
storePtr: func(pointer unsafe.Pointer, value uint) {
226-
ptr := (*C.uint)(pointer)
227-
*ptr = C.uint(value)
228-
},
229-
}
215+
func ToUintArray(ptr unsafe.Pointer) *Array[uint] {
216+
return newArray(ptr, intSize,
217+
func(p unsafe.Pointer) uint { return uint(*(*C.uint)(p)) },
218+
func(p unsafe.Pointer, v uint) { *(*C.uint)(p) = C.uint(v) },
219+
)
230220
}
231221

232222
func ToUint8Array(ptr unsafe.Pointer) *Array[uint8] {
233-
if ptr == nil {
234-
return nil
235-
}
236-
237-
return &Array[uint8]{
238-
elemSize: int8Size,
239-
loadPtr: func(pointer unsafe.Pointer) uint8 {
240-
ptr := (*C.uint8_t)(pointer)
241-
return uint8(*ptr)
242-
},
243-
ptr: ptr,
244-
storePtr: func(pointer unsafe.Pointer, value uint8) {
245-
ptr := (*C.uint8_t)(pointer)
246-
*ptr = C.uint8_t(value)
247-
},
248-
}
223+
return newArray(ptr, int8Size,
224+
func(p unsafe.Pointer) uint8 { return uint8(*(*C.uint8_t)(p)) },
225+
func(p unsafe.Pointer, v uint8) { *(*C.uint8_t)(p) = C.uint8_t(v) },
226+
)
249227
}
250228

251229
func ToInt8Array(ptr unsafe.Pointer) *Array[int8] {
252-
if ptr == nil {
253-
return nil
254-
}
255-
256-
return &Array[int8]{
257-
elemSize: int8Size,
258-
loadPtr: func(pointer unsafe.Pointer) int8 {
259-
ptr := (*C.int8_t)(pointer)
260-
return int8(*ptr)
261-
},
262-
ptr: ptr,
263-
storePtr: func(pointer unsafe.Pointer, value int8) {
264-
ptr := (*C.int8_t)(pointer)
265-
*ptr = C.int8_t(value)
266-
},
267-
}
230+
return newArray(ptr, int8Size,
231+
func(p unsafe.Pointer) int8 { return int8(*(*C.int8_t)(p)) },
232+
func(p unsafe.Pointer, v int8) { *(*C.int8_t)(p) = C.int8_t(v) },
233+
)
268234
}
269235

270236
func ToUint16Array(ptr unsafe.Pointer) *Array[uint16] {
271-
if ptr == nil {
272-
return nil
273-
}
274-
275-
return &Array[uint16]{
276-
elemSize: int16Size,
277-
loadPtr: func(pointer unsafe.Pointer) uint16 {
278-
ptr := (*C.uint16_t)(pointer)
279-
return uint16(*ptr)
280-
},
281-
ptr: ptr,
282-
storePtr: func(pointer unsafe.Pointer, value uint16) {
283-
ptr := (*C.uint16_t)(pointer)
284-
*ptr = C.uint16_t(value)
285-
},
286-
}
237+
return newArray(ptr, int16Size,
238+
func(p unsafe.Pointer) uint16 { return uint16(*(*C.uint16_t)(p)) },
239+
func(p unsafe.Pointer, v uint16) { *(*C.uint16_t)(p) = C.uint16_t(v) },
240+
)
287241
}
288242

289243
func ToInt16Array(ptr unsafe.Pointer) *Array[int16] {
290-
if ptr == nil {
291-
return nil
292-
}
293-
294-
return &Array[int16]{
295-
elemSize: int16Size,
296-
loadPtr: func(pointer unsafe.Pointer) int16 {
297-
ptr := (*C.int16_t)(pointer)
298-
return int16(*ptr)
299-
},
300-
ptr: ptr,
301-
storePtr: func(pointer unsafe.Pointer, value int16) {
302-
ptr := (*C.int16_t)(pointer)
303-
*ptr = C.int16_t(value)
304-
},
305-
}
244+
return newArray(ptr, int16Size,
245+
func(p unsafe.Pointer) int16 { return int16(*(*C.int16_t)(p)) },
246+
func(p unsafe.Pointer, v int16) { *(*C.int16_t)(p) = C.int16_t(v) },
247+
)
306248
}
307249

308250
func ToUint32Array(ptr unsafe.Pointer) *Array[uint32] {
309-
if ptr == nil {
310-
return nil
311-
}
312-
313-
return &Array[uint32]{
314-
elemSize: intSize, // uint32_t is typically same size as int
315-
loadPtr: func(pointer unsafe.Pointer) uint32 {
316-
ptr := (*C.uint32_t)(pointer)
317-
return uint32(*ptr)
318-
},
319-
ptr: ptr,
320-
storePtr: func(pointer unsafe.Pointer, value uint32) {
321-
ptr := (*C.uint32_t)(pointer)
322-
*ptr = C.uint32_t(value)
323-
},
324-
}
251+
return newArray(ptr, intSize,
252+
func(p unsafe.Pointer) uint32 { return uint32(*(*C.uint32_t)(p)) },
253+
func(p unsafe.Pointer, v uint32) { *(*C.uint32_t)(p) = C.uint32_t(v) },
254+
)
325255
}
326256

327257
func ToInt32Array(ptr unsafe.Pointer) *Array[int32] {
328-
if ptr == nil {
329-
return nil
330-
}
331-
332-
return &Array[int32]{
333-
elemSize: intSize,
334-
loadPtr: func(pointer unsafe.Pointer) int32 {
335-
ptr := (*C.int32_t)(pointer)
336-
return int32(*ptr)
337-
},
338-
ptr: ptr,
339-
storePtr: func(pointer unsafe.Pointer, value int32) {
340-
ptr := (*C.int32_t)(pointer)
341-
*ptr = C.int32_t(value)
342-
},
343-
}
258+
return newArray(ptr, intSize,
259+
func(p unsafe.Pointer) int32 { return int32(*(*C.int32_t)(p)) },
260+
func(p unsafe.Pointer, v int32) { *(*C.int32_t)(p) = C.int32_t(v) },
261+
)
344262
}
345263

346264
func ToInt64Array(ptr unsafe.Pointer) *Array[int64] {
347-
if ptr == nil {
348-
return nil
349-
}
350-
351-
return &Array[int64]{
352-
elemSize: int64Size,
353-
loadPtr: func(pointer unsafe.Pointer) int64 {
354-
ptr := (*C.int64_t)(pointer)
355-
return int64(*ptr)
356-
},
357-
ptr: ptr,
358-
storePtr: func(pointer unsafe.Pointer, value int64) {
359-
ptr := (*C.int64_t)(pointer)
360-
*ptr = C.int64_t(value)
361-
},
362-
}
265+
return newArray(ptr, int64Size,
266+
func(p unsafe.Pointer) int64 { return int64(*(*C.int64_t)(p)) },
267+
func(p unsafe.Pointer, v int64) { *(*C.int64_t)(p) = C.int64_t(v) },
268+
)
363269
}
364270

365271
func ToUint64Array(ptr unsafe.Pointer) *Array[uint64] {
366-
if ptr == nil {
367-
return nil
368-
}
369-
370-
return &Array[uint64]{
371-
elemSize: int64Size,
372-
loadPtr: func(pointer unsafe.Pointer) uint64 {
373-
ptr := (*C.uint64_t)(pointer)
374-
return uint64(*ptr)
375-
},
376-
ptr: ptr,
377-
storePtr: func(pointer unsafe.Pointer, value uint64) {
378-
ptr := (*C.uint64_t)(pointer)
379-
*ptr = C.uint64_t(value)
380-
},
381-
}
272+
return newArray(ptr, int64Size,
273+
func(p unsafe.Pointer) uint64 { return uint64(*(*C.uint64_t)(p)) },
274+
func(p unsafe.Pointer, v uint64) { *(*C.uint64_t)(p) = C.uint64_t(v) },
275+
)
382276
}
383277

384278
func ToFloat64Array(ptr unsafe.Pointer) *Array[float64] {
385-
if ptr == nil {
386-
return nil
387-
}
388-
389-
return &Array[float64]{
390-
elemSize: float64Size,
391-
loadPtr: func(pointer unsafe.Pointer) float64 {
392-
ptr := (*C.double)(pointer)
393-
return float64(*ptr)
394-
},
395-
ptr: ptr,
396-
storePtr: func(pointer unsafe.Pointer, value float64) {
397-
ptr := (*C.double)(pointer)
398-
*ptr = C.double(value)
399-
},
400-
}
279+
return newArray(ptr, float64Size,
280+
func(p unsafe.Pointer) float64 { return float64(*(*C.double)(p)) },
281+
func(p unsafe.Pointer, v float64) { *(*C.double)(p) = C.double(v) },
282+
)
401283
}
402284

403285
func ToUint8PtrArray(ptr unsafe.Pointer) *Array[unsafe.Pointer] {
404-
if ptr == nil {
405-
return nil
406-
}
407-
408-
return &Array[unsafe.Pointer]{
409-
elemSize: ptrSize,
410-
loadPtr: func(pointer unsafe.Pointer) unsafe.Pointer {
411-
ptr := (*unsafe.Pointer)(pointer)
412-
return *ptr
413-
},
414-
ptr: ptr,
415-
storePtr: func(pointer unsafe.Pointer, value unsafe.Pointer) {
416-
ptr := (*unsafe.Pointer)(pointer)
417-
*ptr = value
418-
},
419-
}
286+
return newArray(ptr, ptrSize,
287+
func(p unsafe.Pointer) unsafe.Pointer { return *(*unsafe.Pointer)(p) },
288+
func(p unsafe.Pointer, v unsafe.Pointer) { *(*unsafe.Pointer)(p) = v },
289+
)
420290
}

0 commit comments

Comments
 (0)