diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmInterfacePointer.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmInterfacePointer.h new file mode 100644 index 0000000000..2125c9fe06 --- /dev/null +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmInterfacePointer.h @@ -0,0 +1,86 @@ +//################################################################################################## +// +// Custom Visualization Core library +// Copyright (C) 2018 Ceetron Solutions AS +// +// This library may be used under the terms of either the GNU General Public License or +// the GNU Lesser General Public License as follows: +// +// GNU General Public License Usage +// This library is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at <> +// for more details. +// +// GNU Lesser General Public License Usage +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU Lesser General Public License at <> +// for more details. +// +//################################################################################################## +#pragma once + +#include "cafPdmPointer.h" + +namespace caf +{ + +template +class PdmInterfacePointer +{ +public: + inline PdmInterfacePointer () : m_iface(nullptr) { } + inline PdmInterfacePointer ( T * iface ) { *this = iface; } + inline PdmInterfacePointer ( const PdmInterfacePointer & other ) { *this = other.p();} + + T* p() const + { + if ( m_implementingPdmObject.notNull() ) + { + return m_iface; + } + else + { + return nullptr; + } + } + + PdmInterfacePointer & operator= ( T* iface ) + { + m_implementingPdmObject = nullptr; + m_iface = nullptr; + if ( iface != nullptr ) + { + m_implementingPdmObject = iface->implementingPdmObject(); + m_iface = iface; + } + return *this; + } + + bool isNull() const { return m_implementingPdmObject.isNull(); } + bool notNull() const { return m_implementingPdmObject.notNull(); } + operator T* () const { return p(); } + T* operator->() const { return p(); } + PdmInterfacePointer & operator= ( const PdmInterfacePointer& other ) { return *this = other.p();} + +private: + T* m_iface; + PdmPointer m_implementingPdmObject; +}; + +} \ No newline at end of file