20 #ifndef ATTRIBUTE_ACCESSOR_HELPER_H
21 #define ATTRIBUTE_ACCESSOR_HELPER_H
23 #include "attribute.h"
30 template <
typename V,
typename T1>
31 Ptr<const AttributeAccessor>
32 MakeAccessorHelper (T1 a1);
37 template <
typename V,
typename T1,
typename T2>
38 Ptr<const AttributeAccessor>
39 MakeAccessorHelper (T1 a1, T2 a2);
47 #include "type-traits.h"
57 template <
typename T,
typename U>
64 const U *value =
dynamic_cast<const U *
> (&val);
69 T *obj =
dynamic_cast<T *
> (object);
74 return DoSet (obj, value);
78 U *value =
dynamic_cast<U *
> (&val);
83 const T *obj =
dynamic_cast<const T *
> (object);
88 return DoGet (obj, value);
92 virtual bool DoSet (T *
object,
const U *v)
const = 0;
93 virtual bool DoGet (
const T *
object, U *v)
const = 0;
96 template <
typename V,
typename T,
typename U>
97 Ptr<const AttributeAccessor>
98 DoMakeAccessorHelperOne (U T::*memberVariable)
100 class MemberVariable :
public AccessorHelper<T,V>
103 MemberVariable (U T::*memberVariable)
104 : AccessorHelper<T,V> (),
105 m_memberVariable (memberVariable)
108 virtual bool DoSet (T *
object,
const V *v)
const {
109 typename AccessorTrait<U>::Result tmp;
110 bool ok = v->GetAccessor (tmp);
115 (
object->*m_memberVariable) = tmp;
118 virtual bool DoGet (
const T *
object, V *v)
const {
119 v->Set (object->*m_memberVariable);
122 virtual bool HasGetter (
void)
const {
125 virtual bool HasSetter (
void)
const {
129 U T::*m_memberVariable;
131 return Ptr<const AttributeAccessor> (
new MemberVariable (memberVariable),
false);
134 template <
typename V,
typename T,
typename U>
135 Ptr<const AttributeAccessor>
136 DoMakeAccessorHelperOne (U (T::*getter)(
void)
const)
138 class MemberMethod :
public AccessorHelper<T,V>
141 MemberMethod (U (T::*getter)(
void)
const)
142 : AccessorHelper<T,V> (),
146 virtual bool DoSet (T *
object,
const V *v)
const {
149 virtual bool DoGet (
const T *
object, V *v)
const {
150 v->Set ((object->*m_getter)());
153 virtual bool HasGetter (
void)
const {
156 virtual bool HasSetter (
void)
const {
159 U (T::*m_getter)(void)
const;
161 return Ptr<const AttributeAccessor> (
new MemberMethod (getter),
false);
165 template <
typename V,
typename T,
typename U>
166 Ptr<const AttributeAccessor>
167 DoMakeAccessorHelperOne (
void (T::*setter)(U))
169 class MemberMethod :
public AccessorHelper<T,V>
172 MemberMethod (
void (T::*setter)(U))
173 : AccessorHelper<T,V> (),
177 virtual bool DoSet (T *
object,
const V *v)
const {
178 typename AccessorTrait<U>::Result tmp;
179 bool ok = v->GetAccessor (tmp);
184 (
object->*m_setter)(tmp);
187 virtual bool DoGet (
const T *
object, V *v)
const {
190 virtual bool HasGetter (
void)
const {
193 virtual bool HasSetter (
void)
const {
196 void (T::*m_setter)(U);
198 return Ptr<const AttributeAccessor> (
new MemberMethod (setter),
false);
201 template <
typename W,
typename T,
typename U,
typename V>
202 Ptr<const AttributeAccessor>
203 DoMakeAccessorHelperTwo (
void (T::*setter)(U),
204 V (T::*getter)(
void)
const)
206 class MemberMethod :
public AccessorHelper<T,W>
209 MemberMethod (
void (T::*setter)(U),
210 V (T::*getter)(
void)
const)
211 : AccessorHelper<T,W> (),
216 virtual bool DoSet (T *
object,
const W *v)
const {
217 typename AccessorTrait<U>::Result tmp;
218 bool ok = v->GetAccessor (tmp);
223 (
object->*m_setter)(tmp);
226 virtual bool DoGet (
const T *
object, W *v)
const {
227 v->Set ((object->*m_getter)());
230 virtual bool HasGetter (
void)
const {
233 virtual bool HasSetter (
void)
const {
236 void (T::*m_setter)(U);
237 V (T::*m_getter)(void)
const;
239 return Ptr<const AttributeAccessor> (
new MemberMethod (setter, getter),
false);
242 template <
typename W,
typename T,
typename U,
typename V>
243 Ptr<const AttributeAccessor>
244 DoMakeAccessorHelperTwo (V (T::*getter)(
void)
const,
245 void (T::*setter)(U))
247 return DoMakeAccessorHelperTwo<W> (setter, getter);
250 template <
typename W,
typename T,
typename U,
typename V>
251 Ptr<const AttributeAccessor>
252 DoMakeAccessorHelperTwo (
bool (T::*setter)(U),
253 V (T::*getter)(
void)
const)
255 class MemberMethod :
public AccessorHelper<T,W>
258 MemberMethod (
bool (T::*setter)(U),
259 V (T::*getter)(
void)
const)
260 : AccessorHelper<T,W> (),
265 virtual bool DoSet (T *
object,
const W *v)
const {
266 typename AccessorTrait<U>::Result tmp;
267 bool ok = v->GetAccessor (tmp);
272 ok = (
object->*m_setter)(tmp);
275 virtual bool DoGet (
const T *
object, W *v)
const {
276 v->Set ((object->*m_getter)());
279 virtual bool HasGetter (
void)
const {
282 virtual bool HasSetter (
void)
const {
285 bool (T::*m_setter)(U);
286 V (T::*m_getter)(void)
const;
288 return Ptr<const AttributeAccessor> (
new MemberMethod (setter, getter),
false);
291 template <
typename W,
typename T,
typename U,
typename V>
292 Ptr<const AttributeAccessor>
293 DoMakeAccessorHelperTwo (
bool (T::*getter)(
void)
const,
294 void (T::*setter)(U))
296 return DoMakeAccessorHelperTwo<W> (setter, getter);
299 template <
typename V,
typename T1>
300 Ptr<const AttributeAccessor>
301 MakeAccessorHelper (T1 a1)
303 return DoMakeAccessorHelperOne<V> (a1);
306 template <
typename V,
typename T1,
typename T2>
307 Ptr<const AttributeAccessor>
308 MakeAccessorHelper (T1 a1, T2 a2)
310 return DoMakeAccessorHelperTwo<V> (a1, a2);
Hold a value for an Attribute.
implement the ns-3 type and attribute system
virtual bool Get(const ObjectBase *object, AttributeValue &val) const
allow setting and getting the value of an attribute.
virtual bool Set(ObjectBase *object, const AttributeValue &val) const