00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _SB_DELEGATE_H_
00025 #define _SB_DELEGATE_H_
00026
00027 #include <Inventor/SbDelegatePtrFunImpl.h>
00028 #include <Inventor/SbDelegateMemberFunImpl.h>
00030 namespace inventor
00031 {
00032 namespace helper
00033 {
00034
00040 template<typename ReturnType, typename ArgType>
00041
00042 {
00043 public:
00044
00046 SbDelegate()
00047 {
00048 }
00049
00051 SbDelegate( const SbDelegate<ReturnType, ArgType>& other )
00052 : m_delegateImpl ( other.m_delegateImpl->clone() )
00053 {
00054 }
00055
00062 SbDelegate(ReturnType (*f)(ArgType))
00063 {
00064 if ( f != NULL )
00065 m_delegateImpl = new inventor::impl::SbDelegatePtrFunImpl<ReturnType, ArgType>(f);
00066 else
00067 m_delegateImpl = NULL;
00068 }
00069
00080 template<typename ClassType>
00081 SbDelegate(ClassType& a, ReturnType (ClassType::*f)(ArgType))
00082 {
00083 if ( f != NULL )
00084 m_delegateImpl = new inventor::impl::SbDelegateMemberFunImpl<ReturnType, ArgType, ClassType>(a, f);
00085 else
00086 m_delegateImpl = NULL;
00087 }
00088
00093 ReturnType operator()(ArgType arg) const
00094 {
00095 if ( m_delegateImpl.ptr() != NULL )
00096 return m_delegateImpl->call(arg);
00097 else
00098 return ReturnType();
00099 }
00100
00105 bool equal(ReturnType (*f)(ArgType)) const
00106 {
00107 if ( m_delegateImpl.ptr() == NULL )
00108 return (f == NULL);
00109
00110 inventor::impl::SbDelegatePtrFunImpl<ReturnType, ArgType>* delegatePtrFun = dynamic_cast< inventor::impl::SbDelegatePtrFunImpl<ReturnType, ArgType>* >(m_delegateImpl.ptr());
00111 if ( delegatePtrFun != NULL )
00112 return delegatePtrFun->equal(f);
00113
00114 return false;
00115 }
00116
00121 template<typename ClassType>
00122 bool equal(ClassType& a, ReturnType (ClassType::*f)(ArgType)) const
00123 {
00124 if ( m_delegateImpl.ptr() == NULL )
00125 return (f == NULL);
00126
00127 inventor::impl::SbDelegateMemberFunImpl<ReturnType, ArgType, ClassType>* delegateMemberFun = NULL;
00128 delegateMemberFun = dynamic_cast< inventor::impl::SbDelegateMemberFunImpl<ReturnType, ArgType, ClassType>* >(m_delegateImpl.ptr());
00129 if ( delegateMemberFun != NULL )
00130 return delegateMemberFun->equal(a, f);
00131 else
00132 return false;
00133 }
00134
00135 private:
00136
00138 SoRef< inventor::impl::SbDelegateImpl<ReturnType, ArgType> > m_delegateImpl;
00139 };
00140
00141 }
00142 }
00144 #endif // _SB_DELEGATE_H_
00145
00146