Browse Source

- Improved constexpr for constant functions coverage #198

Christophe Riccio 10 years ago
parent
commit
1d266efe20
5 changed files with 64 additions and 61 deletions
  1. 2 2
      glm/detail/func_trigonometric.hpp
  2. 2 2
      glm/detail/func_trigonometric.inl
  3. 29 29
      glm/gtc/constants.hpp
  4. 28 28
      glm/gtc/constants.inl
  5. 3 0
      readme.md

+ 2 - 2
glm/detail/func_trigonometric.hpp

@@ -58,7 +58,7 @@ namespace glm
 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml">GLSL radians man page</a>
 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml">GLSL radians man page</a>
 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a>
 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a>
 	template <typename T, precision P, template <typename, precision> class vecType>
 	template <typename T, precision P, template <typename, precision> class vecType>
-	GLM_FUNC_DECL vecType<T, P> radians(vecType<T, P> const & degrees);
+	GLM_FUNC_DECL GLM_CONSTEXPR vecType<T, P> radians(vecType<T, P> const & degrees);
 
 
 	/// Converts radians to degrees and returns the result.
 	/// Converts radians to degrees and returns the result.
 	///
 	///
@@ -67,7 +67,7 @@ namespace glm
 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml">GLSL degrees man page</a>
 	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml">GLSL degrees man page</a>
 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a>
 	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a>
 	template <typename T, precision P, template <typename, precision> class vecType>
 	template <typename T, precision P, template <typename, precision> class vecType>
-	GLM_FUNC_DECL vecType<T, P> degrees(vecType<T, P> const & radians);
+	GLM_FUNC_DECL GLM_CONSTEXPR vecType<T, P> degrees(vecType<T, P> const & radians);
 
 
 	/// The standard trigonometric sine function. 
 	/// The standard trigonometric sine function. 
 	/// The values returned by this function will range from [-1, 1].
 	/// The values returned by this function will range from [-1, 1].

+ 2 - 2
glm/detail/func_trigonometric.inl

@@ -38,7 +38,7 @@ namespace glm
 {
 {
 	// radians
 	// radians
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType radians(genType degrees)
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType radians(genType degrees)
 	{
 	{
 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'radians' only accept floating-point input");
 		GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'radians' only accept floating-point input");
 
 
@@ -46,7 +46,7 @@ namespace glm
 	}
 	}
 
 
 	template <typename T, precision P, template <typename, precision> class vecType>
 	template <typename T, precision P, template <typename, precision> class vecType>
-	GLM_FUNC_QUALIFIER vecType<T, P> radians(vecType<T, P> const & v)
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vecType<T, P> radians(vecType<T, P> const & v)
 	{
 	{
 		return detail::functor1<T, T, P, vecType>::call(radians, v);
 		return detail::functor1<T, T, P, vecType>::call(radians, v);
 	}
 	}

+ 29 - 29
glm/gtc/constants.hpp

@@ -57,147 +57,147 @@ namespace glm
 	/// Return the epsilon constant for floating point types.
 	/// Return the epsilon constant for floating point types.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType epsilon();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon();
 
 
 	/// Return 0.
 	/// Return 0.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType zero();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType zero();
 
 
 	/// Return 1.
 	/// Return 1.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType one();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType one();
 
 
 	/// Return the pi constant.
 	/// Return the pi constant.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType pi();
 
 
 	/// Return pi * 2.
 	/// Return pi * 2.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType two_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType two_pi();
 
 
 	/// Return square root of pi.
 	/// Return square root of pi.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType root_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType root_pi();
 
 
 	/// Return pi / 2.
 	/// Return pi / 2.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType half_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType half_pi();
 
 
 	/// Return pi / 2 * 3.
 	/// Return pi / 2 * 3.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType three_over_two_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType three_over_two_pi();
 
 
 	/// Return pi / 4.
 	/// Return pi / 4.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType quarter_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType quarter_pi();
 
 
 	/// Return 1 / pi.
 	/// Return 1 / pi.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType one_over_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_pi();
 
 
 	/// Return 1 / (pi * 2).
 	/// Return 1 / (pi * 2).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType one_over_two_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_two_pi();
 
 
 	/// Return 2 / pi.
 	/// Return 2 / pi.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType two_over_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_pi();
 
 
 	/// Return 4 / pi.
 	/// Return 4 / pi.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType four_over_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType four_over_pi();
 
 
 	/// Return 2 / sqrt(pi).
 	/// Return 2 / sqrt(pi).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType two_over_root_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType two_over_root_pi();
 
 
 	/// Return 1 / sqrt(2).
 	/// Return 1 / sqrt(2).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType one_over_root_two();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType one_over_root_two();
 
 
 	/// Return sqrt(pi / 2).
 	/// Return sqrt(pi / 2).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType root_half_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType root_half_pi();
 
 
 	/// Return sqrt(2 * pi).
 	/// Return sqrt(2 * pi).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType root_two_pi();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType root_two_pi();
 
 
 	/// Return sqrt(ln(4)).
 	/// Return sqrt(ln(4)).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType root_ln_four();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType root_ln_four();
 
 
 	/// Return e constant.
 	/// Return e constant.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType e();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType e();
 
 
 	/// Return Euler's constant.
 	/// Return Euler's constant.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType euler();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType euler();
 
 
 	/// Return sqrt(2).
 	/// Return sqrt(2).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType root_two();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType root_two();
 
 
 	/// Return sqrt(3).
 	/// Return sqrt(3).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType root_three();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType root_three();
 
 
 	/// Return sqrt(5).
 	/// Return sqrt(5).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType root_five();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType root_five();
 
 
 	/// Return ln(2).
 	/// Return ln(2).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType ln_two();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType ln_two();
 
 
 	/// Return ln(10).
 	/// Return ln(10).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType ln_ten();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ten();
 
 
 	/// Return ln(ln(2)).
 	/// Return ln(ln(2)).
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType ln_ln_two();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType ln_ln_two();
 
 
 	/// Return 1 / 3.
 	/// Return 1 / 3.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType third();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType third();
 
 
 	/// Return 2 / 3.
 	/// Return 2 / 3.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType two_thirds();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType two_thirds();
 
 
 	/// Return the golden ratio constant.
 	/// Return the golden ratio constant.
 	/// @see gtc_constants
 	/// @see gtc_constants
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_DECL genType golden_ratio();
+	GLM_FUNC_DECL GLM_CONSTEXPR genType golden_ratio();
 
 
 	/// @}
 	/// @}
 } //namespace glm
 } //namespace glm

+ 28 - 28
glm/gtc/constants.inl

@@ -35,151 +35,151 @@
 namespace glm
 namespace glm
 {
 {
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType epsilon()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType epsilon()
 	{
 	{
 		return std::numeric_limits<genType>::epsilon();
 		return std::numeric_limits<genType>::epsilon();
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType zero()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType zero()
 	{
 	{
 		return genType(0);
 		return genType(0);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType one()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one()
 	{
 	{
 		return genType(1);
 		return genType(1);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType pi()
 	{
 	{
 		return genType(3.14159265358979323846264338327950288);
 		return genType(3.14159265358979323846264338327950288);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType two_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_pi()
 	{
 	{
 		return genType(6.28318530717958647692528676655900576);
 		return genType(6.28318530717958647692528676655900576);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType root_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_pi()
 	{
 	{
 		return genType(1.772453850905516027);
 		return genType(1.772453850905516027);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType half_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType half_pi()
 	{
 	{
 		return genType(1.57079632679489661923132169163975144);
 		return genType(1.57079632679489661923132169163975144);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType three_over_two_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType three_over_two_pi()
 	{
 	{
 		return genType(4.71238898038468985769396507491925432);           
 		return genType(4.71238898038468985769396507491925432);           
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType quarter_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType quarter_pi()
 	{
 	{
 		return genType(0.785398163397448309615660845819875721);
 		return genType(0.785398163397448309615660845819875721);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType one_over_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_pi()
 	{
 	{
 		return genType(0.318309886183790671537767526745028724);
 		return genType(0.318309886183790671537767526745028724);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType one_over_two_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_two_pi()
 	{
 	{
 		return genType(0.159154943091895335768883763372514362);
 		return genType(0.159154943091895335768883763372514362);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType two_over_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_pi()
 	{
 	{
 		return genType(0.636619772367581343075535053490057448);
 		return genType(0.636619772367581343075535053490057448);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType four_over_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType four_over_pi()
 	{
 	{
 		return genType(1.273239544735162686151070106980114898);
 		return genType(1.273239544735162686151070106980114898);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType two_over_root_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_over_root_pi()
 	{
 	{
 		return genType(1.12837916709551257389615890312154517);
 		return genType(1.12837916709551257389615890312154517);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType one_over_root_two()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType one_over_root_two()
 	{
 	{
 		return genType(0.707106781186547524400844362104849039);
 		return genType(0.707106781186547524400844362104849039);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType root_half_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_half_pi()
 	{
 	{
 		return genType(1.253314137315500251);
 		return genType(1.253314137315500251);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType root_two_pi()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two_pi()
 	{
 	{
 		return genType(2.506628274631000502);
 		return genType(2.506628274631000502);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType root_ln_four()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_ln_four()
 	{
 	{
 		return genType(1.17741002251547469);
 		return genType(1.17741002251547469);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType e()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType e()
 	{
 	{
 		return genType(2.71828182845904523536);
 		return genType(2.71828182845904523536);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType euler()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType euler()
 	{
 	{
 		return genType(0.577215664901532860606);
 		return genType(0.577215664901532860606);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType root_two()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_two()
 	{
 	{
 		return genType(1.41421356237309504880168872420969808);
 		return genType(1.41421356237309504880168872420969808);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType root_three()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_three()
 	{
 	{
 		return genType(1.73205080756887729352744634150587236);
 		return genType(1.73205080756887729352744634150587236);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType root_five()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType root_five()
 	{
 	{
 		return genType(2.23606797749978969640917366873127623);
 		return genType(2.23606797749978969640917366873127623);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType ln_two()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_two()
 	{
 	{
 		return genType(0.693147180559945309417232121458176568);
 		return genType(0.693147180559945309417232121458176568);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType ln_ten()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType ln_ten()
 	{
 	{
 		return genType(2.30258509299404568401799145468436421);
 		return genType(2.30258509299404568401799145468436421);
 	}
 	}
@@ -191,19 +191,19 @@ namespace glm
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType third()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType third()
 	{
 	{
 		return genType(0.3333333333333333333333333333333333333333);
 		return genType(0.3333333333333333333333333333333333333333);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType two_thirds()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType two_thirds()
 	{
 	{
 		return genType(0.666666666666666666666666666666666666667);
 		return genType(0.666666666666666666666666666666666666667);
 	}
 	}
 
 
 	template <typename genType>
 	template <typename genType>
-	GLM_FUNC_QUALIFIER genType golden_ratio()
+	GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType golden_ratio()
 	{
 	{
 		return genType(1.61803398874989484820458683436563811);
 		return genType(1.61803398874989484820458683436563811);
 	}
 	}

+ 3 - 0
readme.md

@@ -51,6 +51,9 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate)
 ## Release notes
 ## Release notes
 
 
 #### [GLM 0.9.7.1](https://github.com/g-truc/glm/releases/latest) - 2015-XX-XX
 #### [GLM 0.9.7.1](https://github.com/g-truc/glm/releases/latest) - 2015-XX-XX
+##### Improvements:
+- Improved constexpr for constant functions coverage #198
+
 ##### Fixes:
 ##### Fixes:
 - Fixed strict alignment warnings #235 #370
 - Fixed strict alignment warnings #235 #370
 - Fixed link errors on compilers not supported default function #377
 - Fixed link errors on compilers not supported default function #377