//----------------------------------------------------------------------------- // Basler pylon SDK // Copyright (c) 2006-2021 Basler AG // http://www.baslerweb.com // Author: HN, AH //----------------------------------------------------------------------------- /*! \file \brief Definition of callback objects. Helper functions used for managing callbacks. Callback objects are used to encapsulate C-style functions or C++ member functions as callbacks. Based on the ideas of Paul Jakubik. */ #ifndef __PYLON_CALLBACK_H__ #define __PYLON_CALLBACK_H__ #if _MSC_VER > 1000 #pragma once #endif #include #include #include #ifdef _MSC_VER # pragma pack(push, PYLON_PACKING) #endif /* _MSC_VER */ namespace Pylon { /* \brief Abstract callback container. This helper class is used to manage device removal callbacks. \see RegisterRemovalCallback() \see IPylonDevice::RegisterRemovalCallback() */ template class Base_Callback1Body { public: //! destructor virtual ~Base_Callback1Body( void ) { }; //! do operation with P1 as argument virtual void operator()( P1 ) const = 0; //! deep copy virtual Base_Callback1Body* clone( void ) const = 0; }; /* \brief Callback object with one parameter P1 This helper class is used to manage device removal callbacks. \see RegisterRemovalCallback() \see IPylonDevice::RegisterRemovalCallback() */ template class Callback1 { public: //! constructor, taking lifetime control of body Callback1( Base_Callback1Body* pBody ) : m_pBody( pBody ) { } //! copy constructor doing deep copy Callback1( const Callback1& callback ) : m_pBody( callback.m_pBody ? callback.m_pBody->clone() : NULL ) { } //! destructor, destroying body ~Callback1( void ) { delete m_pBody; m_pBody = NULL; } //! assignment operator Callback1& operator=( const Callback1& callback ) { if (this != &callback) { delete m_pBody; m_pBody = callback.m_pBody ? callback.m_pBody->clone() : NULL; } return *this; } //! do operation defined in body void operator()( P1 p1 ) { if (m_pBody) (*m_pBody)(p1); else assert( false && "Callback1:Empty body" ); } private: Base_Callback1Body* m_pBody; }; /***************************************************************************/ // C Functions as callbacks /***************************************************************************/ /* \brief Container for a function pointer This helper class is used to manage device removal callbacks. \see RegisterRemovalCallback() \see IPylonDevice::RegisterRemovalCallback() */ template class Function_CallbackBody : public Base_Callback1Body

{ public: //! Constructor Function_CallbackBody( const Function& function ) : m_pFunction( function ) { } //! execute operation: call the function void operator()( P p ) const { if (m_pFunction) m_pFunction( p ); } //! virtual copy constructor Function_CallbackBody* clone( void ) const { return new Function_CallbackBody( *this ); } private: //! the callback function const Function m_pFunction; //! no assignment operator Function_CallbackBody& operator=( Function_CallbackBody& ); }; /* \brief Make a new callback object for C functions This helper function is used to manage device removal callbacks. Use one of the the Pylon::RegisterRemovalCallback() functions to register a callback that is fired in case of a device removal. \see IPylonDevice::RegisterRemovalCallback() \see RegisterRemovalCallback() */ template Callback make_FunctionCallback( Function function ) { return new Function_CallbackBody( function ); } /*-----------------------------------------------------------------------------*/ /***************************************************************************/ // C++ Member functions as callbacks /***************************************************************************/ /* \brief Container for a member function pointer This helper class is used to manage device removal callbacks. \see RegisterRemovalCallback() \see IPylonDevice::RegisterRemovalCallback() */ template class Member_CallbackBody : public Base_Callback1Body

{ public: //! Member function type typedef void (Client::* PMEMBERFUNC)(P); //! Constructor Member_CallbackBody( Client& client, Member member ) : m_Client( client ), m_pMemberFunc( member ) { } //! execute operation void operator()( P pP ) const { if (m_pMemberFunc) (m_Client.*m_pMemberFunc)(pP); } //! virtual copy constructor Member_CallbackBody* clone() const { return new Member_CallbackBody( m_Client, m_pMemberFunc ); } private: //! The object the method function belongs to Client& m_Client; //! The method to call PMEMBERFUNC m_pMemberFunc; //! no assignment operator Member_CallbackBody& operator=( Member_CallbackBody& ); //! no copy constructor Member_CallbackBody( const Member_CallbackBody& ); }; /*-----------------------------------------------------------------------------*/ /* \brief Make a new callback object for member functions \brief Make a new callback object for C functions This helper function is used to manage device removal callbacks. Use one of the the Pylon::RegisterRemovalCallback() functions to register a callback that is fired in case of a device removal. \see RegisterRemovalCallback() \see IPylonDevice::RegisterRemovalCallback() */ template Callback make_MemberFunctionCallback( Client& client, Member member ) { return Callback( static_cast*>(new Member_CallbackBody( client, member )) ); } } #ifdef _MSC_VER # pragma pack(pop) #endif /* _MSC_VER */ #endif