//----------------------------------------------------------------------------- // (c) 2006 by Basler Vision Technologies // Section: Vision Components // Project: GenApi // Author: Fritz Dierks // $Header$ // // License: This file is published under the license of the EMVA GenICam Standard Group. // A text file describing the legal terms is included in your installation as 'GenICam_license.pdf'. // If for some reason you are missing this file please contact the EMVA or visit the website // (http://www.genicam.org) for a full copy. // // THIS SOFTWARE IS PROVIDED BY THE EMVA GENICAM STANDARD GROUP "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE EMVA GENICAM STANDARD GROUP // OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. //----------------------------------------------------------------------------- /*! \file \brief Definition of template CPointer \ingroup GenApi_PublicUtilities */ #ifndef GENAPI_POINTER_H #define GENAPI_POINTER_H #include #include #include #include #include namespace GENAPI_NAMESPACE { //************************************************************* // CPointer class //************************************************************* /** \brief Encapsulates a GenApi pointer dealing with the dynamic_cast automatically \ingroup GenApi_PublicUtilities */ template class CPointer { public: //! Default constructor. CPointer(void) throw() : m_pT( NULL ) { } //! Constructor from INode pointer type. CPointer( B *pB ) : m_pT( dynamic_cast(pB) ) { } virtual ~CPointer(void) { } //! Assign INode Pointer void operator=( B *pB ) { m_pT = dynamic_cast(pB); } //! Dereferencing operator T*(void) const { if (NULL == m_pT) throw LOGICAL_ERROR_EXCEPTION( "NULL pointer dereferenced" ); return m_pT; } //! Dereferencing T& operator*(void) const { if (NULL == m_pT) throw LOGICAL_ERROR_EXCEPTION( "NULL pointer dereferenced" ); return *m_pT; } //! Dereferencing T& operator()(void) const { if (NULL == m_pT) throw LOGICAL_ERROR_EXCEPTION( "NULL pointer dereferenced" ); return *m_pT; } //! Dereferencing T* operator->(void) const { if (NULL == m_pT) throw LOGICAL_ERROR_EXCEPTION( "NULL pointer dereferenced" ); return m_pT; } //! true if the pointer is valid bool IsValid() const throw() { return m_pT != NULL; } //! true if the pointer is valid operator bool(void) const throw() { return m_pT != NULL; } //! pointer equal bool operator==(T* pT) const { return m_pT == pT; } //! pointer equal bool operator==(const CPointer &rT) const { return m_pT == rT.m_pT; } //! pointer equal bool operator==(int nMustBeNull) const { if (0 != nMustBeNull) throw LOGICAL_ERROR_EXCEPTION( "argument must be NULL" ); return NULL == m_pT; } protected: //! Underlying raw pointer. T* m_pT; }; //************************************************************* // Smartpointer for all interface //************************************************************* //! \addtogroup GenApi_PublicUtilities //! \{ //! SmartPointer for IBase interface pointer typedef CPointer CBasePtr; //! SmartPointer for INode interface pointer typedef CPointer CNodePtr; //! SmartPointer for IValue interface pointer typedef CPointer CValuePtr; //! SmartPointer for ICategory interface pointer typedef CPointer CCategoryPtr; //! SmartPointer for IBoolean interface pointer typedef CPointer CBooleanPtr; //! SmartPointer for IInteger interface pointer typedef CPointer CIntegerPtr; //! SmartPointer for IString interface pointer typedef CPointer CStringPtr; //! SmartPointer for IRegister interface pointer typedef CPointer CRegisterPtr; //! SmartPointer for IEnumeration interface pointer typedef CPointer CEnumerationPtr; //! SmartPointer for IEnumEntry interface pointer typedef CPointer CEnumEntryPtr; //! SmartPointer for IPort interface pointer typedef CPointer CPortPtr; //! SmartPointer for IPortReplay interface pointer typedef CPointer CPortReplayPtr; //! SmartPointer for IPortRecorder interface pointer typedef CPointer CPortRecorderPtr; //! SmartPointer for IPortWriteList interface pointer typedef CPointer CPortWriteListPtr; //! SmartPointer for IChunkPort interface pointer typedef CPointer CChunkPortPtr; //! SmartPointer for INodeMap interface pointer typedef CPointer CNodeMapPtr; //! SmartPointer for IDeviceInfo interface pointer typedef CPointer CDeviceInfoPtr; //! SmartPointer for IUserData interface pointer typedef CPointer CNodeMapUserDataPtr; //! SmartPointer for IUserData interface pointer typedef CPointer CNodeUserDataPtr; //! SmartPointer for ISelector interface pointer typedef CPointer CSelectorPtr; //! SmartPointer for ICommand interface pointer typedef CPointer CCommandPtr; //! SmartPointer for IFloat interface pointer class CFloatPtr : public CPointer { public: //! Default constructor. CFloatPtr() throw() : CPointer( ) { } //! Constructor from IBase pointer type. CFloatPtr( IBase *pB ) : CPointer( pB ) { } //! Assign IBase Pointer void operator=( IBase *pB ) { CPointer::operator =(pB); } //! gets the interface of an integer alias node. IInteger *GetIntAlias() { return dynamic_cast(m_pT->GetNode()->GetCastAlias()); } //! gets the interface of an enum alias node. IEnumeration *GetEnumAlias() { return dynamic_cast(m_pT->GetNode()->GetCastAlias()); } }; //! \} //! \addtogroup GenApi_PublicImpl //! \{ //! SmartPointer for IPortConstruct interface pointer typedef CPointer CPortConstructPtr; //! Returns the name of the main interface as string //! DEPRECATED, use IBase::GetPrincipalInterfaceType() instead inline GENICAM_NAMESPACE::gcstring GetInterfaceName(IBase *pBase) { # ifdef _MSC_VER # pragma warning (push) // icc -W4 complains: controlling expression is constant # pragma warning (disable : 279) # endif assert(pBase && "don't call this with a NULL pointer"); # ifdef _MSC_VER # pragma warning (pop) # endif CNodePtr ptrNode(pBase); switch(ptrNode->GetPrincipalInterfaceType()) { case intfIValue: return GENICAM_NAMESPACE::gcstring("IValue"); case intfIInteger: return GENICAM_NAMESPACE::gcstring("IInteger"); case intfIBoolean: return GENICAM_NAMESPACE::gcstring("IBoolean"); case intfICommand: return GENICAM_NAMESPACE::gcstring("ICommand"); case intfIFloat: return GENICAM_NAMESPACE::gcstring("IFloat"); case intfIString: return GENICAM_NAMESPACE::gcstring("IString"); case intfIRegister: return GENICAM_NAMESPACE::gcstring("IRegister"); case intfICategory: return GENICAM_NAMESPACE::gcstring("ICategory"); case intfIEnumeration: return GENICAM_NAMESPACE::gcstring("IEnumeration"); case intfIEnumEntry: return GENICAM_NAMESPACE::gcstring("IEnumEntry"); case intfIPort: return GENICAM_NAMESPACE::gcstring("IPort"); // Do not use this pragma in public header files (warnings in depend projects): #pragma BullseyeCoverage off case intfIBase: default: return GENICAM_NAMESPACE::gcstring("IBase"); // Do not use this pragma in public header files (warnings in depend projects): #pragma BullseyeCoverage on } } //! Checks if a node is readable template inline bool IsReadable( const CPointer& ptr) { return ptr.IsValid() && IsReadable( ptr->GetAccessMode() ); } //! Checks if a node is Writable template inline bool IsWritable( const CPointer& ptr) { return ptr.IsValid() && IsWritable( ptr->GetAccessMode() ); } //! Checks if a node is Implemented template inline bool IsImplemented( const CPointer& ptr) { return ptr.IsValid() && IsImplemented( ptr->GetAccessMode() ); } //! Checks if a node is Available template inline bool IsAvailable( const CPointer& ptr) { return ptr.IsValid() && IsAvailable( ptr->GetAccessMode() ); } //! \} } #endif // ifndef GENAPI_POINTER_H