caf: Added assert to guard against forgetting to add the fields using the init field macros

This commit is contained in:
Jacob Støren 2016-05-31 11:28:54 +02:00
parent d90a6041aa
commit 286c434d3a
8 changed files with 40 additions and 8 deletions

View File

@ -40,6 +40,8 @@ DataType* PdmChildArrayField<DataType*>::operator[](size_t index) const
template<typename DataType>
void PdmChildArrayField<DataType*>::push_back(DataType* pointer)
{
assert(isInitializedByInitFieldMacro());
m_pointers.push_back(pointer);
if (pointer) pointer->setAsParentField(this);
}
@ -51,6 +53,8 @@ void PdmChildArrayField<DataType*>::push_back(DataType* pointer)
template<typename DataType>
void PdmChildArrayField<DataType*>::set(size_t index, DataType* pointer)
{
assert(isInitializedByInitFieldMacro());
if (m_pointers[index]) m_pointers[index]->removeAsParentField(this);
m_pointers[index] = pointer;
if (m_pointers[index]) pointer->setAsParentField(this);
@ -63,6 +67,8 @@ void PdmChildArrayField<DataType*>::set(size_t index, DataType* pointer)
template<typename DataType>
void PdmChildArrayField<DataType*>::insert(size_t index, DataType* pointer)
{
assert(isInitializedByInitFieldMacro());
m_pointers.insert(m_pointers.begin()+index, pointer);
if (pointer) pointer->setAsParentField(this);
@ -76,6 +82,8 @@ void PdmChildArrayField<DataType*>::insert(size_t index, DataType* pointer)
template<typename DataType>
void PdmChildArrayField<DataType*>::insert(size_t index, const std::vector<PdmPointer<DataType> >& objects)
{
assert(isInitializedByInitFieldMacro());
m_pointers.insert(m_pointers.begin()+index, objects.begin(), objects.end());
typename std::vector< PdmPointer< DataType > >::iterator it;
@ -114,6 +122,8 @@ size_t PdmChildArrayField<DataType*>::count(const DataType* pointer) const
template<typename DataType>
void PdmChildArrayField<DataType*>::clear()
{
assert(isInitializedByInitFieldMacro());
this->removeThisAsParentField();
m_pointers.clear();
}
@ -124,6 +134,8 @@ void PdmChildArrayField<DataType*>::clear()
template<typename DataType>
void PdmChildArrayField<DataType*>::deleteAllChildObjects()
{
assert(isInitializedByInitFieldMacro());
size_t index;
for (index = 0; index < m_pointers.size(); ++index)
{
@ -141,6 +153,8 @@ void PdmChildArrayField<DataType*>::deleteAllChildObjects()
template<typename DataType>
void PdmChildArrayField<DataType*>::erase(size_t index)
{
assert(isInitializedByInitFieldMacro());
if (m_pointers[index].rawPtr())
{
m_pointers[index].rawPtr()->removeAsParentField(this);
@ -174,6 +188,8 @@ size_t PdmChildArrayField<DataType*>::index(DataType* pointer)
template<typename DataType>
void PdmChildArrayField<DataType*>::removeChildObject(PdmObjectHandle* object)
{
assert(isInitializedByInitFieldMacro());
std::vector< PdmPointer<DataType> > tempPointers;
tempPointers = m_pointers;
@ -215,6 +231,8 @@ void PdmChildArrayField<DataType*>::childObjects(std::vector<PdmObjectHandle*>*
template<typename DataType>
void PdmChildArrayField<DataType*>::insertAt(int indexAfter, PdmObjectHandle* obj)
{
assert(isInitializedByInitFieldMacro());
// This method should assert if obj to insert is not castable to the container type, but since this
// is a virtual method, its implementation is always created and that makes a dyn_cast add the need for
// #include of the header file "everywhere"

View File

@ -47,7 +47,7 @@ public:
// Access operators
/*Conversion*/ operator DataType* () const { return m_fieldValue; }
DataType* operator->() const { return m_fieldValue; }
DataType* operator->() const { return m_fieldValue; }
const PdmPointer<DataType>& operator()() const { return m_fieldValue; }
const PdmPointer<DataType>& v() const { return m_fieldValue; }

View File

@ -67,6 +67,8 @@ caf::PdmChildField<DataType*>::~PdmChildField()
template<typename DataType >
caf::PdmChildField<DataType*>& PdmChildField<DataType*>::operator=(const DataTypePtr & fieldValue)
{
assert(isInitializedByInitFieldMacro());
if (m_fieldValue) m_fieldValue->removeAsParentField(this);
m_fieldValue = fieldValue;
if (m_fieldValue != NULL) m_fieldValue->setAsParentField(this);

View File

@ -42,6 +42,7 @@
#include <vector>
#include <QVariant>
#include <assert.h>
namespace caf
@ -66,18 +67,18 @@ public:
// Assignment
PdmDataValueField& operator= (const PdmDataValueField& other) { m_fieldValue = other.m_fieldValue; return *this; }
PdmDataValueField& operator= (const DataType& fieldValue) { m_fieldValue = fieldValue; return *this; }
PdmDataValueField& operator= (const PdmDataValueField& other) { assert(isInitializedByInitFieldMacro()); m_fieldValue = other.m_fieldValue; return *this; }
PdmDataValueField& operator= (const DataType& fieldValue) { assert(isInitializedByInitFieldMacro()); m_fieldValue = fieldValue; return *this; }
// Basic access
DataType value() const { return m_fieldValue; }
void setValue(const DataType& fieldValue) { m_fieldValue = fieldValue; }
void setValue(const DataType& fieldValue) { assert(isInitializedByInitFieldMacro()); m_fieldValue = fieldValue; }
// Implementation of PdmValueField interface
virtual QVariant toQVariant() const { return PdmValueFieldSpecialization<DataType>::convert(m_fieldValue); }
virtual void setFromQVariant(const QVariant& variant) { PdmValueFieldSpecialization<DataType>::setFromVariant(variant, m_fieldValue); }
virtual QVariant toQVariant() const { assert(isInitializedByInitFieldMacro()); return PdmValueFieldSpecialization<DataType>::convert(m_fieldValue); }
virtual void setFromQVariant(const QVariant& variant) { assert(isInitializedByInitFieldMacro()); PdmValueFieldSpecialization<DataType>::setFromVariant(variant, m_fieldValue); }
virtual bool isReadOnly() const { return false; }
// Access operators

View File

@ -44,6 +44,9 @@ public:
PdmUiFieldHandle* uiCapability();
PdmXmlFieldHandle* xmlCapability();
protected:
bool isInitializedByInitFieldMacro() const { return m_ownerObject != NULL; }
private:
PDM_DISABLE_COPY_AND_ASSIGN(PdmFieldHandle);

View File

@ -32,7 +32,7 @@ public:
// Basic access
void setValue(const DataType& fieldValue) { if (m_valueSetter) m_valueSetter->setValue(fieldValue); }
void setValue(const DataType& fieldValue) { assert(isInitializedByInitFieldMacro()); if (m_valueSetter) m_valueSetter->setValue(fieldValue); }
DataType value() const { assert(m_valueGetter); return m_valueGetter->getValue(); }
// Implementation of PdmValueField interface

View File

@ -54,7 +54,7 @@ public:
// Access operators
/*Conversion*/ operator DataType* () const { return m_fieldValue; }
DataType* operator->() const { return m_fieldValue; }
DataType* operator->() const { return m_fieldValue; }
const PdmPointer<DataType>& operator()() const { return m_fieldValue; }
const PdmPointer<DataType>& v() const { return m_fieldValue; }

View File

@ -28,6 +28,8 @@ caf::PdmPtrField<DataType*>::~PdmPtrField()
template<typename DataType >
void PdmPtrField<DataType*>::setValue(const DataTypePtr& fieldValue)
{
assert(isInitializedByInitFieldMacro());
if (m_fieldValue) m_fieldValue->removeReferencingPtrField(this);
m_fieldValue = fieldValue;
if (m_fieldValue != NULL) m_fieldValue->addReferencingPtrField(this);
@ -39,6 +41,8 @@ void PdmPtrField<DataType*>::setValue(const DataTypePtr& fieldValue)
template<typename DataType >
void PdmPtrField<DataType*>::setRawPtr(PdmObjectHandle* obj)
{
assert(isInitializedByInitFieldMacro());
if (m_fieldValue.notNull()) m_fieldValue.rawPtr()->removeReferencingPtrField(this);
m_fieldValue.setRawPtr(obj);
if (m_fieldValue.notNull()) m_fieldValue.rawPtr()->addReferencingPtrField(this);
@ -51,6 +55,8 @@ void PdmPtrField<DataType*>::setRawPtr(PdmObjectHandle* obj)
template<typename DataType >
caf::PdmPtrField<DataType*>& PdmPtrField<DataType*>::operator=(const DataTypePtr & fieldValue)
{
assert(isInitializedByInitFieldMacro());
if (m_fieldValue) m_fieldValue->removeReferencingPtrField(this);
m_fieldValue = fieldValue;
if (m_fieldValue != NULL) m_fieldValue->addReferencingPtrField(this);
@ -65,6 +71,8 @@ caf::PdmPtrField<DataType*>& PdmPtrField<DataType*>::operator=(const DataTypePtr
template<typename DataType >
caf::PdmPtrField<DataType*>& PdmPtrField<DataType*>::operator=(const FieldDataType & fieldValue)
{
assert(isInitializedByInitFieldMacro());
if (m_fieldValue) m_fieldValue->removeReferencingPtrField(this);
m_fieldValue = fieldValue;
if (m_fieldValue != NULL) m_fieldValue->addReferencingPtrField(this);