00001 /***************************************************************************** 00002 * Copyright (C) 2011 by Benjamin Hadorn (b_hadorn@bluewin.ch) 00003 ***************************************************************************** 00004 * Project : Zeus Base Library 00005 * Module : SynchronizeObjectDelegater 00006 * Package : Zeus.ZeusBase.System.Platforms 00007 * Author : Benjamin Hadorn 00008 * Date : 27.12.2011 00009 * System : Zeus-Framework 00010 ***************************************************************************** 00011 * Licence: * 00012 * This library is free software; you can redistribute it and/or modify * 00013 * it under the terms of the GNU Lesser General Public License as * 00014 * published by the Free Software Foundation; either version * 00015 * 2.1 of the License, or (at your option) any later version. * 00016 * * 00017 * This library is distributed in the hope that it will be useful, * 00018 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00019 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00020 * GNU Lesser General Public License for more details. * 00021 * * 00022 * You should have received a copy of the GNU Lesser General Public * 00023 * License along with this library; if not, write to the Free Software * 00024 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA * 00025 *****************************************************************************/ 00026 00027 /***************************************************************************** 00028 * Changes: 00029 * 27.12.2011 bha: created zeus 2.0 00030 *****************************************************************************/ 00031 00032 #ifndef SynchronizeObjectDelegaterHPP 00033 #define SynchronizeObjectDelegaterHPP 00034 00035 #include <zeusbase/System/SynchronizeObject.h> 00036 #include <zeusbase/System/CriticalSection.h> 00037 00038 BEGIN_NAMESPACE_Zeus 00039 00040 /****************************************************************************/ 00043 /****************************************************************************/ 00044 template <class T> class TSynchronizeObjectDelegater : public TSynchronizeObject 00045 { 00046 public: 00047 typedef void (FASTCALL_METHOD T::*ProcessMethod)(); 00048 00049 /************************************************************************/ 00052 /************************************************************************/ 00053 inline TSynchronizeObjectDelegater(T& rThis, ProcessMethod pMethod) 00054 : TSynchronizeObject() 00055 { 00056 m_pThis = &rThis; 00057 m_pMethod = pMethod; 00058 } 00059 00060 /************************************************************************/ 00063 /************************************************************************/ 00064 inline TSynchronizeObjectDelegater(const T& rThis, const ProcessMethod pMethod) 00065 : TSynchronizeObject() 00066 { 00067 m_pThis = (T*)&rThis; 00068 m_pMethod = (ProcessMethod)pMethod; 00069 } 00070 00071 /************************************************************************/ 00074 /************************************************************************/ 00075 inline void checkForError() 00076 { 00077 m_rLock.enter(); 00078 if (this->hasError()) 00079 { 00080 m_pThis = NULL; 00081 } 00082 m_rLock.leave(); 00083 } 00084 00085 /************************************************************************/ 00088 /************************************************************************/ 00089 inline virtual void MQUALIFIER process() 00090 { 00091 m_rLock.enter(); 00092 if (m_pThis != NULL) 00093 { 00094 (*m_pThis.*(m_pMethod))(); 00095 } 00096 m_rLock.leave(); 00097 } 00098 protected: 00099 00100 private: 00101 //This pointer of the delegation 00102 T* m_pThis; 00103 //Method pointer of the delegation 00104 ProcessMethod m_pMethod; 00105 }; 00106 00107 END_NAMESPACE_Zeus 00108 00109 #endif 00110