00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef TRACE_SOURCE_ACCESSOR_H
00021 #define TRACE_SOURCE_ACCESSOR_H
00022
00023 #include <stdint.h>
00024 #include "callback.h"
00025 #include "ptr.h"
00026
00027 namespace ns3 {
00028
00029 class ObjectBase;
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 class TraceSourceAccessor
00040 {
00041 public:
00042 TraceSourceAccessor ();
00043 virtual ~TraceSourceAccessor ();
00044 void Ref (void) const;
00045 void Unref (void) const;
00046
00047
00048
00049
00050
00051 virtual bool ConnectWithoutContext (ObjectBase *obj, const CallbackBase &cb) const = 0;
00052
00053
00054
00055
00056
00057 virtual bool Connect (ObjectBase *obj, std::string context, const CallbackBase &cb) const = 0;
00058
00059
00060
00061
00062 virtual bool DisconnectWithoutContext (ObjectBase *obj, const CallbackBase &cb) const = 0;
00063
00064
00065
00066
00067
00068 virtual bool Disconnect (ObjectBase *obj, std::string context, const CallbackBase &cb) const = 0;
00069 private:
00070 mutable uint32_t m_count;
00071 };
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 template <typename T>
00083 Ptr<const TraceSourceAccessor> MakeTraceSourceAccessor (T a);
00084
00085 }
00086
00087 namespace ns3 {
00088
00089 template <typename T, typename SOURCE>
00090 Ptr<const TraceSourceAccessor>
00091 DoMakeTraceSourceAccessor (SOURCE T::*a)
00092 {
00093 struct Accessor : public TraceSourceAccessor
00094 {
00095 virtual bool ConnectWithoutContext (ObjectBase *obj, const CallbackBase &cb) const {
00096 T *p = dynamic_cast<T*> (obj);
00097 if (p == 0)
00098 {
00099 return false;
00100 }
00101 (p->*m_source).ConnectWithoutContext (cb);
00102 return true;
00103 }
00104 virtual bool Connect (ObjectBase *obj, std::string context, const CallbackBase &cb) const {
00105 T *p = dynamic_cast<T*> (obj);
00106 if (p == 0)
00107 {
00108 return false;
00109 }
00110 (p->*m_source).Connect (cb, context);
00111 return true;
00112 }
00113 virtual bool DisconnectWithoutContext (ObjectBase *obj, const CallbackBase &cb) const {
00114 T *p = dynamic_cast<T*> (obj);
00115 if (p == 0)
00116 {
00117 return false;
00118 }
00119 (p->*m_source).DisconnectWithoutContext (cb);
00120 return true;
00121 }
00122 virtual bool Disconnect (ObjectBase *obj, std::string context, const CallbackBase &cb) const {
00123 T *p = dynamic_cast<T*> (obj);
00124 if (p == 0)
00125 {
00126 return false;
00127 }
00128 (p->*m_source).Disconnect (cb, context);
00129 return true;
00130 }
00131 SOURCE T::*m_source;
00132 } *accessor = new Accessor ();
00133 accessor->m_source = a;
00134 return Ptr<const TraceSourceAccessor> (accessor, false);
00135 }
00136
00137 template <typename T>
00138 Ptr<const TraceSourceAccessor> MakeTraceSourceAccessor (T a)
00139 {
00140 return DoMakeTraceSourceAccessor (a);
00141 }
00142
00143 }
00144
00145
00146 #endif