@@ -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
232222func 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
251229func 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
270236func 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
289243func 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
308250func 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
327257func 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
346264func 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
365271func 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
384278func 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
403285func 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