authorgravatar for samuel.tebbs@gmail.comSamTebbs33 <samuel.tebbs@gmail.com> 2019-06-27 22:23:09+01:00
committergravatar for samuel.tebbs@gmail.comSamTebbs33 <samuel.tebbs@gmail.com> 2019-06-27 22:23:09+01:00
log623dbb73df7d8350f79f62c13587a354fdcd56d5
tree53e71aec6311c88cf91753e262460039a642bd52
parent14abf0fda5080b52ddfc0976d0e7c93928dbe543

Add check for power of 2 to std.mem.alignBackward


1 files changed, 4 insertions(+), 3 deletions(-)

std/mem.zig+4-3
...@@ -1481,7 +1481,7 @@ test "subArrayPtr" {...@@ -1481,7 +1481,7 @@ test "subArrayPtr" {
1481}1481}
14821482
1483/// Round an address up to the nearest aligned address1483/// Round an address up to the nearest aligned address
1484/// The alignment must be greater than 0.1484/// The alignment must be a power of 2 and greater than 0.
1485pub fn alignForward(addr: usize, alignment: usize) usize {1485pub fn alignForward(addr: usize, alignment: usize) usize {
1486 return alignBackward(addr + (alignment - 1), alignment);1486 return alignBackward(addr + (alignment - 1), alignment);
1487}1487}
...@@ -1502,8 +1502,9 @@ test "alignForward" {...@@ -1502,8 +1502,9 @@ test "alignForward" {
1502}1502}
15031503
1504/// Round an address up to the previous aligned address1504/// Round an address up to the previous aligned address
1505/// The alignment must be greater than 0.1505/// The alignment must be a power of 2 and greater than 0.
1506pub fn alignBackward(addr: usize, alignment: usize) usize {1506pub fn alignBackward(addr: usize, alignment: usize) usize {
1507 assert(@popCount(usize, alignment) == 1);
1507 // 000010000 // example addr1508 // 000010000 // example addr
1508 // 000001111 // subtract 11509 // 000001111 // subtract 1
1509 // 111110000 // binary not1510 // 111110000 // binary not
...@@ -1511,7 +1512,7 @@ pub fn alignBackward(addr: usize, alignment: usize) usize {...@@ -1511,7 +1512,7 @@ pub fn alignBackward(addr: usize, alignment: usize) usize {
1511}1512}
15121513
1513/// Given an address and an alignment, return true if the address is a multiple of the alignment1514/// Given an address and an alignment, return true if the address is a multiple of the alignment
1514/// The alignment must be greater than 0.1515/// The alignment must be a power of 2 and greater than 0.
1515pub fn isAligned(addr: usize, alignment: usize) bool {1516pub fn isAligned(addr: usize, alignment: usize) bool {
1516 return alignBackward(addr, alignment) == addr;1517 return alignBackward(addr, alignment) == addr;
1517}1518}