From 0ceb9e93947d1f6f6d113800a7af48fac1450020 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 9 Jan 2015 23:57:22 +0100 Subject: [PATCH 1/6] packing function clean up #292 --- glm/detail/func_packing.hpp | 12 ++++++------ glm/detail/func_packing.inl | 31 ++++++++++++++----------------- glm/gtc/packing.inl | 10 ++++------ 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/glm/detail/func_packing.hpp b/glm/detail/func_packing.hpp index e2b25725..bce0fe52 100644 --- a/glm/detail/func_packing.hpp +++ b/glm/detail/func_packing.hpp @@ -111,7 +111,7 @@ namespace glm /// /// @see GLSL unpackUnorm2x16 man page /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - GLM_FUNC_DECL vec2 unpackUnorm2x16(uint const & p); + GLM_FUNC_DECL vec2 unpackUnorm2x16(uint p); /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. @@ -124,7 +124,7 @@ namespace glm /// /// @see GLSL unpackSnorm2x16 man page /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - GLM_FUNC_DECL vec2 unpackSnorm2x16(uint const & p); + GLM_FUNC_DECL vec2 unpackSnorm2x16(uint p); /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. @@ -137,7 +137,7 @@ namespace glm /// /// @see GLSL unpackUnorm4x8 man page /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - GLM_FUNC_DECL vec4 unpackUnorm4x8(uint const & p); + GLM_FUNC_DECL vec4 unpackUnorm4x8(uint p); /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. @@ -150,7 +150,7 @@ namespace glm /// /// @see GLSL unpackSnorm4x8 man page /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - GLM_FUNC_DECL vec4 unpackSnorm4x8(uint const & p); + GLM_FUNC_DECL vec4 unpackSnorm4x8(uint p); /// Returns a double-precision value obtained by packing the components of v into a 64-bit value. /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. @@ -169,7 +169,7 @@ namespace glm /// /// @see GLSL unpackDouble2x32 man page /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - GLM_FUNC_DECL uvec2 unpackDouble2x32(double const & v); + GLM_FUNC_DECL uvec2 unpackDouble2x32(double v); /// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector /// to the 16-bit floating-point representation found in the OpenGL Specification, @@ -189,7 +189,7 @@ namespace glm /// /// @see GLSL unpackHalf2x16 man page /// @see GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions - GLM_FUNC_DECL vec2 unpackHalf2x16(uint const & v); + GLM_FUNC_DECL vec2 unpackHalf2x16(uint v); /// @} }//namespace glm diff --git a/glm/detail/func_packing.inl b/glm/detail/func_packing.inl index e0d476e4..3132a279 100644 --- a/glm/detail/func_packing.inl +++ b/glm/detail/func_packing.inl @@ -38,13 +38,11 @@ namespace glm { GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const & v) { - u16vec2 Topack(round(clamp(v, 0.0f, 1.0f) * 65535.0f)); - // return reinterpret_cast(Topack); - uint* ptr(reinterpret_cast(&Topack)); - return *ptr; + u16vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 65535.0f)); + return reinterpret_cast(Topack); } - GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint const & p) + GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint p) { vec2 Unpack(reinterpret_cast(p)); return Unpack * float(1.5259021896696421759365224689097e-5); // 1.0 / 65535.0 @@ -56,7 +54,7 @@ namespace glm return reinterpret_cast(Topack); } - GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint const & p) + GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint p) { vec2 const Unpack(reinterpret_cast(p)); return clamp( @@ -70,7 +68,7 @@ namespace glm return reinterpret_cast(Topack); } - GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint const & p) + GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint p) { vec4 const Unpack(reinterpret_cast(p)); return Unpack * float(0.0039215686274509803921568627451); // 1 / 255 @@ -78,13 +76,13 @@ namespace glm GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const & v) { - i8vec4 Topack(round(clamp(v ,-1.0f, 1.0f) * 127.0f)); - return reinterpret_cast(Topack); + i8vec4 const Topack(round(clamp(v ,-1.0f, 1.0f) * 127.0f)); + return reinterpret_cast(Topack); } - GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint const & p) + GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p) { - vec4 Unpack(reinterpret_cast(p)); + vec4 const Unpack(reinterpret_cast(p)); return clamp( Unpack * 0.0078740157480315f, // 1.0f / 127.0f -1.0f, 1.0f); @@ -95,24 +93,23 @@ namespace glm return reinterpret_cast(v); } - GLM_FUNC_QUALIFIER uvec2 unpackDouble2x32(double const & v) + GLM_FUNC_QUALIFIER uvec2 unpackDouble2x32(double v) { return reinterpret_cast(v); } GLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const & v) { - i16vec2 Unpack( + i16vec2 const Unpack( detail::toFloat16(v.x), detail::toFloat16(v.y)); - uint * Result = reinterpret_cast(&Unpack); - return *Result; + return reinterpret_cast(Unpack); } - GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint const & v) + GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint v) { - i16vec2 Unpack(reinterpret_cast(v)); + i16vec2 const Unpack(reinterpret_cast(v)); return vec2( detail::toFloat32(Unpack.x), diff --git a/glm/gtc/packing.inl b/glm/gtc/packing.inl index 5d243977..58b1d59b 100644 --- a/glm/gtc/packing.inl +++ b/glm/gtc/packing.inl @@ -263,7 +263,7 @@ namespace detail GLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const & v) { - u8vec2 Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f)); + u8vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f)); return reinterpret_cast(Topack); } @@ -354,15 +354,13 @@ namespace detail GLM_FUNC_QUALIFIER uint16 packHalf1x16(float v) { - int16 Topack = detail::toFloat16(v); - uint16* Packed = reinterpret_cast(&Topack); - return *Packed; + int16 const Topack(detail::toFloat16(v)); + return reinterpret_cast(Topack); } GLM_FUNC_QUALIFIER float unpackHalf1x16(uint16 v) { - int16* Unpack = reinterpret_cast(const_cast(&v)); - return detail::toFloat32(*Unpack); + return detail::toFloat32(reinterpret_cast(v)); } GLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const & v) From fe0de059b80c3a4e62ca832e15cd38a9fe691395 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 10 Jan 2015 13:44:57 +0100 Subject: [PATCH 2/6] Cleaned up C++11 feature detections --- glm/detail/setup.hpp | 210 ++++++++++++++++++++++++++----------------- 1 file changed, 128 insertions(+), 82 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index 2053cbc7..be60e051 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -496,113 +496,159 @@ /////////////////////////////////////////////////////////////////////////////////// // Has of C++ features -#ifndef __has_include -# define __has_include(x) 0 // Compatibility with non-clang compilers. -#endif -#ifndef __has_feature -# define __has_feature(x) 0 // Compatibility with non-clang compilers. -#endif -#ifndef __has_extension -# define __has_extension __has_feature // Compatibility with pre-3.0 compilers. -#endif - // http://clang.llvm.org/cxx_status.html // http://gcc.gnu.org/projects/cxx0x.html // http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx -// N1720 -#define GLM_HAS_CXX11_STL !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ((GLM_PLATFORM != GLM_PLATFORM_ANDROID) && (\ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013)) || \ - __has_include(<__config>))) +#if GLM_PLATFORM != GLM_PLATFORM_ANDROID +# define GLM_HAS_CXX11_STL 0 +#elif GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_CXX11_STL __has_include(<__config>) +#else +# define GLM_HAS_CXX11_STL ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && \ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +#endif // N1720 -#define GLM_HAS_STATIC_ASSERT !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2010)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC43)) || \ - __has_feature(cxx_static_assert)) +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_STATIC_ASSERT __has_feature(cxx_static_assert) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_STATIC_ASSERT 1 +#else +# define GLM_HAS_STATIC_ASSERT (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC43)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2010))) +#endif // N1988 -#define GLM_HAS_EXTENDED_INTEGER_TYPE !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2012)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC43)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_LLVM) && (GLM_COMPILER >= GLM_COMPILER_LLVM30)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_APPLE_CLANG) && (GLM_COMPILER >= GLM_COMPILER_APPLE_CLANG40))) +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_EXTENDED_INTEGER_TYPE 1 +#else +# define GLM_HAS_EXTENDED_INTEGER_TYPE (\ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2012)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC43)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_LLVM) && (GLM_COMPILER >= GLM_COMPILER_LLVM30)) || \ + ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_APPLE_CLANG) && (GLM_COMPILER >= GLM_COMPILER_APPLE_CLANG40))) +#endif // N2235 -#define GLM_HAS_CONSTEXPR !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ - __has_feature(cxx_constexpr)) +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_CONSTEXPR __has_feature(cxx_constexpr) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_CONSTEXPR 1 +#else +# define GLM_HAS_CONSTEXPR (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2015))) +#endif // N2672 -#define GLM_HAS_INITIALIZER_LISTS !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC44)) || \ - __has_feature(cxx_generalized_initializers)) +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_INITIALIZER_LISTS __has_feature(cxx_generalized_initializers) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_INITIALIZER_LISTS 1 +#else +# define GLM_HAS_INITIALIZER_LISTS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC44)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +#endif // N2544 Unrestricted unions -#define GLM_HAS_UNRESTRICTED_UNIONS !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - (GLM_LANG & GLM_LANG_CXXMS_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ - __has_feature(cxx_unrestricted_unions)) +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions) +#elif GLM_LANG & (GLM_LANG_CXX11_FLAG | GLM_LANG_CXXMS_FLAG) +# define GLM_HAS_UNRESTRICTED_UNIONS 1 +#else +# define GLM_HAS_UNRESTRICTED_UNIONS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46))) +#endif // N2346 -#define GLM_HAS_DEFAULTED_FUNCTIONS !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC44)) || \ - __has_feature(cxx_defaulted_functions)) +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_DEFAULTED_FUNCTIONS __has_feature(cxx_defaulted_functions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_DEFAULTED_FUNCTIONS 1 +#else +# define GLM_HAS_DEFAULTED_FUNCTIONS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC44)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +#endif // N2118 -#define GLM_HAS_RVALUE_REFERENCES !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2012)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC43)) || \ - __has_feature(cxx_rvalue_references)) +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_RVALUE_REFERENCES __has_feature(cxx_rvalue_references) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_RVALUE_REFERENCES 1 +#else +# define GLM_HAS_RVALUE_REFERENCES (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC43)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2012))) +#endif -// N2437 -#define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC45)) || \ - __has_feature(cxx_explicit_conversions)) +// N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS __has_feature(cxx_explicit_conversions) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1 +#else +# define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC45)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +#endif -#define GLM_HAS_STL_ARRAY !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2010)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC43))) +// N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_TEMPLATE_ALIASES __has_feature(cxx_alias_templates) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_TEMPLATE_ALIASES 1 +#else +# define GLM_HAS_TEMPLATE_ALIASES (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC47)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL12_1)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +#endif -#define GLM_HAS_TEMPLATE_ALIASES !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) || \ - __has_feature(cxx_alias_templates)) +// N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html +#if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) +# define GLM_HAS_RANGE_FOR __has_feature(cxx_range_for) +#elif GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_RANGE_FOR 1 +#else +# define GLM_HAS_RANGE_FOR (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ + ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL13)) || \ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2012))) +#endif -#define GLM_HAS_RANGE_FOR !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2012)) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ - __has_feature(cxx_range_for)) +// +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_ASSIGNABLE 1 +#else +# define GLM_HAS_ASSIGNABLE (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC49))) +#endif -#define GLM_HAS_ASSIGNABLE !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC49))) - -#define GLM_HAS_TRIVIAL_QUERIES !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ +// +#define GLM_HAS_TRIVIAL_QUERIES ( \ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) -#define GLM_HAS_MAKE_SIGNED !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && ( \ - (GLM_LANG & GLM_LANG_CXX11_FLAG) || \ - ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +// +#if GLM_LANG & GLM_LANG_CXX11_FLAG +# define GLM_HAS_MAKE_SIGNED 1 +#else +# define GLM_HAS_MAKE_SIGNED (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ + ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) +#endif -#define GLM_HAS_BITSCAN_WINDOWS ( \ - (GLM_ARCH != GLM_ARCH_PURE) && \ - (GLM_PLATFORM & GLM_PLATFORM_WINDOWS) && \ - (GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_LLVM | GLM_COMPILER_INTEL))) +// +#if GLM_ARCH == GLM_ARCH_PURE +# define GLM_HAS_BITSCAN_WINDOWS 0 +#else +# define GLM_HAS_BITSCAN_WINDOWS (GLM_PLATFORM & GLM_PLATFORM_WINDOWS) && (\ + (GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_LLVM | GLM_COMPILER_INTEL)) +#endif // OpenMP #ifdef _OPENMP @@ -624,7 +670,7 @@ #endif // Not standard -#define GLM_HAS_ANONYMOUS_UNION !defined(GLM_FORCE_CXX98) && !defined(GLM_FORCE_CXX03) && (GLM_LANG & GLM_LANG_CXXMS_FLAG) +#define GLM_HAS_ANONYMOUS_UNION (GLM_LANG & GLM_LANG_CXXMS_FLAG) /////////////////////////////////////////////////////////////////////////////////// // Platform From 4eec569f92ba83505c955e7ab360d9db78fbcde5 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 10 Jan 2015 13:45:41 +0100 Subject: [PATCH 3/6] Disabled GTX_scalar_multiplication for GCC, failing to build tests #242 --- glm/detail/setup.hpp | 2 +- glm/gtx/scalar_multiplication.hpp | 4 ++-- readme.txt | 2 ++ test/gtx/gtx_scalar_multiplication.cpp | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index be60e051..623a8e05 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -605,8 +605,8 @@ # define GLM_HAS_TEMPLATE_ALIASES 1 #else # define GLM_HAS_TEMPLATE_ALIASES (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ - ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC47)) || \ ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL12_1)) || \ + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC47)) || \ ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2013))) #endif diff --git a/glm/gtx/scalar_multiplication.hpp b/glm/gtx/scalar_multiplication.hpp index 0de66f24..5f6c4d9e 100644 --- a/glm/gtx/scalar_multiplication.hpp +++ b/glm/gtx/scalar_multiplication.hpp @@ -43,8 +43,8 @@ #include "../detail/setup.hpp" -#if !GLM_HAS_TEMPLATE_ALIASES -# error "GLM_GTX_scalar_multiplication requires C++11 suppport or alias templates" +#if !GLM_HAS_TEMPLATE_ALIASES && !(GLM_COMPILER & GLM_COMPILER_GCC) +# error "GLM_GTX_scalar_multiplication requires C++11 suppport or alias templates and if not support for GCC" #endif #include "../vec2.hpp" diff --git a/readme.txt b/readme.txt index 1b990718..51107f91 100644 --- a/readme.txt +++ b/readme.txt @@ -72,6 +72,7 @@ Features: Improvements: - Removed assert for perspective with zFar < zNear #298 - Added Visual Studio natvis support for vec1, quat and dualqual types +- Cleaned up C++11 feature detections Fixes: - Fixed faceforward build #289 @@ -81,6 +82,7 @@ Fixes: - Fixed warnings in F2x11_1x10 packing function in GTC_packing #295 - Fixed Visual Studio natvis support for vec4 #288 - Fixed GTC_packing *pack*norm*x* build and added tests #292 +- Disabled GTX_scalar_multiplication for GCC #242 ================================================================================ GLM 0.9.6.1: 2014-12-10 diff --git a/test/gtx/gtx_scalar_multiplication.cpp b/test/gtx/gtx_scalar_multiplication.cpp index 19325653..93ae5546 100644 --- a/test/gtx/gtx_scalar_multiplication.cpp +++ b/test/gtx/gtx_scalar_multiplication.cpp @@ -31,7 +31,7 @@ #include -#if GLM_HAS_TEMPLATE_ALIASES +#if GLM_HAS_TEMPLATE_ALIASES & !(GLM_COMPILER & GLM_COMPILER_GCC) #include int main() From 387f931febf953ff1dcde198245e51ef2fd7b80f Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 25 Jan 2015 21:06:07 +0100 Subject: [PATCH 4/6] Fixed Visual C++ 2015 constexpr errors: Disabled only partial support --- glm/detail/setup.hpp | 3 +-- readme.txt | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index 623a8e05..3bfb2190 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -539,8 +539,7 @@ # define GLM_HAS_CONSTEXPR 1 #else # define GLM_HAS_CONSTEXPR (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ - ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \ - ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2015))) + ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46))) #endif // N2672 diff --git a/readme.txt b/readme.txt index 51107f91..c79b2003 100644 --- a/readme.txt +++ b/readme.txt @@ -82,7 +82,8 @@ Fixes: - Fixed warnings in F2x11_1x10 packing function in GTC_packing #295 - Fixed Visual Studio natvis support for vec4 #288 - Fixed GTC_packing *pack*norm*x* build and added tests #292 -- Disabled GTX_scalar_multiplication for GCC #242 +- Disabled GTX_scalar_multiplication for GCC, failing to build tests #242 +- Fixed Visual C++ 2015 constexpr errors: Disabled only partial support ================================================================================ GLM 0.9.6.1: 2014-12-10 From fad35c4e87d3e72b8911266c9fac5c04f5ee70f7 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 25 Jan 2015 21:09:17 +0100 Subject: [PATCH 5/6] Removed temp file that should not have been commited --- doc/~$glm.docx | Bin 162 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/~$glm.docx diff --git a/doc/~$glm.docx b/doc/~$glm.docx deleted file mode 100644 index db258f22db6d93b1e6a0f4d44f071ed6430b92e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 pcmZQzpcZKV|DPG%EJmmRE06|Z28IR)5DDXh Date: Mon, 9 Feb 2015 22:02:03 +0100 Subject: [PATCH 6/6] Added partial constexpr support detection --- glm/detail/setup.hpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp index 3bfb2190..115a2d28 100644 --- a/glm/detail/setup.hpp +++ b/glm/detail/setup.hpp @@ -535,11 +535,14 @@ // N2235 #if GLM_COMPILER & (GLM_COMPILER_LLVM | GLM_COMPILER_APPLE_CLANG) # define GLM_HAS_CONSTEXPR __has_feature(cxx_constexpr) +# define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR #elif GLM_LANG & GLM_LANG_CXX11_FLAG # define GLM_HAS_CONSTEXPR 1 +# define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR #else # define GLM_HAS_CONSTEXPR (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\ ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46))) +# define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR || ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2015)) #endif // N2672 @@ -930,6 +933,29 @@ namespace detail # endif #endif//GLM_MESSAGE +/////////////////////////////////////////////////////////////////////////////////// +// countof + +#ifndef __has_feature +# define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif + +#if GLM_HAS_CONSTEXPR_PARTIAL + namespace glm + { + template + constexpr std::size_t countof(T const (&)[N]) + { + return N; + } + }//namespace glm +# define GLM_COUNTOF(arr) glm::countof(arr) +#elif _MSC_VER +# define GLM_COUNTOF(arr) _countof(arr) +#else +# define GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0]) +#endif + /////////////////////////////////////////////////////////////////////////////////// // Uninitialize constructors