00001
00002
00003
00004
00005
00006
00007 #ifndef COH_DETACH_FINALIZER_HPP
00008 #define COH_DETACH_FINALIZER_HPP
00009
00010 #include "coherence/lang/compatibility.hpp"
00011
00012 #include "coherence/lang/FinalizableBlock.hpp"
00013
00014 COH_OPEN_NAMESPACE2(coherence,lang)
00015
00016
00017
00018
00019
00020
00021 template<class T> class DetachFinalizer
00022 : public FinalizableBlock::Finalizer
00023 {
00024
00025
00026 public:
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 DetachFinalizer(T* pDetach = NULL, bool fEscaped = true)
00037 : m_pDetach(pDetach), m_fEscaped(fEscaped)
00038 {
00039 }
00040
00041
00042
00043
00044
00045 virtual ~DetachFinalizer()
00046 {
00047 T* pDetach = m_pDetach;
00048 if (NULL != pDetach)
00049 {
00050 pDetach->_detach(m_fEscaped);
00051 }
00052 }
00053
00054
00055
00056 public:
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 DetachFinalizer* set(T* pDetach, bool fEscaped = true)
00068 {
00069 T* pOld = m_pDetach;
00070 bool fEscapedOld = m_fEscaped;
00071
00072 m_pDetach = pDetach;
00073 m_fEscaped = fEscaped;
00074
00075 if (NULL != pOld)
00076 {
00077 pOld->_detach(fEscapedOld);
00078 }
00079 return this;
00080 }
00081
00082
00083
00084 private:
00085
00086
00087
00088 T* m_pDetach;
00089
00090
00091
00092
00093 bool m_fEscaped;
00094 };
00095
00096 COH_CLOSE_NAMESPACE2
00097
00098 #endif // COH_DETACH_FINALIZER_HPP