Browse Source

Add `mem.make_over_aligned`

gingerBill 5 months ago
parent
commit
70ddb74e40
2 changed files with 29 additions and 1 deletions
  1. 28 0
      core/mem/alloc.odin
  2. 1 1
      core/mem/mem.odin

+ 28 - 0
core/mem/alloc.odin

@@ -888,6 +888,34 @@ make_aligned :: proc(
 	return runtime.make_aligned(T, len, alignment, allocator, loc)
 }
 
+
+/*
+Allocate a new slice with alignment for allocators that might not support the
+specified alignment requirement.
+
+This procedure allocates a new slice of type `T` with length `len`, aligned
+on a boundary specified by `alignment` from an allocator specified by
+`allocator`, and returns the allocated slice.
+
+The user should `delete` the return `original_data` slice not the typed `slice`.
+*/
+@(require_results)
+make_over_aligned :: proc(
+	$T: typeid/[]$E,
+	#any_int len: int,
+	alignment: int,
+	allocator: runtime.Allocator,
+	loc := #caller_location,
+) -> (slice: T, original_data: []byte, err: Allocator_Error) {
+	size := size_of(E)*len + alignment-1
+	original_data, err = runtime.make([]byte, size, allocator, loc)
+	if err == nil {
+		ptr := align_forward(raw_data(original_data), uintptr(alignment))
+		slice = ([^]E)(ptr)[:len]
+	}
+	return
+}
+
 /*
 Allocate a new slice.
 

+ 1 - 1
core/mem/mem.odin

@@ -1,4 +1,4 @@
-#package mem
+package mem
 
 import "base:runtime"
 import "base:intrinsics"