+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));
+};