Browse Source

Allow 0 as alignment value.

Бранимир Караџић 2 years ago
parent
commit
d8c3672bce
2 changed files with 11 additions and 4 deletions
  1. 4 4
      include/bx/inline/uint32_t.inl
  2. 7 0
      tests/uint32_test.cpp

+ 4 - 4
include/bx/inline/uint32_t.inl

@@ -708,7 +708,7 @@ namespace bx
 	template<typename Ty>
 	template<typename Ty>
 	inline BX_CONSTEXPR_FUNC bool isAligned(Ty _a, int32_t _align)
 	inline BX_CONSTEXPR_FUNC bool isAligned(Ty _a, int32_t _align)
 	{
 	{
-		const Ty mask = Ty(_align - 1);
+		const Ty mask = Ty(max(1, _align) - 1);
 		return 0 == (_a & mask);
 		return 0 == (_a & mask);
 	}
 	}
 
 
@@ -727,9 +727,9 @@ namespace bx
 	}
 	}
 
 
 	template<typename Ty>
 	template<typename Ty>
-	inline BX_CONSTEXPR_FUNC  Ty alignDown(Ty _a, int32_t _align)
+	inline BX_CONSTEXPR_FUNC Ty alignDown(Ty _a, int32_t _align)
 	{
 	{
-		const Ty mask = Ty(_align - 1);
+		const Ty mask = Ty(max(1, _align) - 1);
 		return Ty(_a & ~mask);
 		return Ty(_a & ~mask);
 	}
 	}
 
 
@@ -752,7 +752,7 @@ namespace bx
 	template<typename Ty>
 	template<typename Ty>
 	inline BX_CONSTEXPR_FUNC Ty alignUp(Ty _a, int32_t _align)
 	inline BX_CONSTEXPR_FUNC Ty alignUp(Ty _a, int32_t _align)
 	{
 	{
-		const Ty mask = Ty(_align - 1);
+		const Ty mask = Ty(max(1, _align) - 1);
 		return Ty( (_a + mask) & ~mask);
 		return Ty( (_a + mask) & ~mask);
 	}
 	}
 
 

+ 7 - 0
tests/uint32_test.cpp

@@ -141,6 +141,13 @@ TEST_CASE("align", "[uint32_t]")
 	REQUIRE( bx::isAligned(64, 8) );
 	REQUIRE( bx::isAligned(64, 8) );
 	REQUIRE(!bx::isAligned(63, 8) );
 	REQUIRE(!bx::isAligned(63, 8) );
 
 
+	for (int32_t ii = 0; ii < 1024; ++ii)
+	{
+		REQUIRE(bx::isAligned(ii, 0) );
+		REQUIRE(ii == bx::alignUp(ii, 0) );
+		REQUIRE(ii == bx::alignDown(ii, 0) );
+	}
+
 	REQUIRE(  0 == bx::alignUp(  0, 16) );
 	REQUIRE(  0 == bx::alignUp(  0, 16) );
 	REQUIRE( 16 == bx::alignUp(  1, 16) );
 	REQUIRE( 16 == bx::alignUp(  1, 16) );
 	REQUIRE( 16 == bx::alignUp( 15, 16) );
 	REQUIRE( 16 == bx::alignUp( 15, 16) );