Files
ResInsight/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafInternalPdmXmlFieldCapability.h

208 lines
5.4 KiB
C
Raw Normal View History

#pragma once
#include "cafInternalPdmXmlFieldReaderWriter.h"
#include "cafPdmXmlFieldHandle.h"
#include <typeinfo>
namespace caf
{
2020-06-19 07:53:59 +02:00
template <typename FieldType>
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-06-19 07:53:59 +02:00
m_field = field;
m_dataTypeName = QString( "%1" ).arg( typeid( typename FieldType::FieldDataType ).name() );
}
// 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;
bool isVectorField() const override;
private:
FieldType* m_field;
};
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmPtrField;
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmFieldXmlCap<PdmPtrField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmPtrField<DataType*> FieldType;
2020-06-19 07:53:59 +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;
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;
QString referenceString() const override;
private:
FieldType* m_field;
// Resolving
2020-06-19 07:53:59 +02:00
QString m_referenceString;
bool m_isResolved;
};
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmPtrArrayField;
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmFieldXmlCap<PdmPtrArrayField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmPtrArrayField<DataType*> FieldType;
2020-06-19 07:53:59 +02:00
public:
2020-06-19 07:53:59 +02:00
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
2020-06-19 07:53:59 +02:00
m_field = field;
m_dataTypeName = DataType::classKeywordStatic();
m_isResolved = false;
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;
bool isVectorField() const override;
2020-06-19 07:53:59 +02:00
private:
FieldType* m_field;
// Resolving
2020-06-19 07:53:59 +02:00
QString m_referenceString;
bool m_isResolved;
};
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmChildField;
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmFieldXmlCap<PdmChildField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmChildField<DataType*> FieldType;
2020-06-19 07:53:59 +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();
}
// 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;
private:
FieldType* m_field;
};
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmChildArrayField;
2020-06-19 07:53:59 +02:00
template <typename DataType>
class PdmFieldXmlCap<PdmChildArrayField<DataType*>> : public PdmXmlFieldHandle
{
typedef PdmChildArrayField<DataType*> FieldType;
2020-06-19 07:53:59 +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();
}
// 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;
bool isVectorField() const override;
2020-06-19 07:53:59 +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
{
typedef PdmField<std::vector<DataType>> FieldType;
2020-06-19 07:53:59 +02:00
public:
2020-06-19 07:53:59 +02:00
PdmFieldXmlCap( FieldType* field, bool giveOwnership )
: PdmXmlFieldHandle( field, giveOwnership )
{
m_field = field;
2020-06-19 07:53:59 +02:00
m_dataTypeName = QString( "%1" ).arg( typeid( DataType ).name() );
}
// 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;
bool isVectorField() const override;
2020-06-19 07:53:59 +02:00
private:
FieldType* m_field;
};
2020-06-19 07:53:59 +02:00
template <typename FieldType>
void AddXmlCapabilityToField( FieldType* field )
{
2020-06-19 07:53:59 +02:00
if ( field->template capability<PdmFieldXmlCap<FieldType>>() == NULL )
{
2020-06-19 07:53:59 +02:00
new PdmFieldXmlCap<FieldType>( field, true );
}
}
2020-06-19 07:53:59 +02:00
template <typename FieldType>
void RegisterClassWithField( const QString& classKeyword, FieldType* field )
{
2020-06-19 07:53:59 +02:00
field->setOwnerClass( classKeyword );
}
} // End of namespace caf
#include "cafInternalPdmXmlFieldCapability.inl"