diff options
Diffstat (limited to 'core/mem')
| -rw-r--r-- | core/mem/alloc.odin | 12 | ||||
| -rw-r--r-- | core/mem/mem.odin | 40 |
2 files changed, 33 insertions, 19 deletions
diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index 4c60ef4a1..38eda7a11 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -84,7 +84,10 @@ delete :: proc{ new :: inline proc($T: typeid, allocator := context.allocator, loc := #caller_location) -> ^T { - ptr := (^T)(alloc(size_of(T), align_of(T), allocator, loc)); + return new_aligned(T, align_of(T), allocator, loc); +} +new_aligned :: inline proc($T: typeid, alignment: int, allocator := context.allocator, loc := #caller_location) -> ^T { + ptr := (^T)(alloc(size_of(T), alignment, allocator, loc)); if ptr != nil do ptr^ = T{}; return ptr; } @@ -95,9 +98,12 @@ new_clone :: inline proc(data: $T, allocator := context.allocator, loc := #calle } -make_slice :: proc($T: typeid/[]$E, auto_cast len: int, allocator := context.allocator, loc := #caller_location) -> T { +make_slice :: inline proc($T: typeid/[]$E, auto_cast len: int, allocator := context.allocator, loc := #caller_location) -> T { + return make_aligned(T, len, align_of(E), allocator, loc); +} +make_aligned :: proc($T: typeid/[]$E, auto_cast len: int, alignment: int, allocator := context.allocator, loc := #caller_location) -> T { runtime.make_slice_error_loc(loc, len); - data := alloc(size_of(E)*len, align_of(E), allocator, loc); + data := alloc(size_of(E)*len, alignment, allocator, loc); s := Raw_Slice{data, len}; return transmute(T)s; } diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 1c833c4d1..78be94560 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -151,27 +151,19 @@ is_power_of_two :: inline proc(x: uintptr) -> bool { return (x & (x-1)) == 0; } -align_forward :: proc(ptr: rawptr, align: uintptr) -> rawptr { - assert(is_power_of_two(align)); - - a := uintptr(align); - p := uintptr(ptr); - modulo := p & (a-1); - if modulo != 0 do p += a - modulo; - return rawptr(p); +align_forward :: inline proc(ptr: rawptr, align: uintptr) -> rawptr { + return rawptr(align_forward_uintptr(uintptr(ptr), align)); } align_forward_uintptr :: proc(ptr, align: uintptr) -> uintptr { assert(is_power_of_two(align)); - a := uintptr(align); - p := uintptr(ptr); - modulo := p & (a-1); - if modulo != 0 do p += a - modulo; - return uintptr(p); + p := ptr; + modulo := p & (align-1); + if modulo != 0 do p += align - modulo; + return p; } - align_forward_int :: inline proc(ptr, align: int) -> int { return int(align_forward_uintptr(uintptr(ptr), uintptr(align))); } @@ -179,6 +171,24 @@ align_forward_uint :: inline proc(ptr, align: uint) -> uint { return uint(align_forward_uintptr(uintptr(ptr), uintptr(align))); } +align_backward :: inline proc(ptr: rawptr, align: uintptr) -> rawptr { + return rawptr(align_backward_uintptr(uintptr(ptr), align)); +} + +align_backward_uintptr :: proc(ptr, align: uintptr) -> uintptr { + assert(is_power_of_two(align)); + + ptr := rawptr(ptr - align); + return uintptr(align_forward(ptr, align)); +} + +align_backward_int :: inline proc(ptr, align: int) -> int { + return int(align_backward_uintptr(uintptr(ptr), uintptr(align))); +} +align_backward_uint :: inline proc(ptr, align: uint) -> uint { + return uint(align_backward_uintptr(uintptr(ptr), uintptr(align))); +} + context_from_allocator :: proc(a: Allocator) -> type_of(context) { context.allocator = a; return context; @@ -226,5 +236,3 @@ calc_padding_with_header :: proc(ptr: uintptr, align: uintptr, header_size: int) return int(padding); } - - |