mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-20 05:20:28 +00:00
Merge pull request #6074 from DarathDev/master
Add missing 'caller_location' to several procedures in 'slice' package
This commit is contained in:
@@ -6,8 +6,8 @@ import "base:runtime"
|
||||
_ :: intrinsics
|
||||
_ :: runtime
|
||||
|
||||
map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (keys: []K, err: runtime.Allocator_Error) {
|
||||
keys = make(type_of(keys), len(m), allocator) or_return
|
||||
map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (keys: []K, err: runtime.Allocator_Error) {
|
||||
keys = make(type_of(keys), len(m), allocator, loc) or_return
|
||||
i := 0
|
||||
for key in m {
|
||||
keys[i] = key
|
||||
@@ -15,8 +15,8 @@ map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (keys: []K,
|
||||
}
|
||||
return
|
||||
}
|
||||
map_values :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (values: []V, err: runtime.Allocator_Error) {
|
||||
values = make(type_of(values), len(m), allocator) or_return
|
||||
map_values :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (values: []V, err: runtime.Allocator_Error) {
|
||||
values = make(type_of(values), len(m), allocator, loc) or_return
|
||||
i := 0
|
||||
for _, value in m {
|
||||
values[i] = value
|
||||
@@ -37,8 +37,8 @@ Map_Entry_Info :: struct($Key, $Value: typeid) {
|
||||
}
|
||||
|
||||
|
||||
map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries: []Map_Entry(K, V), err: runtime.Allocator_Error) {
|
||||
entries = make(type_of(entries), len(m), allocator) or_return
|
||||
map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (entries: []Map_Entry(K, V), err: runtime.Allocator_Error) {
|
||||
entries = make(type_of(entries), len(m), allocator, loc) or_return
|
||||
i := 0
|
||||
for key, value in m {
|
||||
entries[i].key = key
|
||||
@@ -48,13 +48,13 @@ map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries
|
||||
return
|
||||
}
|
||||
|
||||
map_entry_infos :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries: []Map_Entry_Info(K, V), err: runtime.Allocator_Error) #no_bounds_check {
|
||||
map_entry_infos :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (entries: []Map_Entry_Info(K, V), err: runtime.Allocator_Error) #no_bounds_check {
|
||||
m := m
|
||||
rm := (^runtime.Raw_Map)(&m)
|
||||
|
||||
info := runtime.type_info_base(type_info_of(M)).variant.(runtime.Type_Info_Map)
|
||||
if info.map_info != nil {
|
||||
entries = make(type_of(entries), len(m), allocator) or_return
|
||||
entries = make(type_of(entries), len(m), allocator, loc) or_return
|
||||
|
||||
map_cap := uintptr(cap(m))
|
||||
ks, vs, hs, _, _ := runtime.map_kvh_data_dynamic(rm^, info.map_info)
|
||||
|
||||
@@ -29,12 +29,13 @@ Returns:
|
||||
make_permutation_iterator :: proc(
|
||||
slice: []$T,
|
||||
allocator := context.allocator,
|
||||
loc := #caller_location,
|
||||
) -> (
|
||||
iter: Permutation_Iterator(T),
|
||||
error: runtime.Allocator_Error,
|
||||
) #optional_allocator_error {
|
||||
iter.slice = slice
|
||||
iter.counters = make([]int, len(iter.slice), allocator) or_return
|
||||
iter.counters = make([]int, len(iter.slice), allocator, loc) or_return
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -454,7 +454,7 @@ swap_with_slice :: proc(a, b: $T/[]$E, loc := #caller_location) {
|
||||
}
|
||||
|
||||
@(require_results)
|
||||
concatenate :: proc(a: []$T/[]$E, allocator := context.allocator) -> (res: T, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
concatenate :: proc(a: []$T/[]$E, allocator := context.allocator, loc := #caller_location) -> (res: T, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
if len(a) == 0 {
|
||||
return
|
||||
}
|
||||
@@ -462,7 +462,7 @@ concatenate :: proc(a: []$T/[]$E, allocator := context.allocator) -> (res: T, er
|
||||
for s in a {
|
||||
n += len(s)
|
||||
}
|
||||
res = make(T, n, allocator) or_return
|
||||
res = make(T, n, allocator, loc) or_return
|
||||
i := 0
|
||||
for s in a {
|
||||
i += copy(res[i:], s)
|
||||
@@ -584,8 +584,8 @@ as_ptr :: proc "contextless" (array: $T/[]$E) -> [^]E {
|
||||
|
||||
|
||||
@(require_results)
|
||||
mapper :: proc(s: $S/[]$U, f: proc(U) -> $V, allocator := context.allocator) -> (r: []V, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
r = make([]V, len(s), allocator) or_return
|
||||
mapper :: proc(s: $S/[]$U, f: proc(U) -> $V, allocator := context.allocator, loc := #caller_location) -> (r: []V, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
r = make([]V, len(s), allocator, loc) or_return
|
||||
for v, i in s {
|
||||
r[i] = f(v)
|
||||
}
|
||||
@@ -611,33 +611,33 @@ reduce_reverse :: proc(s: $S/[]$U, initializer: $V, f: proc(V, U) -> V) -> V {
|
||||
}
|
||||
|
||||
@(require_results)
|
||||
filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
r := make([dynamic]U, 0, 0, allocator) or_return
|
||||
filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
r := make([dynamic]U, 0, 0, allocator, loc) or_return
|
||||
for v in s {
|
||||
if f(v) {
|
||||
append(&r, v)
|
||||
append(&r, v, loc)
|
||||
}
|
||||
}
|
||||
return r[:], nil
|
||||
}
|
||||
|
||||
@(require_results)
|
||||
filter_reverse :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
r := make([dynamic]U, 0, 0, allocator) or_return
|
||||
filter_reverse :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
r := make([dynamic]U, 0, 0, allocator, loc) or_return
|
||||
for i := len(s)-1; i >= 0; i -= 1 {
|
||||
#no_bounds_check v := s[i]
|
||||
if f(v) {
|
||||
append(&r, v)
|
||||
append(&r, v, loc)
|
||||
}
|
||||
}
|
||||
return r[:], nil
|
||||
}
|
||||
|
||||
@(require_results)
|
||||
scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := context.allocator) -> (res: []V, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := context.allocator, loc := #caller_location) -> (res: []V, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
if len(s) == 0 { return }
|
||||
|
||||
res = make([]V, len(s), allocator) or_return
|
||||
res = make([]V, len(s), allocator, loc) or_return
|
||||
p := as_ptr(s)
|
||||
q := as_ptr(res)
|
||||
r := initializer
|
||||
@@ -654,14 +654,14 @@ scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := c
|
||||
|
||||
|
||||
@(require_results)
|
||||
repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator) -> (b: S, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator, loc := #caller_location) -> (b: S, err: runtime.Allocator_Error) #optional_allocator_error {
|
||||
if count < 0 {
|
||||
panic("slice: negative repeat count")
|
||||
} else if count > 0 && (len(s)*count)/count != len(s) {
|
||||
panic("slice: repeat count will cause an overflow")
|
||||
}
|
||||
|
||||
b = make(S, len(s)*count, allocator) or_return
|
||||
b = make(S, len(s)*count, allocator, loc) or_return
|
||||
i := copy(b, s)
|
||||
for i < len(b) { // 2^N trick to reduce the need to copy
|
||||
copy(b[i:], b[:i])
|
||||
@@ -918,8 +918,8 @@ bitset_to_enum_slice_with_buffer :: proc(buf: []$E, bs: $T) -> (slice: []E) wher
|
||||
// e.g.:
|
||||
// sl := slice.bitset_to_enum_slice(bs)
|
||||
@(require_results)
|
||||
bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context.allocator) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E {
|
||||
buf := make([]E, card(bs), allocator)
|
||||
bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context.allocator, loc := #caller_location) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E {
|
||||
buf := make([]E, card(bs), allocator, loc)
|
||||
return bitset_to_enum_slice(buf, bs)
|
||||
}
|
||||
|
||||
|
||||
@@ -54,9 +54,9 @@ sort :: proc(data: $T/[]$E) where ORD(E) {
|
||||
|
||||
sort_by_indices :: proc{ sort_by_indices_allocate, _sort_by_indices}
|
||||
|
||||
sort_by_indices_allocate :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator) -> (sorted: T) {
|
||||
sort_by_indices_allocate :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator, loc := #caller_location) -> (sorted: T) {
|
||||
assert(len(data) == len(indices))
|
||||
sorted = make(T, len(data), allocator)
|
||||
sorted = make(T, len(data), allocator, loc)
|
||||
for v, i in indices {
|
||||
sorted[i] = data[v]
|
||||
}
|
||||
@@ -100,8 +100,8 @@ sort_from_permutation_indices :: proc(data: $T/[]$E, indices: []int) {
|
||||
|
||||
// sort sorts a slice and returns a slice of the original indices
|
||||
// This sort is not guaranteed to be stable
|
||||
sort_with_indices :: proc(data: $T/[]$E, allocator := context.allocator) -> (indices: []int) where ORD(E) {
|
||||
indices = make([]int, len(data), allocator)
|
||||
sort_with_indices :: proc(data: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> (indices: []int) where ORD(E) {
|
||||
indices = make([]int, len(data), allocator, loc)
|
||||
when size_of(E) != 0 {
|
||||
if n := len(data); n > 1 {
|
||||
for _, idx in indices {
|
||||
@@ -173,8 +173,8 @@ sort_by_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr)
|
||||
|
||||
// sort_by sorts a slice with a given procedure to test whether two values are ordered "i < j"
|
||||
// This sort is not guaranteed to be stable
|
||||
sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocator := context.allocator) -> (indices : []int) {
|
||||
indices = make([]int, len(data), allocator)
|
||||
sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocator := context.allocator, loc := #caller_location) -> (indices : []int) {
|
||||
indices = make([]int, len(data), allocator, loc)
|
||||
when size_of(E) != 0 {
|
||||
if n := len(data); n > 1 {
|
||||
for _, idx in indices {
|
||||
@@ -205,8 +205,8 @@ sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocat
|
||||
return indices
|
||||
}
|
||||
|
||||
sort_by_with_indices_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) -> bool, user_data: rawptr, allocator := context.allocator) -> (indices : []int) {
|
||||
indices = make([]int, len(data), allocator)
|
||||
sort_by_with_indices_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) -> bool, user_data: rawptr, allocator := context.allocator, loc := #caller_location) -> (indices : []int) {
|
||||
indices = make([]int, len(data), allocator, loc)
|
||||
when size_of(E) != 0 {
|
||||
if n := len(data); n > 1 {
|
||||
for _, idx in indices {
|
||||
|
||||
Reference in New Issue
Block a user