mirror of
https://github.com/g-truc/glm.git
synced 2025-04-10 23:31:51 +00:00
Initial idea
This commit is contained in:
parent
69b130c162
commit
8ca503edef
9 changed files with 368 additions and 15 deletions
|
@ -32,10 +32,23 @@ option(GLM_ENABLE_CXX_11 "Enable C++ 11" OFF)
|
|||
option(GLM_ENABLE_CXX_14 "Enable C++ 14" OFF)
|
||||
option(GLM_ENABLE_CXX_17 "Enable C++ 17" OFF)
|
||||
option(GLM_ENABLE_CXX_20 "Enable C++ 20" OFF)
|
||||
option(GLM_ENABLE_CXX_23 "Enable C++ 23" OFF)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if(GLM_ENABLE_CXX_20)
|
||||
if(GLM_ENABLE_CXX_23)
|
||||
set(CMAKE_CXX_STANDARD 23)
|
||||
add_definitions(-DGLM_FORCE_CXX23)
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
message(STATUS "GLM: Disable -Wc++98-compat warnings")
|
||||
add_compile_options(-Wno-c++98-compat)
|
||||
add_compile_options(-Wno-c++98-compat-pedantic)
|
||||
endif()
|
||||
if(NOT GLM_QUIET)
|
||||
message(STATUS "GLM: Build with C++23 features")
|
||||
endif()
|
||||
|
||||
elseif(GLM_ENABLE_CXX_20)
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
add_definitions(-DGLM_FORCE_CXX20)
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
|
|
|
@ -127,7 +127,7 @@ $(function() {
|
|||
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  </div>
|
||||
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment">// C++ Version</span></div>
|
||||
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  </div>
|
||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment">// User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14, GLM_FORCE_CXX17, GLM_FORCE_CXX2A</span></div>
|
||||
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment">// User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14, GLM_FORCE_CXX17, GLM_FORCE_CXX2A, GLM_FORCE_CXX23</span></div>
|
||||
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  </div>
|
||||
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="preprocessor">#define GLM_LANG_CXX98_FLAG (1 << 1)</span></div>
|
||||
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="preprocessor">#define GLM_LANG_CXX03_FLAG (1 << 2)</span></div>
|
||||
|
@ -138,6 +138,7 @@ $(function() {
|
|||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="preprocessor">#define GLM_LANG_CXX20_FLAG (1 << 7)</span></div>
|
||||
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="preprocessor">#define GLM_LANG_CXXMS_FLAG (1 << 8)</span></div>
|
||||
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="preprocessor">#define GLM_LANG_CXXGNU_FLAG (1 << 9)</span></div>
|
||||
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="preprocessor">#define GLM_LANG_CXX23_FLAG (1 << 10)</span></div>
|
||||
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  </div>
|
||||
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="preprocessor">#define GLM_LANG_CXX98 GLM_LANG_CXX98_FLAG</span></div>
|
||||
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="preprocessor">#define GLM_LANG_CXX03 (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG)</span></div>
|
||||
|
@ -146,6 +147,7 @@ $(function() {
|
|||
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="preprocessor">#define GLM_LANG_CXX14 (GLM_LANG_CXX11 | GLM_LANG_CXX14_FLAG)</span></div>
|
||||
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="preprocessor">#define GLM_LANG_CXX17 (GLM_LANG_CXX14 | GLM_LANG_CXX17_FLAG)</span></div>
|
||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="preprocessor">#define GLM_LANG_CXX20 (GLM_LANG_CXX17 | GLM_LANG_CXX20_FLAG)</span></div>
|
||||
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="preprocessor">#define GLM_LANG_CXX23 (GLM_LANG_CXX20 | GLM_LANG_CXX23_FLAG)</span></div>
|
||||
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="preprocessor">#define GLM_LANG_CXXMS GLM_LANG_CXXMS_FLAG</span></div>
|
||||
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="preprocessor">#define GLM_LANG_CXXGNU GLM_LANG_CXXGNU_FLAG</span></div>
|
||||
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  </div>
|
||||
|
@ -159,6 +161,9 @@ $(function() {
|
|||
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  </div>
|
||||
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="preprocessor">#if (defined(GLM_FORCE_CXX_UNKNOWN))</span></div>
|
||||
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="preprocessor"># define GLM_LANG 0</span></div>
|
||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="preprocessor">#elif defined(GLM_FORCE_CXX23)</span></div>
|
||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="preprocessor"># define GLM_LANG (GLM_LANG_CXX23 | GLM_LANG_EXT)</span></div>
|
||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="preprocessor"># define GLM_LANG_STL11_FORCED</span></div>
|
||||
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="preprocessor">#elif defined(GLM_FORCE_CXX20)</span></div>
|
||||
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="preprocessor"># define GLM_LANG (GLM_LANG_CXX20 | GLM_LANG_EXT)</span></div>
|
||||
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> <span class="preprocessor"># define GLM_LANG_STL11_FORCED</span></div>
|
||||
|
@ -192,7 +197,9 @@ $(function() {
|
|||
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span> <span class="preprocessor"># define GLM_LANG_PLATFORM 0</span></div>
|
||||
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span> <span class="preprocessor"># endif</span></div>
|
||||
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  </div>
|
||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor"># if __cplusplus > 201703L || GLM_LANG_PLATFORM > 201703L</span></div>
|
||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor"># if __cplusplus > 202002L || GLM_LANG_PLATFORM > 202002L</span></div>
|
||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="preprocessor"># define GLM_LANG (GLM_LANG_CXX23 | GLM_LANG_EXT)</span></div>
|
||||
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="preprocessor"># elif __cplusplus > 201703L || GLM_LANG_PLATFORM > 201703L</span></div>
|
||||
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="preprocessor"># define GLM_LANG (GLM_LANG_CXX20 | GLM_LANG_EXT)</span></div>
|
||||
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="preprocessor"># elif __cplusplus == 201703L || GLM_LANG_PLATFORM == 201703L</span></div>
|
||||
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="preprocessor"># define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT)</span></div>
|
||||
|
@ -1010,7 +1017,11 @@ $(function() {
|
|||
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span> <span class="preprocessor"># pragma message (GLM_STR(GLM_VERSION_MESSAGE))</span></div>
|
||||
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  </div>
|
||||
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="comment">// Report C++ language</span></div>
|
||||
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="preprocessor"># if (GLM_LANG & GLM_LANG_CXX20_FLAG) && (GLM_LANG & GLM_LANG_EXT)</span></div>
|
||||
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="preprocessor"># if (GLM_LANG & GLM_LANG_CXX23_FLAG) && (GLM_LANG & GLM_LANG_EXT)</span></div>
|
||||
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span> <span class="preprocessor"># pragma message("GLM: C++ 23 with extensions")</span></div>
|
||||
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span> <span class="preprocessor"># elif (GLM_LANG & GLM_LANG_CXX23_FLAG)</span></div>
|
||||
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="preprocessor"># pragma message("GLM: C++ 2B")</span></div>
|
||||
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="preprocessor"># elif (GLM_LANG & GLM_LANG_CXX20_FLAG) && (GLM_LANG & GLM_LANG_EXT)</span></div>
|
||||
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span> <span class="preprocessor"># pragma message("GLM: C++ 20 with extensions")</span></div>
|
||||
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span> <span class="preprocessor"># elif (GLM_LANG & GLM_LANG_CXX20_FLAG)</span></div>
|
||||
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="preprocessor"># pragma message("GLM: C++ 2A")</span></div>
|
||||
|
|
|
@ -70,6 +70,7 @@
|
|||
#define GLM_LANG_CXX20_FLAG (1 << 7)
|
||||
#define GLM_LANG_CXXMS_FLAG (1 << 8)
|
||||
#define GLM_LANG_CXXGNU_FLAG (1 << 9)
|
||||
#define GLM_LANG_CXX23_FLAG (1 << 10)
|
||||
|
||||
#define GLM_LANG_CXX98 GLM_LANG_CXX98_FLAG
|
||||
#define GLM_LANG_CXX03 (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG)
|
||||
|
@ -78,6 +79,7 @@
|
|||
#define GLM_LANG_CXX14 (GLM_LANG_CXX11 | GLM_LANG_CXX14_FLAG)
|
||||
#define GLM_LANG_CXX17 (GLM_LANG_CXX14 | GLM_LANG_CXX17_FLAG)
|
||||
#define GLM_LANG_CXX20 (GLM_LANG_CXX17 | GLM_LANG_CXX20_FLAG)
|
||||
#define GLM_LANG_CXX23 (GLM_LANG_CXX20 | GLM_LANG_CXX23_FLAG)
|
||||
#define GLM_LANG_CXXMS GLM_LANG_CXXMS_FLAG
|
||||
#define GLM_LANG_CXXGNU GLM_LANG_CXXGNU_FLAG
|
||||
|
||||
|
@ -91,6 +93,9 @@
|
|||
|
||||
#if (defined(GLM_FORCE_CXX_UNKNOWN))
|
||||
# define GLM_LANG 0
|
||||
#elif defined(GLM_FORCE_CXX23)
|
||||
# define GLM_LANG (GLM_LANG_CXX23 | GLM_LANG_EXT)
|
||||
# define GLM_LANG_STL11_FORCED
|
||||
#elif defined(GLM_FORCE_CXX20)
|
||||
# define GLM_LANG (GLM_LANG_CXX20 | GLM_LANG_EXT)
|
||||
# define GLM_LANG_STL11_FORCED
|
||||
|
@ -124,7 +129,9 @@
|
|||
# define GLM_LANG_PLATFORM 0
|
||||
# endif
|
||||
|
||||
# if __cplusplus > 201703L || GLM_LANG_PLATFORM > 201703L
|
||||
# if __cplusplus > 202002L || GLM_LANG_PLATFORM > 202002L
|
||||
# define GLM_LANG (GLM_LANG_CXX23 | GLM_LANG_EXT)
|
||||
# elif __cplusplus > 201703L || GLM_LANG_PLATFORM > 201703L
|
||||
# define GLM_LANG (GLM_LANG_CXX20 | GLM_LANG_EXT)
|
||||
# elif __cplusplus == 201703L || GLM_LANG_PLATFORM == 201703L
|
||||
# define GLM_LANG (GLM_LANG_CXX17 | GLM_LANG_EXT)
|
||||
|
@ -980,7 +987,11 @@ namespace detail
|
|||
# pragma message ("GLM: version " GLM_STR(GLM_VERSION_MAJOR) "." GLM_STR(GLM_VERSION_MINOR) "." GLM_STR(GLM_VERSION_PATCH))
|
||||
|
||||
// Report C++ language
|
||||
# if (GLM_LANG & GLM_LANG_CXX20_FLAG) && (GLM_LANG & GLM_LANG_EXT)
|
||||
# if (GLM_LANG & GLM_LANG_CXX23_FLAG) && (GLM_LANG & GLM_LANG_EXT)
|
||||
# pragma message("GLM: C++ 23 with extensions")
|
||||
# elif (GLM_LANG & GLM_LANG_CXX23_FLAG)
|
||||
# pragma message("GLM: C++ 2B")
|
||||
# elif (GLM_LANG & GLM_LANG_CXX20_FLAG) && (GLM_LANG & GLM_LANG_EXT)
|
||||
# pragma message("GLM: C++ 20 with extensions")
|
||||
# elif (GLM_LANG & GLM_LANG_CXX20_FLAG)
|
||||
# pragma message("GLM: C++ 2A")
|
||||
|
|
|
@ -245,6 +245,7 @@
|
|||
#include "./gtx/raw_data.hpp"
|
||||
#include "./gtx/rotate_normalized_axis.hpp"
|
||||
#include "./gtx/rotate_vector.hpp"
|
||||
#include "./gtx/span.hpp"
|
||||
#include "./gtx/spline.hpp"
|
||||
#include "./gtx/std_based_type.hpp"
|
||||
#if !((GLM_COMPILER & GLM_COMPILER_CUDA) || (GLM_COMPILER & GLM_COMPILER_HIP))
|
||||
|
|
|
@ -35,55 +35,61 @@ namespace glm
|
|||
# endif
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<1, T, Q> const& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components(vec<1, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<2, T, Q> const& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components(vec<2, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<3, T, Q> const& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components(vec<3, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<4, T, Q> const& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components(vec<4, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components(qua<T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
inline length_t components(genType const& m)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components(genType const& m)
|
||||
{
|
||||
return m.length() * m[0].length();
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
inline typename genType::value_type const * begin(genType const& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename genType::value_type const * begin(genType const& v)
|
||||
{
|
||||
return value_ptr(v);
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
inline typename genType::value_type const * end(genType const& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename genType::value_type const * end(genType const& v)
|
||||
{
|
||||
return begin(v) + components(v);
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
inline typename genType::value_type * begin(genType& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename genType::value_type * begin(genType& v)
|
||||
{
|
||||
return value_ptr(v);
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
inline typename genType::value_type * end(genType& v)
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename genType::value_type * end(genType& v)
|
||||
{
|
||||
return begin(v) + components(v);
|
||||
}
|
||||
|
|
203
glm/gtx/span.hpp
Normal file
203
glm/gtx/span.hpp
Normal file
|
@ -0,0 +1,203 @@
|
|||
/// @ref gtx_span
|
||||
/// @file glm/gtx/span.hpp
|
||||
/// @author Abit Gray
|
||||
///
|
||||
/// @defgroup gtx_span GLM_GTX_span
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Include <glm/gtx/span.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Defines functions to convert glm types to std::valarray or view them using C++20 std::span and C++23 std::mdspan.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../detail/setup.hpp"
|
||||
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_span is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#elif GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_span extension included")
|
||||
#endif
|
||||
|
||||
#if !(GLM_LANG & GLM_LANG_CXX11)
|
||||
// This requirement is due to `std::enable_if`
|
||||
# error "GLM_GTX_span requiers at least C++11, using C++20 or C++23 is recommended for full functionality"
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# if (GLM_LANG & GLM_LANG_CXX20) && defined(__cpp_lib_span) && __cpp_lib_span >= 202002L
|
||||
# pragma message("GLM: GLM_GTX_span extension will include std::span")
|
||||
# endif
|
||||
# if (GLM_LANG & GLM_LANG_CXX23) && defined(__cpp_lib_mdspan) && __cpp_lib_mdspan >= 202207L
|
||||
# pragma message("GLM: GLM_GTX_span extension will include std::mdspan")
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "../gtc/type_precision.hpp"
|
||||
#include "../gtc/type_ptr.hpp"
|
||||
|
||||
#include <valarray>
|
||||
#include <type_traits>
|
||||
|
||||
#if GLM_LANG & GLM_LANG_CXX20
|
||||
// Feature testing
|
||||
# include <version>
|
||||
|
||||
// C++20 std::span
|
||||
# if defined(__cpp_lib_span) && __cpp_lib_span >= 202002L
|
||||
# include <span>
|
||||
# endif
|
||||
|
||||
// C++23 std::mdspan
|
||||
# if (GLM_LANG & GLM_LANG_CXX23) && defined(__cpp_lib_mdspan) && __cpp_lib_mdspan >= 202207L
|
||||
# include <mdspan>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_span
|
||||
/// @{
|
||||
|
||||
template<typename T>
|
||||
struct is_vec : std::false_type {};
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
struct is_vec<vec<L, T, Q>> : std::true_type {};
|
||||
|
||||
template<typename T>
|
||||
struct is_quat : std::false_type {};
|
||||
template<typename T, qualifier Q>
|
||||
struct is_quat<qua<T, Q>> : std::true_type {};
|
||||
|
||||
template<typename T>
|
||||
struct is_mat : std::false_type {};
|
||||
template<length_t L1, length_t L2, typename T, qualifier Q>
|
||||
struct is_mat<mat<L1, L2, T, Q>> : std::true_type {};
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX17)
|
||||
template<typename T>
|
||||
inline constexpr bool is_vec_v = is_vec<T>::value;
|
||||
template<typename T>
|
||||
inline constexpr bool is_quat_v = is_quat<T>::value;
|
||||
template<typename T>
|
||||
inline constexpr bool is_mat_v = is_mat<T>::value;
|
||||
#endif
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_vec<T>::value || is_quat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_vec<T>::value || is_quat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components()
|
||||
{
|
||||
return T::length();
|
||||
}
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_mat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_mat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components()
|
||||
{
|
||||
return T::length() * T::col_type::length();
|
||||
}
|
||||
# if GLM_COMPILER & GLM_COMPILER_VC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable : 4100) // unreferenced formal parameter
|
||||
# endif
|
||||
|
||||
/// Utility function if you don't have the type and dont use `decltype` (it is from C++11 so this function won't exist for earlier anyway)
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_vec<T>::value || is_quat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_vec<T>::value || is_quat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t components(T const&)
|
||||
{
|
||||
return components<T>();
|
||||
}
|
||||
# if GLM_COMPILER & GLM_COMPILER_VC
|
||||
# pragma warning(pop)
|
||||
# endif
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_vec<T>::value || is_quat<T>::value || is_mat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_vec<T>::value || is_quat<T>::value || is_mat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::valarray<typename T::value_type> valarray(T const& v)
|
||||
{
|
||||
return std::valarray<typename T::value_type>(value_ptr(v), components<T>());
|
||||
}
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX20) && defined(__cpp_lib_span) && __cpp_lib_span >= 202002L
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_vec<T>::value || is_quat<T>::value || is_mat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_vec<T>::value || is_quat<T>::value || is_mat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::span<typename T::value_type> span(T & v)
|
||||
{
|
||||
return std::span<typename T::value_type>(value_ptr(v), components<T>());
|
||||
}
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_vec<T>::value || is_quat<T>::value || is_mat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_vec<T>::value || is_quat<T>::value || is_mat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::span<const typename T::value_type> span(T const& v)
|
||||
{
|
||||
return std::span<const typename T::value_type>(value_ptr(v), components<T>());
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX23) && defined(__cpp_lib_mdspan) && __cpp_lib_mdspan >= 202207L
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_vec<T>::value || is_quat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_vec<T>::value || is_quat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::mdspan<typename T::value_type> span(T & v)
|
||||
{
|
||||
return std::mdspan<typename T::value_type>(value_ptr(v), components<T>());
|
||||
}
|
||||
|
||||
#if (GLM_LANG & GLM_LANG_CXX20)
|
||||
template<typename T>
|
||||
requires is_vec<T>::value || is_quat<T>::value
|
||||
#else
|
||||
template<typename T, typename = typename std::enable_if<is_vec<T>::value || is_quat<T>::value>::type>
|
||||
#endif
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::mdspan<const typename T::value_type> span(T const& v)
|
||||
{
|
||||
return std::mdspan<const typename T::value_type>(value_ptr(v), components<T>());
|
||||
}
|
||||
|
||||
template<length_t L1, length_t L2, typename T, qualifier Q>
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR auto mdspan(mat<L1, L2, T, Q> & m)
|
||||
{
|
||||
return std::mdspan<T>(value_ptr(m), L1, L2);
|
||||
}
|
||||
|
||||
template<length_t L1, length_t L2, typename T, qualifier Q>
|
||||
GLM_NODISCARD GLM_FUNC_QUALIFIER GLM_CONSTEXPR auto mdspan(mat<L1, L2, T, Q> const& m)
|
||||
{
|
||||
return std::mdspan<const T>(value_ptr(m), L1, L2);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
|
@ -1,6 +1,9 @@
|
|||
#ifdef GLM_FORCE_CXX_UNKNOWN
|
||||
#undef GLM_FORCE_CXX_UNKNOWN
|
||||
#endif
|
||||
#ifdef GLM_FORCE_CXX23
|
||||
#undef GLM_FORCE_CXX23
|
||||
#endif
|
||||
#ifdef GLM_FORCE_CXX20
|
||||
#undef GLM_FORCE_CXX20
|
||||
#endif
|
||||
|
|
|
@ -36,6 +36,15 @@ static int test_vec()
|
|||
return Error;
|
||||
}
|
||||
|
||||
static int test_quat()
|
||||
{
|
||||
int Error = 0;
|
||||
|
||||
//TODO
|
||||
|
||||
return Error;
|
||||
}
|
||||
|
||||
static int test_mat()
|
||||
{
|
||||
int Error = 0;
|
||||
|
@ -69,6 +78,7 @@ int main()
|
|||
{
|
||||
int Error = 0;
|
||||
Error += test_vec();
|
||||
Error += test_quat();
|
||||
Error += test_mat();
|
||||
return Error;
|
||||
}
|
||||
|
|
95
test/gtx/gtx_span.cpp
Normal file
95
test/gtx/gtx_span.cpp
Normal file
|
@ -0,0 +1,95 @@
|
|||
#include <glm/gtc/constants.hpp>
|
||||
#include <glm/ext/scalar_relational.hpp>
|
||||
#include <glm/ext/vector_relational.hpp>
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
#if GLM_HAS_RANGE_FOR
|
||||
|
||||
#define GLM_ENABLE_EXPERIMENTAL
|
||||
#include <glm/gtx/span.hpp>
|
||||
|
||||
static int test_vec()
|
||||
{
|
||||
int Error = 0;
|
||||
|
||||
//TODO
|
||||
/*{
|
||||
glm::ivec3 const v(1, 2, 3);
|
||||
|
||||
int count = 0;
|
||||
glm::ivec3 Result(0);
|
||||
for(int x : v)
|
||||
{
|
||||
Result[count] = x;
|
||||
count++;
|
||||
}
|
||||
Error += count == 3 ? 0 : 1;
|
||||
Error += v == Result ? 0 : 1;
|
||||
}
|
||||
|
||||
{
|
||||
glm::ivec3 v(1, 2, 3);
|
||||
for(int& x : v)
|
||||
x = 0;
|
||||
Error += glm::all(glm::equal(v, glm::ivec3(0))) ? 0 : 1;
|
||||
}*/
|
||||
|
||||
return Error;
|
||||
}
|
||||
|
||||
static int test_quat()
|
||||
{
|
||||
int Error = 0;
|
||||
|
||||
//TODO
|
||||
|
||||
return Error;
|
||||
}
|
||||
|
||||
static int test_mat()
|
||||
{
|
||||
int Error = 0;
|
||||
|
||||
//TODO
|
||||
/*{
|
||||
glm::mat4x3 m(1.0f);
|
||||
|
||||
int count = 0;
|
||||
float Sum = 0.0f;
|
||||
for(float x : m)
|
||||
{
|
||||
count++;
|
||||
Sum += x;
|
||||
}
|
||||
Error += count == 12 ? 0 : 1;
|
||||
Error += glm::equal(Sum, 3.0f, 0.001f) ? 0 : 1;
|
||||
}
|
||||
|
||||
{
|
||||
glm::mat4x3 m(1.0f);
|
||||
|
||||
for (float& x : m) { x = 0; }
|
||||
glm::vec4 v(1, 1, 1, 1);
|
||||
Error += glm::all(glm::equal(m*v, glm::vec3(0, 0, 0), glm::epsilon<float>())) ? 0 : 1;
|
||||
}*/
|
||||
|
||||
return Error;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int Error = 0;
|
||||
Error += test_vec();
|
||||
Error += test_quat();
|
||||
Error += test_mat();
|
||||
return Error;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif//GLM_HAS_RANGE_FOR
|
Loading…
Add table
Reference in a new issue