Initial idea

This commit is contained in:
Abit Gray 2024-11-25 13:23:40 +01:00 committed by Christophe
parent 69b130c162
commit 8ca503edef
9 changed files with 368 additions and 15 deletions

View file

@ -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")

View file

@ -127,7 +127,7 @@ $(function() {
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment">// C++ Version</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<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>&#160;<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>&#160; </div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="preprocessor">#define GLM_LANG_CXX98_FLAG (1 &lt;&lt; 1)</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;<span class="preprocessor">#define GLM_LANG_CXX03_FLAG (1 &lt;&lt; 2)</span></div>
@ -138,6 +138,7 @@ $(function() {
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="preprocessor">#define GLM_LANG_CXX20_FLAG (1 &lt;&lt; 7)</span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<span class="preprocessor">#define GLM_LANG_CXXMS_FLAG (1 &lt;&lt; 8)</span></div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="preprocessor">#define GLM_LANG_CXXGNU_FLAG (1 &lt;&lt; 9)</span></div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="preprocessor">#define GLM_LANG_CXX23_FLAG (1 &lt;&lt; 10)</span></div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; </div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<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>&#160;<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>&#160;<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>&#160;<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>&#160;<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>&#160;<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>&#160;<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>&#160;<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>&#160; </div>
@ -159,6 +161,9 @@ $(function() {
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; </div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="preprocessor">#if (defined(GLM_FORCE_CXX_UNKNOWN))</span></div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="preprocessor"># define GLM_LANG 0</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="preprocessor">#elif defined(GLM_FORCE_CXX23)</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<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>&#160;<span class="preprocessor"># define GLM_LANG_STL11_FORCED</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;<span class="preprocessor">#elif defined(GLM_FORCE_CXX20)</span></div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;<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>&#160;<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>&#160;<span class="preprocessor"># define GLM_LANG_PLATFORM 0</span></div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;<span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="preprocessor"># if __cplusplus &gt; 201703L || GLM_LANG_PLATFORM &gt; 201703L</span></div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160;<span class="preprocessor"># if __cplusplus &gt; 202002L || GLM_LANG_PLATFORM &gt; 202002L</span></div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;<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>&#160;<span class="preprocessor"># elif __cplusplus &gt; 201703L || GLM_LANG_PLATFORM &gt; 201703L</span></div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;<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>&#160;<span class="preprocessor"># elif __cplusplus == 201703L || GLM_LANG_PLATFORM == 201703L</span></div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<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>&#160;<span class="preprocessor"># pragma message (GLM_STR(GLM_VERSION_MESSAGE))</span></div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; </div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <span class="comment">// Report C++ language</span></div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160;<span class="preprocessor"># if (GLM_LANG &amp; GLM_LANG_CXX20_FLAG) &amp;&amp; (GLM_LANG &amp; GLM_LANG_EXT)</span></div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160;<span class="preprocessor"># if (GLM_LANG &amp; GLM_LANG_CXX23_FLAG) &amp;&amp; (GLM_LANG &amp; GLM_LANG_EXT)</span></div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160;<span class="preprocessor"># pragma message(&quot;GLM: C++ 23 with extensions&quot;)</span></div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160;<span class="preprocessor"># elif (GLM_LANG &amp; GLM_LANG_CXX23_FLAG)</span></div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160;<span class="preprocessor"># pragma message(&quot;GLM: C++ 2B&quot;)</span></div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160;<span class="preprocessor"># elif (GLM_LANG &amp; GLM_LANG_CXX20_FLAG) &amp;&amp; (GLM_LANG &amp; GLM_LANG_EXT)</span></div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160;<span class="preprocessor"># pragma message(&quot;GLM: C++ 20 with extensions&quot;)</span></div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160;<span class="preprocessor"># elif (GLM_LANG &amp; GLM_LANG_CXX20_FLAG)</span></div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160;<span class="preprocessor"># pragma message(&quot;GLM: C++ 2A&quot;)</span></div>

View file

@ -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")

View file

@ -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))

View file

@ -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
View 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

View file

@ -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

View file

@ -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
View 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