-inline unsigned get_type_size(DataType t) { return t&0xFF; }
-inline bool is_matrix(DataType t) { return (t>>14)&3; }
-inline bool is_vector(DataType t) { return !is_matrix(t) && ((t>>12)&3); }
+inline std::size_t get_type_size(DataType t) { return t&0xFF; }
+inline bool is_float(DataType t) { return t&0x200; }
+inline bool is_matrix(DataType t) { return t&0xC000; }
+inline bool is_vector(DataType t) { return !is_matrix(t) && (t&0x3000); }
+inline bool is_image(DataType t) { return t&0x70000; }
+inline bool is_sampled_image(DataType t) { return t&0x100000; }
+
+inline DataType get_matrix_column_type(DataType t)
+{
+ unsigned cols = ((t&0xC000)>>14)+1;
+ return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/cols));
+}
+
+inline DataType get_element_type(DataType t)
+{
+ unsigned elems = (((t&0xC000)>>14)+1)*(((t&0x3000)>>12)+1);
+ 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; };