From e3306953ef56798680db1257852726c02338a6fc Mon Sep 17 00:00:00 2001 From: Jakob Schwendner Date: Thu, 27 Jan 2011 09:14:30 -0500 Subject: test case for unaligned quaternion --- test/geo_quaternion.cpp | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) (limited to 'test/geo_quaternion.cpp') diff --git a/test/geo_quaternion.cpp b/test/geo_quaternion.cpp index aab7ed3f7..948c58901 100644 --- a/test/geo_quaternion.cpp +++ b/test/geo_quaternion.cpp @@ -28,7 +28,7 @@ #include #include -template void quaternion(void) +template void quaternion(void) { /* this test covers the following files: Quaternion.h @@ -36,7 +36,7 @@ template void quaternion(void) typedef Matrix Matrix3; typedef Matrix Vector3; - typedef Quaternion Quaternionx; + typedef Quaternion Quaternionx; typedef AngleAxis AngleAxisx; Scalar largeEps = test_precision(); @@ -119,10 +119,10 @@ template void mapQuaternion(void){ typedef Map > MQuaternionUA; typedef Quaternion Quaternionx; - EIGEN_ALIGN16 Scalar array1[4]; - EIGEN_ALIGN16 Scalar array2[4]; - EIGEN_ALIGN16 Scalar array3[4+1]; - Scalar* array3unaligned = array3+1; + EIGEN_ALIGN16 Scalar array1[4]; + EIGEN_ALIGN16 Scalar array2[4]; + EIGEN_ALIGN16 Scalar array3[4+1]; + Scalar* array3unaligned = array3+1; MQuaternionA(array1).coeffs().setRandom(); (MQuaternionA(array2)) = MQuaternionA(array1); @@ -139,11 +139,39 @@ template void mapQuaternion(void){ #endif } +template void quaternionAlignment(void){ + typedef Quaternion QuaternionA; + typedef Quaternion QuaternionUA; + + EIGEN_ALIGN16 Scalar array1[4]; + EIGEN_ALIGN16 Scalar array2[4]; + EIGEN_ALIGN16 Scalar array3[4+1]; + Scalar* arrayunaligned = array3+1; + + QuaternionA *q1 = ::new(reinterpret_cast(array1)) QuaternionA; + QuaternionUA *q2 = ::new(reinterpret_cast(array2)) QuaternionUA; + QuaternionUA *q3 = ::new(reinterpret_cast(arrayunaligned)) QuaternionUA; + + q1->coeffs().setRandom(); + *q2 = *q1; + *q3 = *q1; + + VERIFY_IS_APPROX(q1->coeffs(), q2->coeffs()); + VERIFY_IS_APPROX(q1->coeffs(), q3->coeffs()); + #ifdef EIGEN_VECTORIZE + VERIFY_RAISES_ASSERT((::new(reinterpret_cast(arrayunaligned)) QuaternionA)); + #endif +} + void test_geo_quaternion() { for(int i = 0; i < g_repeat; i++) { - CALL_SUBTEST_1( quaternion() ); - CALL_SUBTEST_2( quaternion() ); + CALL_SUBTEST_1(( quaternion() )); + CALL_SUBTEST_2(( quaternion() )); + CALL_SUBTEST_3(( quaternion() )); + CALL_SUBTEST_4(( quaternion() )); + CALL_SUBTEST_5(( quaternionAlignment() )); + CALL_SUBTEST_6(( quaternionAlignment() )); CALL_SUBTEST( mapQuaternion() ); CALL_SUBTEST( mapQuaternion() ); } -- cgit v1.2.3