Browse Source

Added experiments and tests for roundEven

Christophe Riccio 14 years ago
parent
commit
cc48ab3697
3 changed files with 175 additions and 110 deletions
  1. 17 2
      glm/core/func_common.inl
  2. 54 38
      test/core/core_func_common.cpp
  3. 104 70
      test/core/core_setup_message.cpp

+ 17 - 2
glm/core/func_common.inl

@@ -268,7 +268,7 @@ namespace detail
             round(x.z),
             round(x.w));
     }
-
+/*
     // roundEven
     template <typename genType>
     GLM_FUNC_QUALIFIER genType roundEven(genType const& x)
@@ -277,7 +277,22 @@ namespace detail
 
 		return genType(int(x + genType(int(x) % 2)));
     }
-
+*/
+    // roundEven
+    template <typename genType>
+    GLM_FUNC_QUALIFIER genType roundEven(genType const& x)
+    {
+		GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'roundEven' only accept floating-point inputs");
+		
+		genType RoundValue(0.5);
+		if(fract(x) == genType(0.5) && int(x) % 2)
+			RoundValue = genType(-0.5);
+		
+		if(x < genType(0.0))
+			return genType(int(x - RoundValue));
+		return genType(int(x + RoundValue));
+    }
+	
     template <typename valType>
     GLM_FUNC_QUALIFIER detail::tvec2<valType> roundEven(detail::tvec2<valType> const& x)
     {

+ 54 - 38
test/core/core_func_common.cpp

@@ -167,55 +167,71 @@ int test_roundEven()
 	int Error = 0;
 	
 	{
-		float A = glm::roundEven(0.0f);
+		float A = glm::round(0.0f);
 		Error += A == 0.0f ? 0 : 1;
-		float B = glm::roundEven(0.5f);
+		float B = glm::round(0.5f);
 		Error += B == 0.0f ? 0 : 1;
-		float C = glm::roundEven(1.0f);
-		Error += C == 2.0f ? 0 : 1;
-		float D = glm::roundEven(0.1f);
+		float C = glm::round(1.0f);
+		Error += C == 1.0f ? 0 : 1;
+		float D = glm::round(0.1f);
 		Error += D == 0.0f ? 0 : 1;
-		float E = glm::roundEven(0.9f);
-		Error += E == 0.0f ? 0 : 1;
-		float F = glm::roundEven(1.9f);
+		float E = glm::round(0.9f);
+		Error += E == 1.0f ? 0 : 1;
+		float F = glm::round(1.5f);
 		Error += F == 2.0f ? 0 : 1;
-		float G = glm::roundEven(2.5f);
+		float G = glm::round(1.9f);
 		Error += G == 2.0f ? 0 : 1;
-		float H = glm::roundEven(2.9f);
-		Error += H == 2.0f ? 0 : 1;
-		float I = glm::roundEven(3.2f);
-		Error += I == 4.0f ? 0 : 1;
-		float J = glm::roundEven(3.5f);
-		Error += J == 4.0f ? 0 : 1;
-		float K = glm::roundEven(3.9f);
-		Error += K == 4.0f ? 0 : 1;
-		float L = glm::roundEven(4.1f);
-		Error += L == 4.0f ? 0 : 1;
 	}
 	
 	{
-		float A = glm::roundEven(-0.0f);
-		Error += A == 0.0f ? 0 : 1;
-		float B = glm::roundEven(-0.5f);
-		Error += B == -2.0f ? 0 : 1;
-		float C = glm::roundEven(-1.0f);
-		Error += C == -2.0f ? 0 : 1;
-		float D = glm::roundEven(-0.1f);
+		float A = glm::round(-0.0f);
+		Error += A ==  0.0f ? 0 : 1;
+		float B = glm::round(-0.5f);
+		Error += B == -0.0f ? 0 : 1;
+		float C = glm::round(-1.0f);
+		Error += C == -1.0f ? 0 : 1;
+		float D = glm::round(-0.1f);
 		Error += D ==  0.0f ? 0 : 1;
-		float E = glm::roundEven(-0.9f);
-		Error += E == -2.0f ? 0 : 1;
-		float F = glm::roundEven(-1.9f);
+		float E = glm::round(-0.9f);
+		Error += E == -1.0f ? 0 : 1;
+		float F = glm::round(-1.5f);
 		Error += F == -2.0f ? 0 : 1;
-		float G = glm::roundEven(-2.5f);
+		float G = glm::round(-1.9f);
 		Error += G == -2.0f ? 0 : 1;
-		float H = glm::roundEven(-2.9f);
-		Error += H == -2.0f ? 0 : 1;
-		float I = glm::roundEven(-3.2f);
-		Error += I == -4.0f ? 0 : 1;
-		float J = glm::roundEven(-3.5f);
-		Error += J == -4.0f ? 0 : 1;
-		float K = glm::roundEven(-3.9f);
-		Error += K == -4.0f ? 0 : 1;
+	}
+	
+	{
+		float A = glm::round(1.5f);
+		Error += A == 2.0f ? 0 : 1;
+		float B = glm::round(2.5f);
+		Error += B == 2.0f ? 0 : 1;
+		float C = glm::round(3.5f);
+		Error += C == 4.0f ? 0 : 1;
+		float D = glm::round(4.5f);
+		Error += D == 4.0f ? 0 : 1;
+		float E = glm::round(5.5f);
+		Error += E == 6.0f ? 0 : 1;
+		float F = glm::round(6.5f);
+		Error += F == 6.0f ? 0 : 1;
+		float G = glm::round(7.5f);
+		Error += G == 8.0f ? 0 : 1;
+	}
+	
+	{
+		float A = glm::round(-1.5f);
+		Error += A == -2.0f ? 0 : 1;
+		float B = glm::round(-2.5f);
+		Error += B == -2.0f ? 0 : 1;
+		float C = glm::round(-3.5f);
+		Error += C == -4.0f ? 0 : 1;
+		float D = glm::round(-4.5f);
+		Error += D == -4.0f ? 0 : 1;
+		float E = glm::round(-5.5f);
+		Error += E == -6.0f ? 0 : 1;
+		float F = glm::round(-6.5f);
+		Error += F == -6.0f ? 0 : 1;
+		float G = glm::round(-7.5f);
+		Error += G == -8.0f ? 0 : 1;
 	}
 	
 	return Error;

+ 104 - 70
test/core/core_setup_message.cpp

@@ -11,75 +11,6 @@
 #include <glm/glm.hpp>
 #include <iostream>
 
-/*
-#define GLM_COMPILER_UNKNOWN		0x00000000
-
-// Visual C++ defines
-#define GLM_COMPILER_VC				0x01000000
-#define GLM_COMPILER_VC2			0x01000010
-#define GLM_COMPILER_VC4			0x01000020
-#define GLM_COMPILER_VC5			0x01000030
-#define GLM_COMPILER_VC6			0x01000040
-#define GLM_COMPILER_VC2002			0x01000050
-#define GLM_COMPILER_VC2003			0x01000060
-#define GLM_COMPILER_VC2005			0x01000070
-#define GLM_COMPILER_VC2008			0x01000080
-#define GLM_COMPILER_VC2010			0x01000090
-#define GLM_COMPILER_VC2011			0x010000A0
-
-// GCC defines
-#define GLM_COMPILER_GCC            0x02000000
-#define GLM_COMPILER_GCC_LLVM       0x02000001
-#define GLM_COMPILER_GCC_CLANG      0x02000002
-#define GLM_COMPILER_GCC30			0x02000010
-#define GLM_COMPILER_GCC31			0x02000020
-#define GLM_COMPILER_GCC32			0x02000030
-#define GLM_COMPILER_GCC33			0x02000040
-#define GLM_COMPILER_GCC34			0x02000050
-#define GLM_COMPILER_GCC35			0x02000060
-#define GLM_COMPILER_GCC40			0x02000070
-#define GLM_COMPILER_GCC41			0x02000080
-#define GLM_COMPILER_GCC42			0x02000090
-#define GLM_COMPILER_GCC43			0x020000A0
-#define GLM_COMPILER_GCC44			0x020000B0
-#define GLM_COMPILER_GCC45			0x020000C0
-#define GLM_COMPILER_GCC46			0x020000D0
-#define GLM_COMPILER_GCC47			0x020000E0
-#define GLM_COMPILER_GCC48			0x020000F0
-#define GLM_COMPILER_GCC49			0x02000100
-#define GLM_COMPILER_GCC50			0x02000200
-
-// G++ command line to display defined
-// echo "" | g++ -E -dM -x c++ - | sort
-
-// Borland C++ defines. How to identify BC?
-#define GLM_COMPILER_BC				0x04000000
-#define GLM_COMPILER_BCB4			0x04000100
-#define GLM_COMPILER_BCB5			0x04000200
-#define GLM_COMPILER_BCB6			0x04000300
-//#define GLM_COMPILER_BCBX			0x04000400 // What's the version value?
-#define GLM_COMPILER_BCB2009		0x04000500
-
-// CodeWarrior
-#define GLM_COMPILER_CODEWARRIOR	0x08000000
-
-// CUDA
-#define GLM_COMPILER_CUDA           0x10000000
-#define GLM_COMPILER_CUDA30			0x10000010
-#define GLM_COMPILER_CUDA31			0x10000020
-#define GLM_COMPILER_CUDA32			0x10000030
-#define GLM_COMPILER_CUDA40			0x10000040
-
-// Clang
-#define GLM_COMPILER_CLANG          0x20000000
-#define GLM_COMPILER_CLANG26		0x20000010
-#define GLM_COMPILER_CLANG27		0x20000020
-#define GLM_COMPILER_CLANG28		0x20000030
-#define GLM_COMPILER_CLANG29		0x20000040
-
-// LLVM GCC
-#define GLM_COMPILER_LLVM_GCC		0x40000000
-*/
 int test_compiler()
 {
 	int Error = 0;
@@ -89,12 +20,98 @@ int test_compiler()
 	case GLM_COMPILER_VC:
 		std::cout << "GLM_COMPILER_VC" << std::endl;	
 		break;
+		case GLM_COMPILER_VC2:
+			std::cout << "GLM_COMPILER_VC2" << std::endl;	
+			break;
+		case GLM_COMPILER_VC4:
+			std::cout << "GLM_COMPILER_VC4" << std::endl;	
+			break;
+		case GLM_COMPILER_VC5:
+			std::cout << "GLM_COMPILER_VC5" << std::endl;	
+			break;
+		case GLM_COMPILER_VC6:
+			std::cout << "GLM_COMPILER_VC6" << std::endl;	
+			break;
+		case GLM_COMPILER_VC2002:
+			std::cout << "GLM_COMPILER_VC2002" << std::endl;	
+			break;
+		case GLM_COMPILER_VC2003:
+			std::cout << "GLM_COMPILER_VC2003" << std::endl;	
+			break;
+		case GLM_COMPILER_VC2005:
+			std::cout << "GLM_COMPILER_VC2005" << std::endl;	
+			break;
+		case GLM_COMPILER_VC2008:
+			std::cout << "GLM_COMPILER_VC2008" << std::endl;	
+			break;
+		case GLM_COMPILER_VC2010:
+			std::cout << "GLM_COMPILER_VC2010" << std::endl;	
+			break;
+		case GLM_COMPILER_VC2011:
+			std::cout << "GLM_COMPILER_VC2011" << std::endl;	
+			break;
+
 	case GLM_COMPILER_GCC:
 		std::cout << "GLM_COMPILER_GCC" << std::endl;	
 		break;
+		case GLM_COMPILER_GCC30:
+			std::cout << "GLM_COMPILER_GCC30" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC31:
+			std::cout << "GLM_COMPILER_GCC31" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC32:
+			std::cout << "GLM_COMPILER_GCC32" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC33:
+			std::cout << "GLM_COMPILER_GCC33" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC34:
+			std::cout << "GLM_COMPILER_GCC34" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC35:
+			std::cout << "GLM_COMPILER_GCC35" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC40:
+			std::cout << "GLM_COMPILER_GCC40" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC41:
+			std::cout << "GLM_COMPILER_GCC41" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC42:
+			std::cout << "GLM_COMPILER_GCC42" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC43:
+			std::cout << "GLM_COMPILER_GCC43" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC44:
+			std::cout << "GLM_COMPILER_GCC44" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC45:
+			std::cout << "GLM_COMPILER_GCC45" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC46:
+			std::cout << "GLM_COMPILER_GCC46" << std::endl;	
+			break;
+		case GLM_COMPILER_GCC47:
+			std::cout << "GLM_COMPILER_GCC47" << std::endl;	
+			break;
+			
 	case GLM_COMPILER_BC:
 		std::cout << "GLM_COMPILER_BC" << std::endl;	
 		break;
+		case GLM_COMPILER_BCB4:
+			std::cout << "GLM_COMPILER_BCB4" << std::endl;	
+			break;
+		case GLM_COMPILER_BCB5:
+			std::cout << "GLM_COMPILER_BCB5" << std::endl;	
+			break;
+		case GLM_COMPILER_BCB6:
+			std::cout << "GLM_COMPILER_BCB6" << std::endl;	
+			break;
+		case GLM_COMPILER_BCB2009:
+			std::cout << "GLM_COMPILER_BCB2009" << std::endl;	
+			break;
 	case GLM_COMPILER_CODEWARRIOR:
 		std::cout << "GLM_COMPILER_CODEWARRIOR" << std::endl;	
 		break;
@@ -104,12 +121,24 @@ int test_compiler()
 	case GLM_COMPILER_CLANG:
 		std::cout << "GLM_COMPILER_CLANG" << std::endl;		
 		break;
+		case GLM_COMPILER_CLANG26:
+			std::cout << "GLM_COMPILER_CLANG26" << std::endl;		
+			break;
+		case GLM_COMPILER_CLANG27:
+			std::cout << "GLM_COMPILER_CLANG27" << std::endl;		
+			break;
+		case GLM_COMPILER_CLANG28:
+			std::cout << "GLM_COMPILER_CLANG28" << std::endl;		
+			break;
+		case GLM_COMPILER_CLANG29:
+			std::cout << "GLM_COMPILER_CLANG29" << std::endl;		
+			break;
 	case GLM_COMPILER_LLVM_GCC:
 		std::cout << "GLM_COMPILER_LLVM_GCC" << std::endl;		
 		break;
 	default:
 		std::cout << "Undetected compiler" << std::endl;
-		break;
+		Error += 1;
 	}
 	
 	return Error;
@@ -121,6 +150,11 @@ int test_model()
 	
 	Error += ((sizeof(void*) == 4) && (GLM_MODEL == GLM_MODEL_32)) || ((sizeof(void*) == 8) && (GLM_MODEL == GLM_MODEL_64)) ? 0 : 1;
 	
+	if(GLM_MODEL == GLM_MODEL_32)
+		std::cout << "GLM_MODEL_32" << std::endl;	
+	else if(GLM_MODEL == GLM_MODEL_64)
+		std::cout << "GLM_MODEL_64" << std::endl;	
+	
 	return Error;
 }