36 #ifndef OPENIMAGEIO_TYPEDESC_H
37 #define OPENIMAGEIO_TYPEDESC_H
43 # pragma warning (disable : 4127)
76 struct OIIO_API TypeDesc {
79 enum BASETYPE { UNKNOWN, NONE,
80 UCHAR, UINT8=UCHAR, CHAR, INT8=CHAR,
81 USHORT, UINT16=USHORT, SHORT, INT16=SHORT,
82 UINT, UINT32=UINT, INT, INT32=INT,
83 ULONGLONG, UINT64=ULONGLONG, LONGLONG, INT64=LONGLONG,
84 HALF, FLOAT, DOUBLE, STRING, PTR, LASTBASE };
87 enum AGGREGATE { SCALAR=1, VEC2=2, VEC3=3, VEC4=4, MATRIX44=16 };
92 enum VECSEMANTICS { NOXFORM=0, COLOR, POINT, VECTOR, NORMAL };
94 unsigned char basetype;
95 unsigned char aggregate;
96 unsigned char vecsemantics;
97 unsigned char reserved;
102 TypeDesc (BASETYPE btype=UNKNOWN, AGGREGATE agg=SCALAR,
103 VECSEMANTICS xform=NOXFORM)
104 : basetype(static_cast<unsigned char>(btype)),
105 aggregate(static_cast<unsigned char>(agg)),
106 vecsemantics(static_cast<unsigned char>(xform)), reserved(0),
112 TypeDesc (BASETYPE btype,
int arraylength)
113 : basetype(static_cast<unsigned char>(btype)),
114 aggregate(SCALAR), vecsemantics(NOXFORM),
115 reserved(0), arraylen(arraylength)
120 TypeDesc (BASETYPE btype, AGGREGATE agg,
int arraylength)
121 : basetype(static_cast<unsigned char>(btype)),
122 aggregate(static_cast<unsigned char>(agg)),
123 vecsemantics(NOXFORM), reserved(0),
124 arraylen(arraylength)
129 TypeDesc (BASETYPE btype, AGGREGATE agg,
130 VECSEMANTICS xform,
int arraylength)
131 : basetype(static_cast<unsigned char>(btype)),
132 aggregate(static_cast<unsigned char>(agg)),
133 vecsemantics(static_cast<unsigned char>(xform)),
134 reserved(0), arraylen(arraylength)
139 TypeDesc (
const char *typestring);
143 const char *c_str()
const;
145 friend std::ostream& operator<< (std::ostream& o, TypeDesc t) {
146 o << t.c_str();
return o;
151 size_t numelements ()
const {
152 return (arraylen >= 1 ? arraylen : 1);
157 size_t size ()
const {
158 size_t a = (size_t) (arraylen > 0 ? arraylen : 1);
159 if (
sizeof(
size_t) >
sizeof(int)) {
161 return a * elementsize();
164 unsigned long long s = (
unsigned long long) a * elementsize();
165 const size_t toobig = std::numeric_limits<size_t>::max();
166 return s < toobig ? (size_t)s : toobig;
172 TypeDesc elementtype ()
const {
173 TypeDesc t (*
this); t.arraylen = 0;
return t;
178 size_t elementsize ()
const {
return aggregate * basesize(); }
186 size_t basesize ()
const;
192 size_t fromstring (
const char *typestring);
196 bool operator== (
const TypeDesc &t)
const {
197 return basetype == t.basetype && aggregate == t.aggregate &&
198 vecsemantics == t.vecsemantics && arraylen == t.arraylen;
203 bool operator!= (
const TypeDesc &t)
const {
return ! (*
this == t); }
207 friend bool operator== (
const TypeDesc &t, BASETYPE b) {
208 return (BASETYPE)t.basetype == b && (AGGREGATE)t.aggregate == SCALAR && t.arraylen == 0;
210 friend bool operator== (BASETYPE b,
const TypeDesc &t) {
211 return (BASETYPE)t.basetype == b && (AGGREGATE)t.aggregate == SCALAR && t.arraylen == 0;
216 friend bool operator!= (
const TypeDesc &t, BASETYPE b) {
217 return (BASETYPE)t.basetype != b || (AGGREGATE)t.aggregate != SCALAR || t.arraylen != 0;
219 friend bool operator!= (BASETYPE b,
const TypeDesc &t) {
220 return (BASETYPE)t.basetype != b || (AGGREGATE)t.aggregate != SCALAR || t.arraylen != 0;
225 friend bool equivalent (TypeDesc a, TypeDesc b) {
226 return a.basetype == b.basetype && a.aggregate == b.aggregate &&
227 a.arraylen == b.arraylen;
232 void unarray (
void) { arraylen = 0; }
234 static const TypeDesc TypeFloat;
235 static const TypeDesc TypeColor;
236 static const TypeDesc TypeString;
237 static const TypeDesc TypeInt;
238 static const TypeDesc TypePoint;
239 static const TypeDesc TypeVector;
240 static const TypeDesc TypeNormal;
241 static const TypeDesc TypeMatrix;
248 std::string
tostring (TypeDesc type,
const void *data,
249 const char *float_fmt =
"%f",
250 const char *string_fmt =
"%s",
251 const char aggregate_delim[2] =
"()",
252 const char *aggregate_sep =
",",
253 const char array_delim[2] =
"{}",
254 const char *array_sep =
",");
261 template<>
struct BaseTypeFromC<unsigned char> {
static const TypeDesc::BASETYPE value = TypeDesc::UINT8; };
262 template<>
struct BaseTypeFromC<char> {
static const TypeDesc::BASETYPE value = TypeDesc::INT8; };
263 template<>
struct BaseTypeFromC<unsigned short> {
static const TypeDesc::BASETYPE value = TypeDesc::UINT16; };
264 template<>
struct BaseTypeFromC<short> {
static const TypeDesc::BASETYPE value = TypeDesc::INT16; };
265 template<>
struct BaseTypeFromC<unsigned int> {
static const TypeDesc::BASETYPE value = TypeDesc::UINT; };
266 template<>
struct BaseTypeFromC<int> {
static const TypeDesc::BASETYPE value = TypeDesc::INT; };
267 template<>
struct BaseTypeFromC<unsigned long long> {
static const TypeDesc::BASETYPE value = TypeDesc::UINT64; };
268 template<>
struct BaseTypeFromC<long long> {
static const TypeDesc::BASETYPE value = TypeDesc::INT64; };
270 template<>
struct BaseTypeFromC<half> {
static const TypeDesc::BASETYPE value = TypeDesc::HALF; };
272 template<>
struct BaseTypeFromC<float> {
static const TypeDesc::BASETYPE value = TypeDesc::FLOAT; };
273 template<>
struct BaseTypeFromC<double> {
static const TypeDesc::BASETYPE value = TypeDesc::DOUBLE; };
280 template<>
struct CType<(int)TypeDesc::UINT8> {
typedef unsigned char type; };
281 template<>
struct CType<(int)TypeDesc::INT8> {
typedef char type; };
282 template<>
struct CType<(int)TypeDesc::UINT16> {
typedef unsigned short type; };
283 template<>
struct CType<(int)TypeDesc::INT16> {
typedef short type; };
284 template<>
struct CType<(int)TypeDesc::UINT> {
typedef unsigned int type; };
285 template<>
struct CType<(int)TypeDesc::INT> {
typedef int type; };
286 template<>
struct CType<(int)TypeDesc::UINT64> {
typedef unsigned long long type; };
287 template<>
struct CType<(int)TypeDesc::INT64> {
typedef long long type; };
289 template<>
struct CType<(int)TypeDesc::HALF> {
typedef half type; };
291 template<>
struct CType<(int)TypeDesc::FLOAT> {
typedef float type; };
292 template<>
struct CType<(int)TypeDesc::DOUBLE> {
typedef double type; };
297 typedef TypeDesc ParamType;
298 typedef TypeDesc ParamBaseType;
299 #define PT_FLOAT TypeDesc::FLOAT
300 #define PT_UINT8 TypeDesc::UCHAR
301 #define PT_INT8 TypeDesc::CHAR
302 #define PT_UINT16 TypeDesc::USHORT
303 #define PT_INT16 TypeDesc::SHORT
304 #define PT_UINT TypeDesc::UINT
305 #define PT_INT TypeDesc::INT
306 #define PT_FLOAT TypeDesc::FLOAT
307 #define PT_DOUBLE TypeDesc::DOUBLE
308 #define PT_HALF TypeDesc::HALF
309 #define PT_MATRIX TypeDesc(TypeDesc::FLOAT,TypeDesc::MATRIX44)
310 #define PT_STRING TypeDesc::STRING
311 #define PT_UNKNOWN TypeDesc::UNKNOWN
312 #define PT_COLOR TypeDesc(TypeDesc::FLOAT,TypeDesc::VEC3,TypeDesc::COLOR)
313 #define PT_POINT TypeDesc(TypeDesc::FLOAT,TypeDesc::VEC3,TypeDesc::POINT)
314 #define PT_VECTOR TypeDesc(TypeDesc::FLOAT,TypeDesc::VEC3,TypeDesc::VECTOR)
315 #define PT_NORMAL TypeDesc(TypeDesc::FLOAT,TypeDesc::VEC3,TypeDesc::NORMAL)