00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef _Alembic_Util_PlainOldDataType_h_
00038 #define _Alembic_Util_PlainOldDataType_h_
00039
00040 #include <Alembic/Util/Foundation.h>
00041 #include <Alembic/Util/Exception.h>
00042
00043 namespace Alembic {
00044 namespace Util {
00045 namespace ALEMBIC_VERSION_NS {
00046
00047
00048
00049
00050
00051 typedef unsigned char byte_t;
00052
00053
00054
00055
00056
00057
00058
00059 class bool_t
00060 {
00061 public:
00062 bool_t() : m_byte( 0 ) {}
00063
00064 bool_t( bool tf ) : m_byte( static_cast<byte_t>( tf ) ) {}
00065 bool_t( byte_t b ) : m_byte( b ) {}
00066
00067
00068
00069
00070
00071
00072
00073
00074 bool_t& operator=( bool tf )
00075 {
00076 m_byte = static_cast<byte_t>( tf );
00077 return *this;
00078 }
00079
00080 bool_t& operator=( byte_t b )
00081 {
00082 m_byte = b;
00083 return *this;
00084 }
00085
00086 bool_t operator!( void )
00087 {
00088 return bool_t( m_byte == 0 );
00089 }
00090
00091 bool asBool() const { return ( m_byte != 0 ); }
00092 operator bool() const { return ( m_byte != 0 ); }
00093
00094 private:
00095 byte_t m_byte;
00096 };
00097
00098
00099 inline bool operator==( const bool_t &a, const bool_t &b )
00100 {
00101 return a.asBool() == b.asBool();
00102 }
00103
00104
00105 inline bool operator==( const bool_t &a, bool b )
00106 {
00107 return a.asBool() == b;
00108 }
00109
00110
00111 inline bool operator==( bool a, const bool_t &b )
00112 {
00113 return a == b.asBool();
00114 }
00115
00116
00117 inline bool operator!=( const bool_t &a, const bool_t &b )
00118 {
00119 return a.asBool() != b.asBool();
00120 }
00121
00122
00123 inline bool operator!=( const bool_t &a, bool b )
00124 {
00125 return a.asBool() != b;
00126 }
00127
00128
00129 inline bool operator!=( bool a, const bool_t &b )
00130 {
00131 return a != b.asBool();
00132 }
00133
00134
00135
00136
00137
00138
00139 using boost::uint8_t;
00140 using boost::int8_t;
00141 using boost::uint16_t;
00142 using boost::int16_t;
00143 using boost::uint32_t;
00144 using boost::int32_t;
00145 using boost::uint64_t;
00146 using boost::int64_t;
00147 typedef half float16_t;
00148 typedef float float32_t;
00149 typedef double float64_t;
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 using std::string;
00160 using std::wstring;
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 enum PlainOldDataType
00172 {
00173
00174
00175
00176
00177 kBooleanPOD,
00178
00179
00180 kUint8POD,
00181 kInt8POD,
00182
00183
00184 kUint16POD,
00185 kInt16POD,
00186
00187
00188 kUint32POD,
00189 kInt32POD,
00190
00191
00192 kUint64POD,
00193 kInt64POD,
00194
00195
00196 kFloat16POD,
00197 kFloat32POD,
00198 kFloat64POD,
00199
00200
00201 kStringPOD,
00202
00203
00204 kWstringPOD,
00205
00206
00207 kNumPlainOldDataTypes,
00208
00209
00210 kUnknownPOD = 127
00211 };
00212
00213
00214
00215
00216
00217
00218
00219
00220 template <PlainOldDataType PODT, class T > struct PODTraits {};
00221
00222
00223
00224
00225
00226 #define DECLARE_TRAITS( PENUM, PTYPE, PNAME, DFLT, PTDEF ) \
00227 template <> \
00228 struct PODTraits< PENUM , PTYPE > \
00229 { \
00230 static const PlainOldDataType pod_enum = PENUM ; \
00231 typedef PTYPE value_type ; \
00232 static const char * name() { return PNAME ; } \
00233 static PTYPE default_value() \
00234 { return ( DFLT ) ; } \
00235 static size_t numBytes() \
00236 { return sizeof( PTYPE ) ; } \
00237 }; \
00238 typedef PODTraits< PENUM , PTYPE > PTDEF
00239
00240
00241
00242 DECLARE_TRAITS( kBooleanPOD, bool_t, "bool_t", false, BooleanPODTraits );
00243 DECLARE_TRAITS( kUint8POD, uint8_t, "uint8_t", 0, Uint8PODTraits );
00244 DECLARE_TRAITS( kInt8POD, int8_t, "int8_t", 0, Int8PODTraits );
00245 DECLARE_TRAITS( kUint16POD, uint16_t, "uint16_t", 0, Uint16PODTraits );
00246 DECLARE_TRAITS( kInt16POD, int16_t, "int16_t", 0, Int16PODTraits );
00247 DECLARE_TRAITS( kUint32POD, uint32_t, "uint32_t", 0, Uint32PODTraits );
00248 DECLARE_TRAITS( kInt32POD, int32_t, "int32_t", 0, Int32PODTraits );
00249 DECLARE_TRAITS( kUint64POD, uint64_t, "uint64_t", 0, Uint64PODTraits );
00250 DECLARE_TRAITS( kInt64POD, int64_t, "int64_t", 0, Int64PODTraits );
00251 DECLARE_TRAITS( kFloat16POD, float16_t, "float16_t", 0, Float16PODTraits );
00252 DECLARE_TRAITS( kFloat32POD, float32_t, "float32_t", 0, Float32PODTraits );
00253 DECLARE_TRAITS( kFloat64POD, float64_t, "float64_t", 0, Float64PODTraits );
00254 DECLARE_TRAITS( kStringPOD, string, "string", "", StringPODTraits );
00255 DECLARE_TRAITS( kWstringPOD, wstring, "wstring", L"", WstringPODTraits );
00256
00257 #undef DECLARE_TRAITS
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 template <PlainOldDataType PENUM>
00271 struct PODTraitsFromEnum {};
00272
00273
00274
00275 template <> struct PODTraitsFromEnum<kBooleanPOD> : public BooleanPODTraits {};
00276 template <> struct PODTraitsFromEnum<kUint8POD> : public Uint8PODTraits {};
00277 template <> struct PODTraitsFromEnum<kInt8POD> : public Int8PODTraits {};
00278 template <> struct PODTraitsFromEnum<kUint16POD> : public Uint16PODTraits {};
00279 template <> struct PODTraitsFromEnum<kInt16POD> : public Int16PODTraits {};
00280 template <> struct PODTraitsFromEnum<kUint32POD> : public Uint32PODTraits {};
00281 template <> struct PODTraitsFromEnum<kInt32POD> : public Int32PODTraits {};
00282 template <> struct PODTraitsFromEnum<kUint64POD> : public Uint64PODTraits {};
00283 template <> struct PODTraitsFromEnum<kInt64POD> : public Int64PODTraits {};
00284 template <> struct PODTraitsFromEnum<kFloat16POD> : public Float16PODTraits {};
00285 template <> struct PODTraitsFromEnum<kFloat32POD> : public Float32PODTraits {};
00286 template <> struct PODTraitsFromEnum<kFloat64POD> : public Float64PODTraits {};
00287 template <> struct PODTraitsFromEnum<kStringPOD> : public StringPODTraits {};
00288 template <> struct PODTraitsFromEnum<kWstringPOD> : public WstringPODTraits {};
00289
00290
00291
00292
00293
00294
00295 template <class PTYPE>
00296 struct PODTraitsFromType {};
00297
00298
00299
00300 template <> struct PODTraitsFromType<bool_t> : public BooleanPODTraits {};
00301 template <> struct PODTraitsFromType<uint8_t> : public Uint8PODTraits {};
00302 template <> struct PODTraitsFromType<int8_t> : public Int8PODTraits {};
00303 template <> struct PODTraitsFromType<uint16_t> : public Uint16PODTraits {};
00304 template <> struct PODTraitsFromType<int16_t> : public Int16PODTraits {};
00305 template <> struct PODTraitsFromType<uint32_t> : public Uint32PODTraits {};
00306 template <> struct PODTraitsFromType<int32_t> : public Int32PODTraits {};
00307 template <> struct PODTraitsFromType<uint64_t> : public Uint64PODTraits {};
00308 template <> struct PODTraitsFromType<int64_t> : public Int64PODTraits {};
00309 template <> struct PODTraitsFromType<float16_t> : public Float16PODTraits {};
00310 template <> struct PODTraitsFromType<float32_t> : public Float32PODTraits {};
00311 template <> struct PODTraitsFromType<float64_t> : public Float64PODTraits {};
00312 template <> struct PODTraitsFromType<string> : public StringPODTraits {};
00313 template <> struct PODTraitsFromType<wstring> : public WstringPODTraits {};
00314
00315
00316
00317
00318
00319
00320 inline size_t PODNumBytes( PlainOldDataType pod )
00321 {
00322 switch ( pod )
00323 {
00324 case kBooleanPOD: return BooleanPODTraits::numBytes();
00325 case kUint8POD: return Uint8PODTraits::numBytes();
00326 case kInt8POD: return Int8PODTraits::numBytes();
00327 case kUint16POD: return Uint16PODTraits::numBytes();
00328 case kInt16POD: return Int16PODTraits::numBytes();
00329 case kUint32POD: return Uint32PODTraits::numBytes();
00330 case kInt32POD: return Int32PODTraits::numBytes();
00331 case kUint64POD: return Uint64PODTraits::numBytes();
00332 case kInt64POD: return Int64PODTraits::numBytes();
00333 case kFloat16POD: return Float16PODTraits::numBytes();
00334 case kFloat32POD: return Float32PODTraits::numBytes();
00335 case kFloat64POD: return Float64PODTraits::numBytes();
00336 case kStringPOD: return StringPODTraits::numBytes();
00337 case kWstringPOD: return WstringPODTraits::numBytes();
00338 default:
00339
00340 assert( false );
00341 return 0;
00342 };
00343 }
00344
00345
00346 inline const char *PODName( PlainOldDataType pod )
00347 {
00348 switch ( pod )
00349 {
00350 case kBooleanPOD: return BooleanPODTraits::name();
00351 case kUint8POD: return Uint8PODTraits::name();
00352 case kInt8POD: return Int8PODTraits::name();
00353 case kUint16POD: return Uint16PODTraits::name();
00354 case kInt16POD: return Int16PODTraits::name();
00355 case kUint32POD: return Uint32PODTraits::name();
00356 case kInt32POD: return Int32PODTraits::name();
00357 case kUint64POD: return Uint64PODTraits::name();
00358 case kInt64POD: return Int64PODTraits::name();
00359 case kFloat16POD: return Float16PODTraits::name();
00360 case kFloat32POD: return Float32PODTraits::name();
00361 case kFloat64POD: return Float64PODTraits::name();
00362 case kStringPOD: return StringPODTraits::name();
00363 case kWstringPOD: return WstringPODTraits::name();
00364 default:
00365
00366
00367 return "UNKNOWN";
00368
00369 };
00370 }
00371
00372
00373 inline PlainOldDataType PODFromName( const std::string &n )
00374 {
00375 if ( n == BooleanPODTraits::name() ) return BooleanPODTraits::pod_enum;
00376 else if ( n == Uint8PODTraits::name() ) return Uint8PODTraits::pod_enum;
00377 else if ( n == Int8PODTraits::name() ) return Int8PODTraits::pod_enum;
00378 else if ( n == Uint16PODTraits::name() ) return Uint16PODTraits::pod_enum;
00379 else if ( n == Int16PODTraits::name() ) return Int16PODTraits::pod_enum;
00380 else if ( n == Uint32PODTraits::name() ) return Uint32PODTraits::pod_enum;
00381 else if ( n == Int32PODTraits::name() ) return Int32PODTraits::pod_enum;
00382 else if ( n == Uint64PODTraits::name() ) return Uint64PODTraits::pod_enum;
00383 else if ( n == Int64PODTraits::name() ) return Int64PODTraits::pod_enum;
00384 else if ( n == Float16PODTraits::name() ) return Float16PODTraits::pod_enum;
00385 else if ( n == Float32PODTraits::name() ) return Float32PODTraits::pod_enum;
00386 else if ( n == Float64PODTraits::name() ) return Float64PODTraits::pod_enum;
00387 else if ( n == StringPODTraits::name() ) return StringPODTraits::pod_enum;
00388 else if ( n == WstringPODTraits::name() ) return WstringPODTraits::pod_enum;
00389 else return kUnknownPOD;
00390 }
00391
00392
00393
00394 template <PlainOldDataType POD>
00395 inline void PODSetDefaultPOD( void *addr )
00396 {
00397 typedef typename PODTraitsFromEnum<POD>::value_type value_type;
00398 value_type *valPtr = reinterpret_cast<value_type*>( addr );
00399 if ( valPtr ) { *valPtr = PODTraitsFromEnum<POD>::default_value(); }
00400 }
00401
00402
00403 inline void PODSetDefault( PlainOldDataType pod, void *bytes )
00404 {
00405 switch ( pod )
00406 {
00407 case kBooleanPOD: PODSetDefaultPOD<kBooleanPOD>( bytes ); return;
00408 case kUint8POD: PODSetDefaultPOD<kUint8POD>( bytes ); return;
00409 case kInt8POD: PODSetDefaultPOD<kInt8POD>( bytes ); return;
00410 case kUint16POD: PODSetDefaultPOD<kUint16POD>( bytes ); return;
00411 case kInt16POD: PODSetDefaultPOD<kInt16POD>( bytes ); return;
00412 case kUint32POD: PODSetDefaultPOD<kUint32POD>( bytes ); return;
00413 case kInt32POD: PODSetDefaultPOD<kInt32POD>( bytes ); return;
00414 case kUint64POD: PODSetDefaultPOD<kUint64POD>( bytes ); return;
00415 case kInt64POD: PODSetDefaultPOD<kInt64POD>( bytes ); return;
00416 case kFloat16POD: PODSetDefaultPOD<kFloat16POD>( bytes ); return;
00417 case kFloat32POD: PODSetDefaultPOD<kFloat32POD>( bytes ); return;
00418 case kFloat64POD: PODSetDefaultPOD<kFloat64POD>( bytes ); return;
00419
00420
00421 case kStringPOD: PODSetDefaultPOD<kStringPOD>( bytes ); return;
00422 case kWstringPOD: PODSetDefaultPOD<kWstringPOD>( bytes ); return;
00423 default:
00424
00425 assert( false );
00426 };
00427 }
00428
00429 }
00430
00431 using namespace ALEMBIC_VERSION_NS;
00432
00433 }
00434 }
00435
00436 #endif
00437