2015-07-29 14:19:43 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "cafInternalPdmXmlFieldReaderWriter.h"
|
|
|
|
|
#include "cafPdmXmlFieldHandle.h"
|
|
|
|
|
|
2020-03-03 13:06:07 +01:00
|
|
|
#include <typeinfo>
|
|
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
namespace caf
|
|
|
|
|
{
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename FieldType>
|
2015-07-29 14:19:43 +02:00
|
|
|
class PdmFieldXmlCap : public PdmXmlFieldHandle
|
|
|
|
|
{
|
|
|
|
|
public:
|
2020-03-05 08:48:13 +01:00
|
|
|
// Type traits magic to check if a template argument is a vector
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename T>
|
|
|
|
|
struct is_vector : public std::false_type
|
|
|
|
|
{
|
|
|
|
|
};
|
|
|
|
|
template <typename T, typename A>
|
|
|
|
|
struct is_vector<std::vector<T, A>> : public std::true_type
|
|
|
|
|
{
|
|
|
|
|
};
|
2020-03-05 08:48:13 +01:00
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
|
|
|
|
|
: PdmXmlFieldHandle( field, giveOwnership )
|
2020-03-03 13:06:07 +01:00
|
|
|
{
|
2020-06-19 07:53:59 +02:00
|
|
|
m_field = field;
|
|
|
|
|
m_dataTypeName = QString( "%1" ).arg( typeid( typename FieldType::FieldDataType ).name() );
|
2020-03-03 13:06:07 +01:00
|
|
|
}
|
2015-07-29 14:19:43 +02:00
|
|
|
|
|
|
|
|
// Xml Serializing
|
|
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
|
|
|
|
|
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
|
|
|
|
|
bool resolveReferences() override;
|
2018-12-04 14:10:18 +01:00
|
|
|
|
2020-09-14 11:27:25 +02:00
|
|
|
bool isVectorField() const override;
|
2020-03-03 13:06:07 +01:00
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
private:
|
|
|
|
|
FieldType* m_field;
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmPtrField;
|
2015-07-29 14:19:43 +02:00
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmFieldXmlCap<PdmPtrField<DataType*>> : public PdmXmlFieldHandle
|
2015-07-29 14:19:43 +02:00
|
|
|
{
|
|
|
|
|
typedef PdmPtrField<DataType*> FieldType;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
|
|
|
|
|
: PdmXmlFieldHandle( field, giveOwnership )
|
|
|
|
|
{
|
|
|
|
|
m_field = field;
|
|
|
|
|
m_dataTypeName = DataType::classKeywordStatic();
|
|
|
|
|
m_isResolved = false;
|
2015-08-27 11:43:27 +02:00
|
|
|
m_referenceString = "";
|
|
|
|
|
}
|
2015-07-29 14:19:43 +02:00
|
|
|
|
|
|
|
|
// Xml Serializing
|
|
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
|
|
|
|
|
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
|
|
|
|
|
bool resolveReferences() override;
|
|
|
|
|
QString referenceString() const override;
|
2015-08-27 11:43:27 +02:00
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
private:
|
|
|
|
|
FieldType* m_field;
|
2015-08-27 11:43:27 +02:00
|
|
|
|
|
|
|
|
// Resolving
|
2020-06-19 07:53:59 +02:00
|
|
|
QString m_referenceString;
|
|
|
|
|
bool m_isResolved;
|
2015-07-29 14:19:43 +02:00
|
|
|
};
|
|
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmPtrArrayField;
|
2016-06-19 21:33:17 +02:00
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmFieldXmlCap<PdmPtrArrayField<DataType*>> : public PdmXmlFieldHandle
|
2016-06-19 21:33:17 +02:00
|
|
|
{
|
|
|
|
|
typedef PdmPtrArrayField<DataType*> FieldType;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2016-06-19 21:33:17 +02:00
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
|
|
|
|
|
: PdmXmlFieldHandle( field, giveOwnership )
|
2016-06-19 21:33:17 +02:00
|
|
|
{
|
2020-06-19 07:53:59 +02:00
|
|
|
m_field = field;
|
|
|
|
|
m_dataTypeName = DataType::classKeywordStatic();
|
|
|
|
|
m_isResolved = false;
|
2016-06-19 21:33:17 +02:00
|
|
|
m_referenceString = "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Xml Serializing
|
|
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
|
|
|
|
|
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
|
|
|
|
|
bool resolveReferences() override;
|
2020-09-14 11:27:25 +02:00
|
|
|
bool isVectorField() const override;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2016-06-19 21:33:17 +02:00
|
|
|
private:
|
|
|
|
|
FieldType* m_field;
|
|
|
|
|
|
|
|
|
|
// Resolving
|
2020-06-19 07:53:59 +02:00
|
|
|
QString m_referenceString;
|
|
|
|
|
bool m_isResolved;
|
2016-06-19 21:33:17 +02:00
|
|
|
};
|
2015-07-29 14:19:43 +02:00
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmChildField;
|
2015-07-29 14:19:43 +02:00
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmFieldXmlCap<PdmChildField<DataType*>> : public PdmXmlFieldHandle
|
2015-07-29 14:19:43 +02:00
|
|
|
{
|
|
|
|
|
typedef PdmChildField<DataType*> FieldType;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
|
|
|
|
|
: PdmXmlFieldHandle( field, giveOwnership )
|
|
|
|
|
{
|
|
|
|
|
m_field = field;
|
|
|
|
|
m_dataTypeName = DataType::classKeywordStatic();
|
|
|
|
|
}
|
2015-07-29 14:19:43 +02:00
|
|
|
|
|
|
|
|
// Xml Serializing
|
|
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
|
|
|
|
|
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
|
|
|
|
|
bool resolveReferences() override;
|
2018-12-04 14:10:18 +01:00
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
private:
|
|
|
|
|
FieldType* m_field;
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmChildArrayField;
|
2015-07-29 14:19:43 +02:00
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmFieldXmlCap<PdmChildArrayField<DataType*>> : public PdmXmlFieldHandle
|
2015-07-29 14:19:43 +02:00
|
|
|
{
|
|
|
|
|
typedef PdmChildArrayField<DataType*> FieldType;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
|
|
|
|
|
: PdmXmlFieldHandle( field, giveOwnership )
|
|
|
|
|
{
|
|
|
|
|
m_field = field;
|
|
|
|
|
m_dataTypeName = DataType::classKeywordStatic();
|
|
|
|
|
}
|
2015-07-29 14:19:43 +02:00
|
|
|
|
|
|
|
|
// Xml Serializing
|
|
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
|
|
|
|
|
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
|
|
|
|
|
bool resolveReferences() override;
|
2020-09-14 11:27:25 +02:00
|
|
|
bool isVectorField() const override;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
private:
|
|
|
|
|
FieldType* m_field;
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmField;
|
2020-04-01 07:21:49 +02:00
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename DataType>
|
|
|
|
|
class PdmFieldXmlCap<PdmField<std::vector<DataType>>> : public PdmXmlFieldHandle
|
2020-03-31 14:00:44 +02:00
|
|
|
{
|
|
|
|
|
typedef PdmField<std::vector<DataType>> FieldType;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2020-03-31 14:00:44 +02:00
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
|
|
|
|
|
: PdmXmlFieldHandle( field, giveOwnership )
|
|
|
|
|
{
|
2020-03-31 14:00:44 +02:00
|
|
|
m_field = field;
|
|
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
m_dataTypeName = QString( "%1" ).arg( typeid( DataType ).name() );
|
2020-03-31 14:00:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Xml Serializing
|
|
|
|
|
public:
|
2020-06-19 07:53:59 +02:00
|
|
|
void readFieldData( QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory ) override;
|
|
|
|
|
void writeFieldData( QXmlStreamWriter& xmlStream ) const override;
|
|
|
|
|
bool resolveReferences() override;
|
2020-09-14 11:27:25 +02:00
|
|
|
bool isVectorField() const override;
|
2020-06-19 07:53:59 +02:00
|
|
|
|
2020-03-31 14:00:44 +02:00
|
|
|
private:
|
|
|
|
|
FieldType* m_field;
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename FieldType>
|
|
|
|
|
void AddXmlCapabilityToField( FieldType* field )
|
2015-07-29 14:19:43 +02:00
|
|
|
{
|
2020-06-19 07:53:59 +02:00
|
|
|
if ( field->template capability<PdmFieldXmlCap<FieldType>>() == NULL )
|
2015-07-29 14:19:43 +02:00
|
|
|
{
|
2020-06-19 07:53:59 +02:00
|
|
|
new PdmFieldXmlCap<FieldType>( field, true );
|
2015-07-29 14:19:43 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-19 07:53:59 +02:00
|
|
|
template <typename FieldType>
|
|
|
|
|
void RegisterClassWithField( const QString& classKeyword, FieldType* field )
|
2020-02-21 11:01:08 +01:00
|
|
|
{
|
2020-06-19 07:53:59 +02:00
|
|
|
field->setOwnerClass( classKeyword );
|
2020-02-21 11:01:08 +01:00
|
|
|
}
|
|
|
|
|
|
2015-07-29 14:19:43 +02:00
|
|
|
} // End of namespace caf
|
|
|
|
|
|
|
|
|
|
#include "cafInternalPdmXmlFieldCapability.inl"
|