|
@@ -67,6 +67,7 @@ typedef enum aiMetadataType {
|
|
AI_DOUBLE = 4,
|
|
AI_DOUBLE = 4,
|
|
AI_AISTRING = 5,
|
|
AI_AISTRING = 5,
|
|
AI_AIVECTOR3D = 6,
|
|
AI_AIVECTOR3D = 6,
|
|
|
|
+ AI_META_MAX = 7,
|
|
|
|
|
|
#ifndef SWIG
|
|
#ifndef SWIG
|
|
FORCE_32BIT = INT_MAX
|
|
FORCE_32BIT = INT_MAX
|
|
@@ -130,42 +131,103 @@ struct aiMetadata {
|
|
*/
|
|
*/
|
|
aiMetadata()
|
|
aiMetadata()
|
|
: mNumProperties(0)
|
|
: mNumProperties(0)
|
|
- , mKeys(NULL)
|
|
|
|
- , mValues(NULL) {
|
|
|
|
|
|
+ , mKeys(nullptr)
|
|
|
|
+ , mValues(nullptr) {
|
|
// empty
|
|
// empty
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ aiMetadata( const aiMetadata &rhs )
|
|
|
|
+ : mNumProperties( rhs.mNumProperties )
|
|
|
|
+ , mKeys( nullptr )
|
|
|
|
+ , mValues( nullptr ) {
|
|
|
|
+ mKeys = new aiString[ mNumProperties ];
|
|
|
|
+ for ( unsigned int i = 0; i < mNumProperties; ++i ) {
|
|
|
|
+ mKeys[ i ] = rhs.mKeys[ i ];
|
|
|
|
+ }
|
|
|
|
+ mValues = new aiMetadataEntry[ mNumProperties ];
|
|
|
|
+ for ( unsigned int i = 0; i < mNumProperties; ++i ) {
|
|
|
|
+ mValues[ i ].mType = rhs.mValues[ i ].mType;
|
|
|
|
+ switch ( rhs.mValues[ i ].mType ) {
|
|
|
|
+ case AI_BOOL:
|
|
|
|
+ mValues[ i ].mData = new bool( rhs.mValues[i].mData );
|
|
|
|
+ break;
|
|
|
|
+ case AI_INT32: {
|
|
|
|
+ int32_t v;
|
|
|
|
+ ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( int32_t ) );
|
|
|
|
+ mValues[ i ].mData = new int32_t( v );
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case AI_UINT64: {
|
|
|
|
+ uint64_t v;
|
|
|
|
+ ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( uint64_t ) );
|
|
|
|
+ mValues[ i ].mData = new uint64_t( v );
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case AI_FLOAT: {
|
|
|
|
+ float v;
|
|
|
|
+ ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( float ) );
|
|
|
|
+ mValues[ i ].mData = new float( v );
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case AI_DOUBLE: {
|
|
|
|
+ double v;
|
|
|
|
+ ::memcpy( &v, rhs.mValues[ i ].mData, sizeof( double ) );
|
|
|
|
+ mValues[ i ].mData = new double( v );
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case AI_AISTRING: {
|
|
|
|
+ aiString v;
|
|
|
|
+ rhs.Get<aiString>( mKeys[ i ], v );
|
|
|
|
+ mValues[ i ].mData = new aiString( v );
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case AI_AIVECTOR3D: {
|
|
|
|
+ aiVector3D v;
|
|
|
|
+ rhs.Get<aiVector3D>( mKeys[ i ], v );
|
|
|
|
+ mValues[ i ].mData = new aiVector3D( v );
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+#ifndef SWIG
|
|
|
|
+ case FORCE_32BIT:
|
|
|
|
+#endif
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @brief The destructor.
|
|
* @brief The destructor.
|
|
*/
|
|
*/
|
|
~aiMetadata() {
|
|
~aiMetadata() {
|
|
delete [] mKeys;
|
|
delete [] mKeys;
|
|
- mKeys = NULL;
|
|
|
|
|
|
+ mKeys = nullptr;
|
|
if (mValues) {
|
|
if (mValues) {
|
|
// Delete each metadata entry
|
|
// Delete each metadata entry
|
|
for (unsigned i=0; i<mNumProperties; ++i) {
|
|
for (unsigned i=0; i<mNumProperties; ++i) {
|
|
void* data = mValues[i].mData;
|
|
void* data = mValues[i].mData;
|
|
switch (mValues[i].mType) {
|
|
switch (mValues[i].mType) {
|
|
case AI_BOOL:
|
|
case AI_BOOL:
|
|
- delete static_cast<bool*>(data);
|
|
|
|
|
|
+ delete static_cast< bool* >( data );
|
|
break;
|
|
break;
|
|
case AI_INT32:
|
|
case AI_INT32:
|
|
- delete static_cast<int32_t*>(data);
|
|
|
|
|
|
+ delete static_cast< int32_t* >( data );
|
|
break;
|
|
break;
|
|
case AI_UINT64:
|
|
case AI_UINT64:
|
|
- delete static_cast<uint64_t*>(data);
|
|
|
|
|
|
+ delete static_cast< uint64_t* >( data );
|
|
break;
|
|
break;
|
|
case AI_FLOAT:
|
|
case AI_FLOAT:
|
|
- delete static_cast<float*>(data);
|
|
|
|
|
|
+ delete static_cast< float* >( data );
|
|
break;
|
|
break;
|
|
case AI_DOUBLE:
|
|
case AI_DOUBLE:
|
|
- delete static_cast<double*>(data);
|
|
|
|
|
|
+ delete static_cast< double* >( data );
|
|
break;
|
|
break;
|
|
case AI_AISTRING:
|
|
case AI_AISTRING:
|
|
- delete static_cast<aiString*>(data);
|
|
|
|
|
|
+ delete static_cast< aiString* >( data );
|
|
break;
|
|
break;
|
|
case AI_AIVECTOR3D:
|
|
case AI_AIVECTOR3D:
|
|
- delete static_cast<aiVector3D*>(data);
|
|
|
|
|
|
+ delete static_cast< aiVector3D* >( data );
|
|
break;
|
|
break;
|
|
#ifndef SWIG
|
|
#ifndef SWIG
|
|
case FORCE_32BIT:
|
|
case FORCE_32BIT:
|
|
@@ -177,7 +239,7 @@ struct aiMetadata {
|
|
|
|
|
|
// Delete the metadata array
|
|
// Delete the metadata array
|
|
delete [] mValues;
|
|
delete [] mValues;
|
|
- mValues = NULL;
|
|
|
|
|
|
+ mValues = nullptr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -208,8 +270,8 @@ struct aiMetadata {
|
|
}
|
|
}
|
|
|
|
|
|
template<typename T>
|
|
template<typename T>
|
|
- inline void Add(const std::string& key, const T& value)
|
|
|
|
- {
|
|
|
|
|
|
+ inline
|
|
|
|
+ void Add(const std::string& key, const T& value) {
|
|
aiString* new_keys = new aiString[mNumProperties + 1];
|
|
aiString* new_keys = new aiString[mNumProperties + 1];
|
|
aiMetadataEntry* new_values = new aiMetadataEntry[mNumProperties + 1];
|
|
aiMetadataEntry* new_values = new aiMetadataEntry[mNumProperties + 1];
|
|
|
|
|
|
@@ -256,7 +318,7 @@ struct aiMetadata {
|
|
|
|
|
|
template<typename T>
|
|
template<typename T>
|
|
inline
|
|
inline
|
|
- bool Get( unsigned index, T& value ) {
|
|
|
|
|
|
+ bool Get( unsigned index, T& value ) const {
|
|
// In range assertion
|
|
// In range assertion
|
|
if ( index >= mNumProperties ) {
|
|
if ( index >= mNumProperties ) {
|
|
return false;
|
|
return false;
|
|
@@ -277,7 +339,7 @@ struct aiMetadata {
|
|
|
|
|
|
template<typename T>
|
|
template<typename T>
|
|
inline
|
|
inline
|
|
- bool Get( const aiString& key, T& value ) {
|
|
|
|
|
|
+ bool Get( const aiString& key, T& value ) const {
|
|
// Search for the given key
|
|
// Search for the given key
|
|
for ( unsigned int i = 0; i < mNumProperties; ++i ) {
|
|
for ( unsigned int i = 0; i < mNumProperties; ++i ) {
|
|
if ( mKeys[ i ] == key ) {
|
|
if ( mKeys[ i ] == key ) {
|
|
@@ -288,7 +350,8 @@ struct aiMetadata {
|
|
}
|
|
}
|
|
|
|
|
|
template<typename T>
|
|
template<typename T>
|
|
- inline bool Get( const std::string& key, T& value ) {
|
|
|
|
|
|
+ inline
|
|
|
|
+ bool Get( const std::string& key, T& value ) const {
|
|
return Get(aiString(key), value);
|
|
return Get(aiString(key), value);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -297,7 +360,8 @@ struct aiMetadata {
|
|
/// \param [out] pKey - pointer to the key value.
|
|
/// \param [out] pKey - pointer to the key value.
|
|
/// \param [out] pEntry - pointer to the entry: type and value.
|
|
/// \param [out] pEntry - pointer to the entry: type and value.
|
|
/// \return false - if pIndex is out of range, else - true.
|
|
/// \return false - if pIndex is out of range, else - true.
|
|
- inline bool Get(size_t index, const aiString*& key, const aiMetadataEntry*& entry) {
|
|
|
|
|
|
+ inline
|
|
|
|
+ bool Get(size_t index, const aiString*& key, const aiMetadataEntry*& entry) const {
|
|
if ( index >= mNumProperties ) {
|
|
if ( index >= mNumProperties ) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|