Traits.h
Go to the documentation of this file.
//----------------------------------------------------------------------------//
/*
* Copyright (c) 2009 Sony Pictures Imageworks Inc
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution. Neither the name of Sony Pictures Imageworks nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
#ifndef _INCLUDED_Field3D_Traits_H_
#define _INCLUDED_Field3D_Traits_H_
#include <assert.h>
#include <string>
#include <hdf5.h>
#include "Log.h"
#include "Types.h"
//----------------------------------------------------------------------------//
#include "ns.h"
FIELD3D_NAMESPACE_OPEN
//----------------------------------------------------------------------------//
// Types
//----------------------------------------------------------------------------//
#if !defined(_MSC_VER)
using ::uint8_t;
using ::int8_t;
using ::uint16_t;
using ::int16_t;
using ::uint32_t;
using ::int32_t;
using ::uint64_t;
using ::int64_t;
#else
typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned int uint32_t;
typedef int int32_t;
typedef unsigned long long uint64_t;
typedef long long int64_t;
#endif
typedef half float16_t;
typedef float float32_t;
typedef double float64_t;
#ifdef FIELD3D_VERSION_NS
typedef Field3D::V3h vec16_t;
typedef Field3D::V3f vec32_t;
typedef Field3D::V3d vec64_t;
typedef Field3D::V3i veci32_t;
typedef Field3D::M44d mtx64_t;
#else
typedef Imath::Vec3<float16_t> vec16_t;
typedef Imath::Vec3<float32_t> vec32_t;
typedef Imath::Vec3<float64_t> vec64_t;
typedef Imath::Vec3<int32_t> veci32_t;
typedef Imath::M44d mtx64_t;
#endif
//----------------------------------------------------------------------------//
// Enums
//----------------------------------------------------------------------------//
enum DataTypeEnum {
DataTypeHalf=0,
DataTypeUnsignedChar,
DataTypeInt,
DataTypeFloat,
DataTypeDouble,
DataTypeVecHalf,
DataTypeVecFloat,
DataTypeVecDouble,
DataTypeUnknown
};
//----------------------------------------------------------------------------//
enum OgDataType {
// Signed and unsigned integers from char to long
F3DInt8 = 0,
F3DUint8,
F3DInt16,
F3DUint16,
F3DInt32,
F3DUint32,
F3DInt64,
F3DUint64,
// Floats
F3DFloat16,
F3DFloat32,
F3DFloat64,
// Vec3
F3DVec16,
F3DVec32,
F3DVec64,
F3DVecI32,
// Matrix
F3DMtx64,
// String
F3DString,
F3DNumDataTypes,
// Invalid type enum
F3DInvalidDataType = 127
};
//----------------------------------------------------------------------------//
// FieldTraits
//----------------------------------------------------------------------------//
template <class Data_T>
class FieldTraits
{
public:
static const int k_dataDims = 3;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<half>
{
public:
static const int k_dataDims = 1;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<float>
{
public:
static const int k_dataDims = 1;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<double>
{
public:
static const int k_dataDims = 1;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<int>
{
public:
static const int k_dataDims = 1;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<char>
{
public:
static const int k_dataDims = 1;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<unsigned char>
{
public:
static const int k_dataDims = 1;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<V3h>
{
public:
static const int k_dataDims = 3;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<V3f>
{
public:
static const int k_dataDims = 3;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<V3d>
{
public:
static const int k_dataDims = 3;
static int dataDims() { return k_dataDims; }
};
template <>
struct FieldTraits<C3f>
{
public:
static const int k_dataDims = 3;
static int dataDims() { return k_dataDims; }
};
//----------------------------------------------------------------------------//
// DataTypeTraits
//----------------------------------------------------------------------------//
template <typename T>
struct DataTypeTraits {
static std::string name()
{
return typeid(T).name();
}
static DataTypeEnum typeEnum();
static hid_t h5type();
static int h5bits();
};
//----------------------------------------------------------------------------//
// TemplatedFieldType
//----------------------------------------------------------------------------//
template <class Field_T>
struct TemplatedFieldType
{
const char *name()
{
return m_name.c_str();
}
TemplatedFieldType()
{
m_name = Field_T::staticClassName();
m_name +=
"<" +
DataTypeTraits<typename Field_T::value_type>::name() +
">";
}
private:
std::string m_name;
};
//----------------------------------------------------------------------------//
// NestedFieldType
//----------------------------------------------------------------------------//
template <typename Field_T>
struct NestedFieldType
{
const char *name()
{
return m_name.c_str();
}
NestedFieldType()
{
typedef typename Field_T::NestedType NestedType;
typedef typename NestedType::value_type value_type;
m_name = Field_T::staticClassName();
m_name +=
std::string("<") + NestedType::staticClassName() + "<" +
DataTypeTraits<value_type>::name() + ">>";
}
private:
std::string m_name;
};
//----------------------------------------------------------------------------//
// Template specializations
//----------------------------------------------------------------------------//
#define FIELD3D_DECL_DATATYPENAME(typeName) \
template<> \
inline std::string DataTypeTraits<typeName>::name() \
{ \
return std::string(#typeName); \
} \
//----------------------------------------------------------------------------//
FIELD3D_DECL_DATATYPENAME(unsigned char)
FIELD3D_DECL_DATATYPENAME(int)
FIELD3D_DECL_DATATYPENAME(float)
FIELD3D_DECL_DATATYPENAME(half)
FIELD3D_DECL_DATATYPENAME(double)
FIELD3D_DECL_DATATYPENAME(V3h)
FIELD3D_DECL_DATATYPENAME(V3f)
FIELD3D_DECL_DATATYPENAME(V3d)
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<half>::typeEnum()
{
return DataTypeHalf;
}
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<unsigned char>::typeEnum()
{
return DataTypeUnsignedChar;
}
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<int>::typeEnum()
{
return DataTypeInt;
}
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<float>::typeEnum()
{
return DataTypeFloat;
}
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<double>::typeEnum()
{
return DataTypeDouble;
}
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<V3h>::typeEnum()
{
return DataTypeVecHalf;
}
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<V3f>::typeEnum()
{
return DataTypeVecFloat;
}
//----------------------------------------------------------------------------//
template<>
inline DataTypeEnum DataTypeTraits<V3d>::typeEnum()
{
return DataTypeVecDouble;
}
template <>
inline hid_t DataTypeTraits<half>::h5type()
{
return H5T_NATIVE_SHORT;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<float>::h5type()
{
return H5T_NATIVE_FLOAT;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<double>::h5type()
{
return H5T_NATIVE_DOUBLE;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<char>::h5type()
{
return H5T_NATIVE_CHAR;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<unsigned char>::h5type()
{
return H5T_NATIVE_UCHAR;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<int>::h5type()
{
return H5T_NATIVE_INT;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<V3h>::h5type()
{
return H5T_NATIVE_SHORT;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<V3f>::h5type()
{
return H5T_NATIVE_FLOAT;
}
//----------------------------------------------------------------------------//
template <>
inline hid_t DataTypeTraits<V3d>::h5type()
{
return H5T_NATIVE_DOUBLE;
}
//----------------------------------------------------------------------------//
template <>
inline int DataTypeTraits<half>::h5bits()
{
return 16;
}
//----------------------------------------------------------------------------//
template <>
inline int DataTypeTraits<float>::h5bits()
{
return 32;
}
//----------------------------------------------------------------------------//
template <>
inline int DataTypeTraits<double>::h5bits()
{
return 64;
}
//----------------------------------------------------------------------------//
template <>
inline int DataTypeTraits<V3h>::h5bits()
{
return 16;
}
//----------------------------------------------------------------------------//
template <>
inline int DataTypeTraits<V3f>::h5bits()
{
return 32;
}
//----------------------------------------------------------------------------//
template <>
inline int DataTypeTraits<V3d>::h5bits()
{
return 64;
}
//----------------------------------------------------------------------------//
FIELD3D_NAMESPACE_HEADER_CLOSE
//----------------------------------------------------------------------------//
#endif // Include guard
Log.h
Contains the Log class which can be used to redirect output to an arbitrary destination.
V3d
Imath::V3d V3d
Definition SpiMathLib.h:74
half
FIELD3D_NAMESPACE_OPENtypedef ::half half
Definition SpiMathLib.h:64
V3h
Imath::Vec3< half > V3h
Definition SpiMathLib.h:72
V3f
Imath::V3f V3f
Definition SpiMathLib.h:73
C3f
Imath::C3f C3f
Definition SpiMathLib.h:68
vec32_t
Field3D::V3f vec32_t
Definition Traits.h:92
mtx64_t
Field3D::M44d mtx64_t
Definition Traits.h:95
veci32_t
Field3D::V3i veci32_t
Definition Traits.h:94
float32_t
float float32_t
Definition Traits.h:87
vec16_t
Field3D::V3h vec16_t
Definition Traits.h:91
vec64_t
Field3D::V3d vec64_t
Definition Traits.h:93
OgDataType
OgDataType
Enumerates the various uses for Ogawa-level groups.
Definition Traits.h:125
F3DInt64
@ F3DInt64
Definition Traits.h:137
F3DUint64
@ F3DUint64
Definition Traits.h:138
F3DFloat32
@ F3DFloat32
Definition Traits.h:142
F3DFloat64
@ F3DFloat64
Definition Traits.h:143
F3DVec64
@ F3DVec64
Definition Traits.h:148
F3DUint32
@ F3DUint32
Definition Traits.h:135
F3DInt16
@ F3DInt16
Definition Traits.h:131
F3DString
@ F3DString
Definition Traits.h:155
F3DVec32
@ F3DVec32
Definition Traits.h:147
F3DInt32
@ F3DInt32
Definition Traits.h:134
F3DUint16
@ F3DUint16
Definition Traits.h:132
F3DVecI32
@ F3DVecI32
Definition Traits.h:149
F3DFloat16
@ F3DFloat16
Definition Traits.h:141
F3DMtx64
@ F3DMtx64
Definition Traits.h:152
F3DNumDataTypes
@ F3DNumDataTypes
Definition Traits.h:157
F3DInt8
@ F3DInt8
Definition Traits.h:128
F3DInvalidDataType
@ F3DInvalidDataType
Definition Traits.h:160
F3DUint8
@ F3DUint8
Definition Traits.h:129
F3DVec16
@ F3DVec16
Definition Traits.h:146
DataTypeEnum
DataTypeEnum
Definition Traits.h:108
DataTypeFloat
@ DataTypeFloat
Definition Traits.h:112
DataTypeHalf
@ DataTypeHalf
Definition Traits.h:109
DataTypeVecHalf
@ DataTypeVecHalf
Definition Traits.h:114
DataTypeUnsignedChar
@ DataTypeUnsignedChar
Definition Traits.h:110
DataTypeVecDouble
@ DataTypeVecDouble
Definition Traits.h:116
DataTypeUnknown
@ DataTypeUnknown
Definition Traits.h:117
DataTypeVecFloat
@ DataTypeVecFloat
Definition Traits.h:115
DataTypeInt
@ DataTypeInt
Definition Traits.h:111
DataTypeDouble
@ DataTypeDouble
Definition Traits.h:113
FIELD3D_DECL_DATATYPENAME
#define FIELD3D_DECL_DATATYPENAME(typeName)
Definition Traits.h:330
float64_t
double float64_t
Definition Traits.h:88
float16_t
half float16_t
Definition Traits.h:86
Types.h
Contains typedefs for the commonly used types in Field3D.
FieldTraits
Definition Traits.h:174
FieldTraits::k_dataDims
static const int k_dataDims
Dimensions of the given data type. i.e. 3 for V3f, 1 for float.
Definition Traits.h:177
FieldTraits::dataDims
static int dataDims()
Definition Traits.h:178
FIELD3D_NAMESPACE_OPEN
Definition FieldMapping.cpp:74
ns.h
FIELD3D_NAMESPACE_HEADER_CLOSE
#define FIELD3D_NAMESPACE_HEADER_CLOSE
Definition ns.h:58
DataTypeTraits
Definition Traits.h:266
DataTypeTraits::name
static std::string name()
Definition Traits.h:267
DataTypeTraits::h5type
static hid_t h5type()
DataTypeTraits::typeEnum
static DataTypeEnum typeEnum()
DataTypeTraits::h5bits
static int h5bits()
FieldTraits< C3f >::k_dataDims
static const int k_dataDims
Definition Traits.h:257
FieldTraits< C3f >::dataDims
static int dataDims()
Definition Traits.h:258
FieldTraits< V3d >::k_dataDims
static const int k_dataDims
Definition Traits.h:249
FieldTraits< V3d >::dataDims
static int dataDims()
Definition Traits.h:250
FieldTraits< V3f >::k_dataDims
static const int k_dataDims
Definition Traits.h:241
FieldTraits< V3f >::dataDims
static int dataDims()
Definition Traits.h:242
FieldTraits< V3h >::k_dataDims
static const int k_dataDims
Definition Traits.h:233
FieldTraits< V3h >::dataDims
static int dataDims()
Definition Traits.h:234
FieldTraits< char >::dataDims
static int dataDims()
Definition Traits.h:218
FieldTraits< char >::k_dataDims
static const int k_dataDims
Definition Traits.h:217
FieldTraits< double >::k_dataDims
static const int k_dataDims
Definition Traits.h:201
FieldTraits< double >::dataDims
static int dataDims()
Definition Traits.h:202
FieldTraits< float >::dataDims
static int dataDims()
Definition Traits.h:194
FieldTraits< float >::k_dataDims
static const int k_dataDims
Definition Traits.h:193
FieldTraits< half >::k_dataDims
static const int k_dataDims
Definition Traits.h:185
FieldTraits< half >::dataDims
static int dataDims()
Definition Traits.h:186
FieldTraits< int >::k_dataDims
static const int k_dataDims
Definition Traits.h:209
FieldTraits< int >::dataDims
static int dataDims()
Definition Traits.h:210
FieldTraits< unsigned char >::k_dataDims
static const int k_dataDims
Definition Traits.h:225
FieldTraits< unsigned char >::dataDims
static int dataDims()
Definition Traits.h:226
NestedFieldType::name
const char * name()
Definition Traits.h:308
NestedFieldType::NestedFieldType
NestedFieldType()
Definition Traits.h:312
NestedFieldType::m_name
std::string m_name
Definition Traits.h:323
TemplatedFieldType::m_name
std::string m_name
Definition Traits.h:297
TemplatedFieldType::TemplatedFieldType
TemplatedFieldType()
Definition Traits.h:288
TemplatedFieldType::name
const char * name()
Definition Traits.h:284