// Next reads packets from a packet table starting at the current index into the value pointed at by data. // i.e. data is a pointer to an array or a slice. func (t *Table) Next(data interface{}) error { rt := reflect.TypeOf(data) if rt.Kind() != reflect.Ptr { return fmt.Errorf("hdf5: invalid value type. got=%v, want pointer", rt.Kind()) } rt = rt.Elem() rv := reflect.Indirect(reflect.ValueOf(data)) n := C.size_t(0) cdata := unsafe.Pointer(nil) switch rt.Kind() { case reflect.Array: if rv.Cap() <= 0 { panic(fmt.Errorf("not enough capacity in array (cap=%d)", rv.Cap())) } cdata = unsafe.Pointer(rv.UnsafeAddr()) n = C.size_t(rv.Cap()) case reflect.Slice: if rv.Cap() <= 0 { panic(fmt.Errorf("not enough capacity in slice (cap=%d)", rv.Cap())) } slice := (*reflect.SliceHeader)(unsafe.Pointer(rv.UnsafeAddr())) cdata = unsafe.Pointer(slice.Data) n = C.size_t(rv.Cap()) default: panic(fmt.Errorf("unsupported kind (%s), need slice or array", rt.Kind())) } err := C.H5PTget_next(t.id, n, cdata) return h5err(err) }
// Reads packets from a packet table starting at the current index. // herr_t H5PTget_next( hid_t table_id, size_t nrecords, void *data) func (t *Table) Next(data interface{}) error { rt := reflect.TypeOf(data) rv := reflect.ValueOf(data) c_nrecords := C.size_t(0) c_data := unsafe.Pointer(nil) switch rt.Kind() { case reflect.Array: //fmt.Printf("--> array\n") if rv.Cap() <= 0 { panic(fmt.Sprintf("not enough capacity in array (cap=%d)", rv.Cap())) } c_data = unsafe.Pointer(rv.Index(0).UnsafeAddr()) c_nrecords = C.size_t(rv.Cap()) case reflect.Slice: //fmt.Printf("--> slice\n") if rv.Cap() <= 0 { panic(fmt.Sprintf("not enough capacity in slice (cap=%d)", rv.Cap())) } slice := (*reflect.SliceHeader)(unsafe.Pointer(rv.UnsafeAddr())) c_data = unsafe.Pointer(slice.Data) c_nrecords = C.size_t(rv.Cap()) default: panic(fmt.Sprintf("unhandled kind (%s) need slice or array", rt.Kind())) } //fmt.Printf("--data: %v...\n", data) err := C.H5PTget_next(t.id, c_nrecords, c_data) //fmt.Printf("--data: err [%v]\n", err) //fmt.Printf("--data: %v... [%v]\n", data, err) return togo_err(err) }
// Next reads packets from a packet table starting at the current index. func (t *Table) Next(data interface{}) error { rt := reflect.TypeOf(data) rv := reflect.ValueOf(data) n := C.size_t(0) cdata := unsafe.Pointer(nil) switch rt.Kind() { case reflect.Array: if rv.Cap() <= 0 { panic(fmt.Sprintf("not enough capacity in array (cap=%d)", rv.Cap())) } cdata = unsafe.Pointer(rv.Index(0).UnsafeAddr()) n = C.size_t(rv.Cap()) default: panic(fmt.Sprintf("unsupported kind (%s), need slice or array", rt.Kind())) } err := C.H5PTget_next(t.id, n, cdata) return h5err(err) }