From a4d3777ab23787e93b83259a984b3aad70cbb740 Mon Sep 17 00:00:00 2001 From: James Duran Date: Wed, 14 Feb 2024 16:51:09 -0800 Subject: [PATCH 1/4] Added into_dynamic_soa, unordered_remove_soa, and ordered_remove_soa --- base/runtime/core_builtin_soa.odin | 99 +++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/base/runtime/core_builtin_soa.odin b/base/runtime/core_builtin_soa.odin index 94f5be1d4..027c680fa 100644 --- a/base/runtime/core_builtin_soa.odin +++ b/base/runtime/core_builtin_soa.odin @@ -425,4 +425,101 @@ clear_soa_dynamic_array :: proc(array: ^$T/#soa[dynamic]$E) { @builtin clear_soa :: proc{ clear_soa_dynamic_array, -} \ No newline at end of file +} + +// Converts soa slice into a soa dynamic array without cloning or allocating memory +@(builtin, require_results) +into_dynamic_soa :: proc(array: $T/#soa[]$E) -> #soa[dynamic]E { + d: #soa[dynamic]E + footer := raw_soa_footer_dynamic_array(&d) + footer^ = { + cap = len(array), + len = 0, + allocator = nil_allocator(), + } + + field_count: uintptr + when intrinsics.type_is_array(E) { + field_count = len(E) + } else { + field_count = uintptr(intrinsics.type_struct_field_count(E)) + } + + array := array + dynamic_data := uintptr(&d) + slice_data := uintptr(&array) + for _ in 0.. Date: Fri, 16 Feb 2024 10:46:46 -0800 Subject: [PATCH 2/4] Make into_dynamic_soa more concise and remove builtin tag from it --- base/runtime/core_builtin_soa.odin | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/base/runtime/core_builtin_soa.odin b/base/runtime/core_builtin_soa.odin index 027c680fa..0fe6480aa 100644 --- a/base/runtime/core_builtin_soa.odin +++ b/base/runtime/core_builtin_soa.odin @@ -428,7 +428,7 @@ clear_soa :: proc{ } // Converts soa slice into a soa dynamic array without cloning or allocating memory -@(builtin, require_results) +@(require_results) into_dynamic_soa :: proc(array: $T/#soa[]$E) -> #soa[dynamic]E { d: #soa[dynamic]E footer := raw_soa_footer_dynamic_array(&d) @@ -446,13 +446,9 @@ into_dynamic_soa :: proc(array: $T/#soa[]$E) -> #soa[dynamic]E { } array := array - dynamic_data := uintptr(&d) - slice_data := uintptr(&array) - for _ in 0.. Date: Fri, 16 Feb 2024 10:50:54 -0800 Subject: [PATCH 3/4] Fix Syntax Mistake --- base/runtime/core_builtin_soa.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/runtime/core_builtin_soa.odin b/base/runtime/core_builtin_soa.odin index 0fe6480aa..63a426888 100644 --- a/base/runtime/core_builtin_soa.odin +++ b/base/runtime/core_builtin_soa.odin @@ -446,7 +446,7 @@ into_dynamic_soa :: proc(array: $T/#soa[]$E) -> #soa[dynamic]E { } array := array - dynamic_data := ([^rawptr])(&d)[:field_count] + dynamic_data := ([^]rawptr])(&d)[:field_count] slice_data := ([^]rawptr)(&array)[:field_count] copy(dynamic_data, slice_data) From 44aae762946f33b354634d4b3c3f9ebdcd1ad104 Mon Sep 17 00:00:00 2001 From: James Duran Date: Fri, 16 Feb 2024 10:55:55 -0800 Subject: [PATCH 4/4] Fix syntax mistake again Sorry for being blind --- base/runtime/core_builtin_soa.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/runtime/core_builtin_soa.odin b/base/runtime/core_builtin_soa.odin index 63a426888..23f879791 100644 --- a/base/runtime/core_builtin_soa.odin +++ b/base/runtime/core_builtin_soa.odin @@ -446,7 +446,7 @@ into_dynamic_soa :: proc(array: $T/#soa[]$E) -> #soa[dynamic]E { } array := array - dynamic_data := ([^]rawptr])(&d)[:field_count] + dynamic_data := ([^]rawptr)(&d)[:field_count] slice_data := ([^]rawptr)(&array)[:field_count] copy(dynamic_data, slice_data)