Skip to content

Commit 57b178e

Browse files
committed
use reflect slices for columns
1 parent 1106057 commit 57b178e

File tree

5 files changed

+46
-44
lines changed

5 files changed

+46
-44
lines changed

ecs/column.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ type column struct {
2020
// newColumn creates a new column for a given type and capacity.
2121
func newColumn(index uint32, tp reflect.Type, itemSize uintptr, isRelation bool, isTrivial bool, target Entity, capacity uint32) column {
2222
// TODO: should we use a slice instead of an array here?
23-
data := reflect.New(reflect.ArrayOf(int(capacity), tp)).Elem()
24-
pointer := data.Addr().UnsafePointer()
23+
data := reflect.MakeSlice(reflect.SliceOf(tp), int(capacity), int(capacity))
24+
pointer := data.Index(0).Addr().UnsafePointer()
2525

2626
return column{
2727
pointer: pointer,
@@ -103,7 +103,9 @@ func (c *column) Reset(ownLen uint32, zero unsafe.Pointer) {
103103
if ownLen <= 64 && c.isTrivial { // A coarse estimate where manually zeroing is faster
104104
c.ZeroRange(0, ownLen, zero)
105105
} else {
106-
c.data.SetZero()
106+
for i := range ownLen {
107+
zeroValueAt(c.data, int(i))
108+
}
107109
}
108110
}
109111

ecs/column_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ func TestColumnPointer(t *testing.T) {
99
posType := reflect.TypeOf(Position{})
1010
column := newColumn(0, posType, posType.Size(), false, true, Entity{}, 8)
1111

12-
expectEqual(t, uintptr(column.pointer), uintptr(column.data.Addr().UnsafePointer()))
12+
expectEqual(t, uintptr(column.pointer), uintptr(column.data.Index(0).Addr().UnsafePointer()))
1313
}

ecs/internal/generate/query.go.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func (q *Query{{.}}{{$genericsShort}}) setTable(index int32, table *table) {
197197
q.table = table
198198
{{- range $i, $v := $upper}}
199199
column{{$v}} := q.components[{{$i}}].columns[q.table.id]
200-
q.column{{$v}} = column{{$v}}.data.Slice(0, column{{$v}}.data.Len()).Interface().([]{{$v}})
200+
q.column{{$v}} = column{{$v}}.data.Interface().([]{{$v}})
201201
{{- end}}
202202
q.cursor.index = 0
203203
q.cursor.maxIndex = int64(q.table.len - 1)

ecs/query_gen.go

Lines changed: 36 additions & 36 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ecs/table.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,15 +174,15 @@ func (t *table) adjustCapacity(cap uint32) {
174174
for i := range t.columns {
175175
column := &t.columns[i]
176176
old := column.data
177-
column.data = reflect.New(reflect.ArrayOf(int(t.cap), column.elemType)).Elem()
177+
column.data = reflect.MakeSlice(reflect.SliceOf(column.elemType), int(t.cap), int(t.cap))
178178
if column.isTrivial {
179-
newPtr := column.data.Addr().UnsafePointer()
179+
newPtr := column.data.Index(0).Addr().UnsafePointer()
180180
if t.len > 0 {
181181
copyPtr(column.pointer, newPtr, uintptr(t.len)*column.itemSize)
182182
}
183183
column.pointer = newPtr
184184
} else {
185-
column.pointer = column.data.Addr().UnsafePointer()
185+
column.pointer = column.data.Index(0).Addr().UnsafePointer()
186186
if t.len > 0 {
187187
reflect.Copy(column.data, old)
188188
}

0 commit comments

Comments
 (0)