123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- //-----------------------------------------------------------------------------
- // (c) 2006 by Basler Vision Technologies
- // Section: Vision Components
- // Project: GenApi
- // Author: Hartmut Nebelung
- // $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 Implementation helpers for CNodeCallback
- \ingroup GenApi_PublicImpl
- Defines a bunch of templates for creating callback-functors taking a INode pointer
- and returning void.
- \note does not work with all stl containers, i.e. std::map
- */
- #ifndef GENAPI_NODECALLBACK_H
- #define GENAPI_NODECALLBACK_H
- #include <GenApi/INode.h>
- namespace GENAPI_NAMESPACE
- {
- //! the type of callback
- typedef enum _ECallbackType
- {
- cbPostInsideLock = 1, //!> callback is fired on leaving the tree inside the lock-guarded area
- cbPostOutsideLock = 2 //!> callback is fired on leaving the tree outside the lock-guarded area
- } ECallbackType;
- /**
- \brief callback body instance for INode pointers
- \ingroup GenApi_PublicImpl
- */
- class CNodeCallback
- {
- public:
- CNodeCallback( INode *pNode, ECallbackType CallbackType ) :
- m_pNode(pNode),
- m_CallbackType( CallbackType )
- {}
- //! virtual destructor
- virtual ~CNodeCallback()
- {};
- //! fires the callback if the type is right
- virtual void operator()( ECallbackType CallbackType ) const = 0;
- //! destroys the object
- virtual void Destroy() = 0;
- //! returns the node the callback is registered to
- INode* GetNode()
- {
- return m_pNode;
- }
- protected:
- //! the node were the callback is installed
- INode *m_pNode;
- //! the type of the callback
- ECallbackType m_CallbackType;
- };
- /***************************************************************************/
- // C Functions as callbacks
- /***************************************************************************/
- /**
- \brief Container for a function pointer
- \ingroup GenApi_PublicImpl
- */
- template <class Function>
- class Function_NodeCallback : public CNodeCallback
- {
- public:
- //! Constructor
- Function_NodeCallback( INode *pNode, const Function& function, ECallbackType CallbackType ) :
- CNodeCallback( pNode, CallbackType ),
- m_pFunction( function )
- {}
- //! execute operation: call the function
- virtual void operator()( ECallbackType CallbackType ) const
- {
- if (m_pFunction && m_CallbackType == CallbackType)
- m_pFunction( m_pNode );
- }
- //! destroys the object
- virtual void Destroy()
- {
- delete this;
- }
- private:
- //! the callback function
- const Function m_pFunction;
- //! no assignment operator
- Function_NodeCallback& operator=(Function_NodeCallback&);
- };
- /*-----------------------------------------------------------------------------*/
- /**
- \brief make a new callback object for C functions
- \ingroup GenApi_PublicImpl
- */
- template <class Function>
- CNodeCallback *make_NodeCallback( INode *pNode, Function function, ECallbackType CallbackType )
- {
- return static_cast<CNodeCallback*>( new Function_NodeCallback<Function>(pNode, function, CallbackType) );
- }
- /*-----------------------------------------------------------------------------*/
- /**
- \brief Register a C-function as a callback
- \ingroup GenApi_PublicUtilities
- */
- template<class Function>
- intptr_t Register( INode* pNode, Function f, ECallbackType CallbackType = cbPostInsideLock )
- {
- CNodeCallback *pCallback(make_NodeCallback(pNode, f, CallbackType));
- return pNode->RegisterCallback(pCallback);
- }
- /***************************************************************************/
- // C++ Member functions as callbacks
- /***************************************************************************/
- /**
- \brief Container for a member function pointer
- \ingroup GenApi_PublicImpl
- */
- template <class Client, class Member>
- class Member_NodeCallback : public CNodeCallback
- {
- public:
- //! Member function type
- typedef void (Client::*PMEMBERFUNC)(INode*);
- //! Constructor
- Member_NodeCallback( INode *pNode, Client& client, Member member, ECallbackType CallbackType ) :
- CNodeCallback( pNode, CallbackType ),
- m_Client(client),
- m_pMemberFunc(member)
- {}
- //! execute operation
- virtual void operator()( ECallbackType CallbackType ) const
- {
- if (m_pMemberFunc && m_CallbackType == CallbackType)
- (m_Client.*m_pMemberFunc)( m_pNode );
- }
- //! destroys the object
- virtual void Destroy()
- {
- delete this;
- }
- private:
- //! The object the method function belongs to
- Client& m_Client;
- //! The method to call
- PMEMBERFUNC m_pMemberFunc;
- //! no assignment operator
- Member_NodeCallback& operator=(Member_NodeCallback&);
- };
- /*-----------------------------------------------------------------------------*/
- /**
- \brief make a new callback object for member functions
- \ingroup GenApi_PublicImpl
- */
- template <class Client, class Member>
- CNodeCallback *make_NodeCallback( INode *pNode, Client& client, Member member, ECallbackType CallbackType )
- {
- return static_cast<CNodeCallback*>( new Member_NodeCallback<Client,Member>(pNode, client, member, CallbackType) );
- }
- /*-----------------------------------------------------------------------------*/
- /**
- \brief Register a C++-member function a callback
- \ingroup GenApi_PublicUtilities
- */
- template<class Client, class Member>
- intptr_t Register( INode* pNode, Client &c, Member m, ECallbackType CallbackType = cbPostInsideLock )
- {
- CNodeCallback *pCallback(make_NodeCallback(pNode, c, m, CallbackType));
- return pNode->RegisterCallback(pCallback);
- }
- //! Unregistering callback by handle
- // definition in Node.cpp
- GENAPI_DECL void Deregister (GENAPI_NAMESPACE::CallbackHandleType pCallbackInfo );
- }
- #endif // GENAPI_NODECALLBACK_H
|