Bladeren bron

Updated GTX_multiple

Christophe Riccio 11 jaren geleden
bovenliggende
commit
23d2735e03
2 gewijzigde bestanden met toevoegingen van 98 en 59 verwijderingen
  1. 24 0
      glm/gtx/multiple.hpp
  2. 74 59
      glm/gtx/multiple.inl

+ 24 - 0
glm/gtx/multiple.hpp

@@ -62,6 +62,18 @@ namespace glm
 		genType Source,
 		genType Multiple);
 
+	/// Higher multiple number of Source.
+	///
+	/// @tparam genType Floating-point or integer scalar or vector types.
+	/// @param Source 
+	/// @param Multiple Must be a null or positive value
+	///
+	/// @see gtx_multiple
+	template <typename T, precision P, template <typename, precision> class vecType>
+	GLM_FUNC_DECL vecType<T, P> higherMultiple(
+		vecType<T, P> const & Source,
+		vecType<T, P> const & Multiple);
+
 	/// Lower multiple number of Source.
 	///
 	/// @tparam genType Floating-point or integer scalar or vector types.
@@ -74,6 +86,18 @@ namespace glm
 		genType Source,
 		genType Multiple);
 
+	/// Lower multiple number of Source.
+	///
+	/// @tparam genType Floating-point or integer scalar or vector types.
+	/// @param Source 
+	/// @param Multiple Must be a null or positive value
+	///
+	/// @see gtx_multiple
+	template <typename T, precision P, template <typename, precision> class vecType>
+	GLM_FUNC_DECL vecType<T, P> lowerMultiple(
+		vecType<T, P> const & Source,
+		vecType<T, P> const & Multiple);
+
 	/// @}
 }//namespace glm
 

+ 74 - 59
glm/gtx/multiple.inl

@@ -13,66 +13,111 @@
 namespace glm{
 namespace detail
 {
-	template <bool Signed>
-	struct higherMultiple
+	template <bool is_float, bool is_signed>
+	struct compute_higherMultiple{};
+
+	template <>
+	struct compute_higherMultiple<true, true>
 	{
 		template <typename genType>
-		GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple)
+		GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
 		{
 			if(Source > genType(0))
 			{
 				genType Tmp = Source - genType(1);
-				return Tmp + (Multiple - (Tmp % Multiple));
+				return Tmp + (Multiple - std::fmod(Tmp, Multiple));
 			}
 			else
-				return Source + (-Source % Multiple);
+				return Source + std::fmod(-Source, Multiple);
 		}
 	};
 
 	template <>
-	struct higherMultiple<false>
+	struct compute_higherMultiple<false, false>
 	{
 		template <typename genType>
-		GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple)
+		GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
 		{
 			genType Tmp = Source - genType(1);
 			return Tmp + (Multiple - (Tmp % Multiple));
 		}
 	};
-}//namespace detail
 
-	//////////////////////
-	// higherMultiple
+	template <>
+	struct compute_higherMultiple<false, true>
+	{
+		template <typename genType>
+		GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
+		{
+			if(Source > genType(0))
+			{
+				genType Tmp = Source - genType(1);
+				return Tmp + (Multiple - (Tmp % Multiple));
+			}
+			else
+				return Source + (-Source % Multiple);
+		}
+	};
 
-	template <typename genType>
-	GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple)
+	template <bool is_float, bool is_signed>
+	struct compute_lowerMultiple{};
+
+	template <>
+	struct compute_lowerMultiple<true, true>
 	{
-		detail::higherMultiple<std::numeric_limits<genType>::is_signed> Compute;
-		return Compute(Source, Multiple);
-	}
+		template <typename genType>
+		GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
+		{
+			if(Source >= genType(0))
+				return Source - std::fmod(Source, Multiple);
+			else
+			{
+				genType Tmp = Source + genType(1);
+				return Tmp - std::fmod(Tmp, Multiple) - Multiple;
+			}
+		}
+	};
 
 	template <>
-	GLM_FUNC_QUALIFIER float higherMultiple(float Source, float Multiple)
+	struct compute_lowerMultiple<false, false>
 	{
-		if(Source > float(0))
+		template <typename genType>
+		GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
 		{
-			float Tmp = Source - float(1);
-			return Tmp + (Multiple - std::fmod(Tmp, Multiple));
+			if(Source >= genType(0))
+				return Source - Source % Multiple;
+			else
+			{
+				genType Tmp = Source + genType(1);
+				return Tmp - Tmp % Multiple - Multiple;
+			}
 		}
-		else
-			return Source + std::fmod(-Source, Multiple);
-	}
+	};
 
 	template <>
-	GLM_FUNC_QUALIFIER double higherMultiple(double Source, double Multiple)
+	struct compute_lowerMultiple<false, true>
 	{
-		if(Source > double(0))
+		template <typename genType>
+		GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple)
 		{
-			double Tmp = Source - double(1);
-			return Tmp + (Multiple - std::fmod(Tmp, Multiple));
+			if(Source >= genType(0))
+				return Source - Source % Multiple;
+			else
+			{
+				genType Tmp = Source + genType(1);
+				return Tmp - Tmp % Multiple - Multiple;
+			}
 		}
-		else
-			return Source + std::fmod(-Source, Multiple);
+	};
+}//namespace detail
+
+	//////////////////////
+	// higherMultiple
+
+	template <typename genType>
+	GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple)
+	{
+		return detail::compute_higherMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple);
 	}
 
 	template <typename T, precision P, template <typename, precision> class vecType>
@@ -87,37 +132,7 @@ namespace detail
 	template <typename genType>
 	GLM_FUNC_QUALIFIER genType lowerMultiple(genType Source, genType Multiple)
 	{
-		if(Source >= genType(0))
-			return Source - Source % Multiple;
-		else
-		{
-			genType Tmp = Source + genType(1);
-			return Tmp - Tmp % Multiple - Multiple;
-		}
-	}
-
-	template <>
-	GLM_FUNC_QUALIFIER float lowerMultiple(float Source, float Multiple)
-	{
-		if(Source >= float(0))
-			return Source - std::fmod(Source, Multiple);
-		else
-		{
-			float Tmp = Source + float(1);
-			return Tmp - std::fmod(Tmp, Multiple) - Multiple;
-		}
-	}
-
-	template <>
-	GLM_FUNC_QUALIFIER double lowerMultiple(double Source, double Multiple)
-	{
-		if (Source >= double(0))
-			return Source - std::fmod(Source, Multiple);
-		else
-		{
-			double Tmp = Source + double(1);
-			return Tmp - std::fmod(Tmp, Multiple) - Multiple;
-		}
+		return detail::compute_lowerMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple);
 	}
 
 	template <typename T, precision P, template <typename, precision> class vecType>