Skip to content

Commit 069ca73

Browse files
committed
Make things contextless where possible
1 parent f2a8960 commit 069ca73

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

core/container/handle_map/dynamic_handle_map.odin

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ dynamic_destroy :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) {
3535
dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc := #caller_location) -> (handle: Handle_Type, err: runtime.Allocator_Error) {
3636
if xar.len(m.unused_items) > 0 {
3737
i := xar.pop(&m.unused_items)
38-
ptr := xar.get_ptr(&m.items, i, loc)
38+
ptr := xar.get_ptr_unsafe(&m.items, i)
3939
prev_gen := ptr.handle.gen
4040
ptr^ = item
4141

@@ -51,7 +51,7 @@ dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc :=
5151

5252
i := xar.append(&m.items, item, loc) or_return
5353

54-
ptr := xar.get_ptr(&m.items, i, loc)
54+
ptr := xar.get_ptr_unsafe(&m.items, i)
5555
ptr^ = item
5656

5757
ptr.handle.idx = auto_cast i
@@ -60,11 +60,11 @@ dynamic_add :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), item: T, loc :=
6060
}
6161

6262
@(require_results)
63-
dynamic_get :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok {
63+
dynamic_get :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type) -> (^T, bool) #optional_ok {
6464
if h.idx <= 0 || int(u32(h.idx)) >= xar.len(m.items) {
6565
return nil, false
6666
}
67-
if e := xar.get_ptr(&m.items, h.idx); e.handle == h {
67+
if e := xar.get_ptr_unsafe(&m.items, h.idx); e.handle == h {
6868
return e, true
6969
}
7070
return nil, false
@@ -85,24 +85,24 @@ dynamic_remove :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Ty
8585
}
8686

8787
@(require_results)
88-
dynamic_is_valid :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type, loc := #caller_location) -> bool {
89-
return h.idx > 0 && int(u32(h.idx)) < xar.len(m.items) && xar.get(&m.items, h.idx, loc).handle == h
88+
dynamic_is_valid :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type), h: Handle_Type) -> bool {
89+
return h.idx > 0 && int(u32(h.idx)) < xar.len(m.items) && xar.get_ptr_unsafe(&m.items, h.idx).handle == h
9090
}
9191

9292
// Returns the number of possibly valid items in the handle map.
9393
@(require_results)
94-
dynamic_len :: proc(m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint {
94+
dynamic_len :: proc "contextless" (m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint {
9595
n := xar.len(m.items) - xar.len(m.unused_items)
9696
return uint(n-1 if n > 0 else 0)
9797
}
9898

9999
@(require_results)
100-
dynamic_cap :: proc(m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint {
100+
dynamic_cap :: proc "contextless" (m: $D/Dynamic_Handle_Map($T, $Handle_Type)) -> uint {
101101
n := xar.cap(m.items)
102102
return uint(n-1 if n > 0 else 0)
103103
}
104104

105-
dynamic_clear :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) {
105+
dynamic_clear :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) {
106106
xar.clear(&m.items)
107107
xar.clear(&m.unused_items)
108108
}
@@ -116,7 +116,7 @@ Dynamic_Handle_Map_Iterator :: struct($D: typeid) {
116116

117117
// Makes an iterator from a handle map.
118118
@(require_results)
119-
dynamic_iterator_make :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) -> Dynamic_Handle_Map_Iterator(D) {
119+
dynamic_iterator_make :: proc "contextless" (m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) -> Dynamic_Handle_Map_Iterator(D) {
120120
return {m, 1}
121121
}
122122

@@ -129,9 +129,9 @@ dynamic_iterator_make :: proc(m: ^$D/Dynamic_Handle_Map($T, $Handle_Type)) -> Dy
129129
}
130130
*/
131131
@(require_results)
132-
dynamic_iterate :: proc(it: ^$DHI/Dynamic_Handle_Map_Iterator($D/Dynamic_Handle_Map($T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) {
132+
dynamic_iterate :: proc "contextless" (it: ^$DHI/Dynamic_Handle_Map_Iterator($D/Dynamic_Handle_Map($T, $Handle_Type))) -> (val: ^T, h: Handle_Type, ok: bool) {
133133
for _ in it.index..<xar.len(it.m.items) {
134-
e := xar.get_ptr(&it.m.items, it.index)
134+
e := xar.get_ptr_unsafe(&it.m.items, it.index)
135135
it.index += 1
136136

137137
if e.handle.idx != 0 {

core/container/xar/xar.odin

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,19 +109,19 @@ destroy :: proc(x: ^$X/Array($T, $SHIFT)) {
109109
Resets the array's length to zero without freeing memory.
110110
Allocated chunks are retained for reuse.
111111
*/
112-
clear :: proc(x: ^$X/Array($T, $SHIFT)) {
112+
clear :: proc "contextless" (x: ^$X/Array($T, $SHIFT)) {
113113
x.len = 0
114114
}
115115

116116
// Returns the length of the exponential-array
117117
@(require_results)
118-
len :: proc(x: $X/Array($T, $SHIFT)) -> int {
118+
len :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int {
119119
return x.len
120120
}
121121

122122
// Returns the number of allocated elements
123123
@(require_results)
124-
cap :: proc(x: $X/Array($T, $SHIFT)) -> int {
124+
cap :: proc "contextless" (x: $X/Array($T, $SHIFT)) -> int {
125125
#reverse for c, i in x.chunks {
126126
if c != nil {
127127
return 1 << (SHIFT + uint(i if i > 0 else 1))
@@ -132,7 +132,7 @@ cap :: proc(x: $X/Array($T, $SHIFT)) -> int {
132132

133133
// Internal: computes chunk index, element index within chunk, and chunk capacity for a given index.
134134
@(require_results)
135-
_meta_get :: #force_inline proc($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) {
135+
_meta_get :: #force_inline proc "contextless" ($SHIFT: uint, index: uint) -> (chunk_idx, elem_idx, chunk_cap: uint) {
136136
elem_idx = index
137137
chunk_cap = uint(1) << SHIFT
138138
chunk_idx = 0
@@ -206,6 +206,13 @@ get_ptr :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_lo
206206
return &x.chunks[chunk_idx][elem_idx]
207207
}
208208

209+
// No bounds checking
210+
@(require_results)
211+
get_ptr_unsafe :: proc "contextless" (x: ^$X/Array($T, $SHIFT), #any_int index: int) -> (val: ^T) #no_bounds_check {
212+
chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index))
213+
return &x.chunks[chunk_idx][elem_idx]
214+
}
215+
209216
/*
210217
Set the element at the specified index to the given value.
211218

0 commit comments

Comments
 (0)