NodeCallback.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. //-----------------------------------------------------------------------------
  2. // (c) 2006 by Basler Vision Technologies
  3. // Section: Vision Components
  4. // Project: GenApi
  5. // Author: Hartmut Nebelung
  6. // $Header$
  7. //
  8. // License: This file is published under the license of the EMVA GenICam Standard Group.
  9. // A text file describing the legal terms is included in your installation as 'GenICam_license.pdf'.
  10. // If for some reason you are missing this file please contact the EMVA or visit the website
  11. // (http://www.genicam.org) for a full copy.
  12. //
  13. // THIS SOFTWARE IS PROVIDED BY THE EMVA GENICAM STANDARD GROUP "AS IS"
  14. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  15. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16. // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE EMVA GENICAM STANDARD GROUP
  17. // OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  18. // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  19. // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  20. // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  21. // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  22. // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  23. // POSSIBILITY OF SUCH DAMAGE.
  24. //-----------------------------------------------------------------------------
  25. /*!
  26. \file
  27. \brief Implementation helpers for CNodeCallback
  28. \ingroup GenApi_PublicImpl
  29. Defines a bunch of templates for creating callback-functors taking a INode pointer
  30. and returning void.
  31. \note does not work with all stl containers, i.e. std::map
  32. */
  33. #ifndef GENAPI_NODECALLBACK_H
  34. #define GENAPI_NODECALLBACK_H
  35. #include <GenApi/INode.h>
  36. namespace GENAPI_NAMESPACE
  37. {
  38. //! the type of callback
  39. typedef enum _ECallbackType
  40. {
  41. cbPostInsideLock = 1, //!> callback is fired on leaving the tree inside the lock-guarded area
  42. cbPostOutsideLock = 2 //!> callback is fired on leaving the tree outside the lock-guarded area
  43. } ECallbackType;
  44. /**
  45. \brief callback body instance for INode pointers
  46. \ingroup GenApi_PublicImpl
  47. */
  48. class CNodeCallback
  49. {
  50. public:
  51. CNodeCallback( INode *pNode, ECallbackType CallbackType ) :
  52. m_pNode(pNode),
  53. m_CallbackType( CallbackType )
  54. {}
  55. //! virtual destructor
  56. virtual ~CNodeCallback()
  57. {};
  58. //! fires the callback if the type is right
  59. virtual void operator()( ECallbackType CallbackType ) const = 0;
  60. //! destroys the object
  61. virtual void Destroy() = 0;
  62. //! returns the node the callback is registered to
  63. INode* GetNode()
  64. {
  65. return m_pNode;
  66. }
  67. protected:
  68. //! the node were the callback is installed
  69. INode *m_pNode;
  70. //! the type of the callback
  71. ECallbackType m_CallbackType;
  72. };
  73. /***************************************************************************/
  74. // C Functions as callbacks
  75. /***************************************************************************/
  76. /**
  77. \brief Container for a function pointer
  78. \ingroup GenApi_PublicImpl
  79. */
  80. template <class Function>
  81. class Function_NodeCallback : public CNodeCallback
  82. {
  83. public:
  84. //! Constructor
  85. Function_NodeCallback( INode *pNode, const Function& function, ECallbackType CallbackType ) :
  86. CNodeCallback( pNode, CallbackType ),
  87. m_pFunction( function )
  88. {}
  89. //! execute operation: call the function
  90. virtual void operator()( ECallbackType CallbackType ) const
  91. {
  92. if (m_pFunction && m_CallbackType == CallbackType)
  93. m_pFunction( m_pNode );
  94. }
  95. //! destroys the object
  96. virtual void Destroy()
  97. {
  98. delete this;
  99. }
  100. private:
  101. //! the callback function
  102. const Function m_pFunction;
  103. //! no assignment operator
  104. Function_NodeCallback& operator=(Function_NodeCallback&);
  105. };
  106. /*-----------------------------------------------------------------------------*/
  107. /**
  108. \brief make a new callback object for C functions
  109. \ingroup GenApi_PublicImpl
  110. */
  111. template <class Function>
  112. CNodeCallback *make_NodeCallback( INode *pNode, Function function, ECallbackType CallbackType )
  113. {
  114. return static_cast<CNodeCallback*>( new Function_NodeCallback<Function>(pNode, function, CallbackType) );
  115. }
  116. /*-----------------------------------------------------------------------------*/
  117. /**
  118. \brief Register a C-function as a callback
  119. \ingroup GenApi_PublicUtilities
  120. */
  121. template<class Function>
  122. intptr_t Register( INode* pNode, Function f, ECallbackType CallbackType = cbPostInsideLock )
  123. {
  124. CNodeCallback *pCallback(make_NodeCallback(pNode, f, CallbackType));
  125. return pNode->RegisterCallback(pCallback);
  126. }
  127. /***************************************************************************/
  128. // C++ Member functions as callbacks
  129. /***************************************************************************/
  130. /**
  131. \brief Container for a member function pointer
  132. \ingroup GenApi_PublicImpl
  133. */
  134. template <class Client, class Member>
  135. class Member_NodeCallback : public CNodeCallback
  136. {
  137. public:
  138. //! Member function type
  139. typedef void (Client::*PMEMBERFUNC)(INode*);
  140. //! Constructor
  141. Member_NodeCallback( INode *pNode, Client& client, Member member, ECallbackType CallbackType ) :
  142. CNodeCallback( pNode, CallbackType ),
  143. m_Client(client),
  144. m_pMemberFunc(member)
  145. {}
  146. //! execute operation
  147. virtual void operator()( ECallbackType CallbackType ) const
  148. {
  149. if (m_pMemberFunc && m_CallbackType == CallbackType)
  150. (m_Client.*m_pMemberFunc)( m_pNode );
  151. }
  152. //! destroys the object
  153. virtual void Destroy()
  154. {
  155. delete this;
  156. }
  157. private:
  158. //! The object the method function belongs to
  159. Client& m_Client;
  160. //! The method to call
  161. PMEMBERFUNC m_pMemberFunc;
  162. //! no assignment operator
  163. Member_NodeCallback& operator=(Member_NodeCallback&);
  164. };
  165. /*-----------------------------------------------------------------------------*/
  166. /**
  167. \brief make a new callback object for member functions
  168. \ingroup GenApi_PublicImpl
  169. */
  170. template <class Client, class Member>
  171. CNodeCallback *make_NodeCallback( INode *pNode, Client& client, Member member, ECallbackType CallbackType )
  172. {
  173. return static_cast<CNodeCallback*>( new Member_NodeCallback<Client,Member>(pNode, client, member, CallbackType) );
  174. }
  175. /*-----------------------------------------------------------------------------*/
  176. /**
  177. \brief Register a C++-member function a callback
  178. \ingroup GenApi_PublicUtilities
  179. */
  180. template<class Client, class Member>
  181. intptr_t Register( INode* pNode, Client &c, Member m, ECallbackType CallbackType = cbPostInsideLock )
  182. {
  183. CNodeCallback *pCallback(make_NodeCallback(pNode, c, m, CallbackType));
  184. return pNode->RegisterCallback(pCallback);
  185. }
  186. //! Unregistering callback by handle
  187. // definition in Node.cpp
  188. GENAPI_DECL void Deregister (GENAPI_NAMESPACE::CallbackHandleType pCallbackInfo );
  189. }
  190. #endif // GENAPI_NODECALLBACK_H