00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef CNTM_GENERICMETHODNOREFPTR_H
00015 #define CNTM_GENERICMETHODNOREFPTR_H
00016 #include <Cntm/Utils/SignatureInfo.h>
00017 #include <Cntm/RefCount/GenericPtr/GenericNoRefPtr.h>
00018 #include <Cntm/RefCount/GenericPtr/GenericMethodRefPtr.h>
00019
00020 namespace Cntm
00021 {
00022
00023 template < typename SignatureT >
00024 class GenericMethodRefPtr;
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 template < typename SignatureT >
00038 class GenericMethodNoRefPtr
00039 {
00040 public:
00041
00042
00043
00044
00045 class Closure
00046 {
00047 };
00048
00049 typedef SignatureT SignatureType;
00050 typedef SignatureInfo < SignatureT > SignInfo;
00051 typedef typename SignInfo::template Method < Closure > ::Pointer ClosureMethod;
00052
00053
00054
00055
00056 GenericMethodNoRefPtr(): method(NULL) {}
00057
00058
00059
00060
00061 template < typename ClassT >
00062 GenericMethodNoRefPtr(const RefPtr < ClassT > & ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method):
00063 genericPtr(ObjectPtr), method(reinterpret_cast<ClosureMethod>(Method)) {}
00064
00065
00066
00067
00068 template < typename ClassT >
00069 GenericMethodNoRefPtr(ClassT* ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method):
00070 genericPtr(ObjectPtr), method(reinterpret_cast<ClosureMethod>(Method)) {}
00071
00072
00073
00074
00075 GenericMethodNoRefPtr(const GenericMethodRefPtr < SignatureT > & Src):
00076 genericPtr(Src.GenericPtr()), method(reinterpret_cast<ClosureMethod>(Src.Method())) {}
00077
00078
00079
00080
00081 GenericMethodNoRefPtr(const GenericMethodNoRefPtr < SignatureT > & Src):
00082 genericPtr(Src.GenericPtr()), method(Src.Method()) {}
00083
00084
00085
00086
00087 GenericMethodNoRefPtr < SignatureT > & operator = (const GenericMethodRefPtr < SignatureT > & Src)
00088 {
00089 genericPtr = Src.GenericPtr();
00090 method = reinterpret_cast<ClosureMethod>(Src.Method());
00091 return *this;
00092 }
00093
00094
00095
00096
00097 GenericMethodNoRefPtr < SignatureT > & operator = (const GenericMethodNoRefPtr < SignatureT > & Src)
00098 {
00099 genericPtr = Src.GenericPtr();
00100 method = Src.Method();
00101 return *this;
00102 }
00103
00104
00105
00106
00107 operator bool () const
00108 {
00109 return (bool)genericPtr;
00110 }
00111
00112
00113
00114
00115 bool operator ! () const
00116 {
00117 return !genericPtr;
00118 }
00119
00120
00121
00122
00123 bool operator == (const GenericMethodRefPtr < SignatureT > & Ptr) const
00124 {
00125 return genericPtr == Ptr.GenericPtr() && method == reinterpret_cast<ClosureMethod>(Ptr.Method());
00126 }
00127
00128
00129
00130
00131 bool operator == (const GenericMethodNoRefPtr < SignatureT > & Ptr) const
00132 {
00133 return genericPtr == Ptr.GenericPtr() && method == Ptr.Method();
00134 }
00135
00136
00137
00138
00139 bool operator != (const GenericMethodRefPtr < SignatureT > & Ptr) const
00140 {
00141 return !(*this == Ptr);
00142 }
00143
00144
00145
00146
00147 bool operator != (const GenericMethodNoRefPtr < SignatureT > & Ptr) const
00148 {
00149 return !(*this == Ptr);
00150 }
00151
00152
00153
00154
00155 const GenericNoRefPtr& GenericPtr() const
00156 {
00157 return genericPtr;
00158 }
00159
00160
00161
00162
00163 Closure* Object() const
00164 {
00165 return reinterpret_cast<Closure*>(genericPtr.Pointer());
00166 }
00167
00168
00169
00170
00171 ClosureMethod Method() const
00172 {
00173 return method;
00174 }
00175
00176
00177
00178
00179 template < typename ClassT >
00180 void Set(const RefPtr < ClassT > & ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method)
00181 {
00182 genericPtr = ObjectPtr;
00183 method = reinterpret_cast<ClosureMethod>(Method);
00184 }
00185
00186
00187
00188
00189 template < typename ClassT >
00190 void Set(ClassT* ObjectPtr, typename SignInfo::template Method < ClassT > ::Pointer Method)
00191 {
00192 genericPtr = ObjectPtr;
00193 method = reinterpret_cast<ClosureMethod>(Method);
00194 }
00195
00196
00197
00198
00199 template < typename ClassT >
00200 void Set(const ClassT& Object, typename SignInfo::template Method < ClassT > ::Pointer Method)
00201 {
00202 genericPtr = const_cast<ClassT*>(&Object);
00203 method = reinterpret_cast<ClosureMethod>(Method);
00204 }
00205
00206
00207
00208
00209 void SetNull()
00210 {
00211 genericPtr.SetNull();
00212 }
00213
00214 private:
00215
00216
00217
00218 GenericNoRefPtr genericPtr;
00219
00220
00221
00222 ClosureMethod method;
00223 };
00224
00225 }
00226
00227 #endif //CNTM_GENERICMETHODNOREFPTR_H