]> git.tdb.fi Git - libs/gl.git/commitdiff
Add a TypeTraits struct to convert C++ types into DataType enum values
authorMikko Rasa <tdb@tdb.fi>
Tue, 28 Sep 2021 22:42:30 +0000 (01:42 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 28 Sep 2021 22:49:13 +0000 (01:49 +0300)
source/core/datatype.h

index a0b80e35772cc303ef88f9f2d586199cc739f799..a911561358c2c845d529f44e67aa090e49639f77 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef MSP_GL_DATATYPE_H_
 #define MSP_GL_DATATYPE_H_
 
+#include <msp/linal/matrix.h>
+#include <msp/linal/vector.h>
 #include "gl.h"
 
 namespace Msp {
@@ -108,6 +110,29 @@ inline DataType get_element_type(DataType t)
        return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/elems));
 }
 
+template<typename T> struct TypeTraits;
+template<> struct TypeTraits<bool> { static const DataType type = BOOL; };
+template<> struct TypeTraits<char> { static const DataType type = BYTE; };
+template<> struct TypeTraits<unsigned char> { static const DataType type = UNSIGNED_BYTE; };
+template<> struct TypeTraits<short> { static const DataType type = SHORT; };
+template<> struct TypeTraits<unsigned short> { static const DataType type = UNSIGNED_SHORT; };
+template<> struct TypeTraits<int> { static const DataType type = INT; };
+template<> struct TypeTraits<unsigned> { static const DataType type = UNSIGNED_INT; };
+template<> struct TypeTraits<float> { static const DataType type = FLOAT; };
+template<> struct TypeTraits<double> { static const DataType type = DOUBLE; };
+
+template<typename T, unsigned N>
+struct TypeTraits<LinAl::Vector<T, N>>
+{
+       static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N) | ((N-1)<<12));
+};
+
+template<typename T, unsigned N, unsigned M>
+struct TypeTraits<LinAl::Matrix<T, N, M>>
+{
+       static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N*M) | ((N-1)<<12) | ((M-1)<<14));
+};
+
 GLenum get_gl_type(DataType);
 DataType from_gl_type(GLenum);
 
@@ -116,4 +141,6 @@ void require_type(DataType);
 } // namespace GL
 } // namespace Msp
 
+#include "datatype_backend.h"
+
 #endif