8#ifndef ATTRIBUTE_ACCESSOR_HELPER_H
9#define ATTRIBUTE_ACCESSOR_HELPER_H
57template <
typename V,
typename T1>
100template <
typename V,
typename T1,
typename T2>
109#include <type_traits>
138template <
typename T,
typename U>
161 const U* value =
dynamic_cast<const U*
>(&val);
162 if (value ==
nullptr)
166 T* obj =
dynamic_cast<T*
>(
object);
171 return DoSet(obj, value);
188 U* value =
dynamic_cast<U*
>(&val);
189 if (value ==
nullptr)
193 const T* obj =
dynamic_cast<const T*
>(
object);
198 return DoGet(obj, value);
210 virtual bool DoSet(T*
object,
const U* v)
const = 0;
219 virtual bool DoGet(
const T*
object, U* v)
const = 0;
236template <
typename V,
typename T,
typename U>
248 MemberVariable(U T::* memberVariable)
250 m_memberVariable(memberVariable)
255 bool DoSet(T*
object,
const V* v)
const override
258 bool ok = v->GetAccessor(tmp);
263 (
object->*m_memberVariable) = tmp;
267 bool DoGet(
const T*
object, V* v)
const override
269 v->Set(
object->*m_memberVariable);
273 bool HasGetter()
const override
278 bool HasSetter()
const override
283 U T::* m_memberVariable;
301template <
typename V,
typename T,
typename U>
302inline Ptr<const AttributeAccessor>
313 MemberMethod(U (T::*getter)()
const)
320 bool DoSet(T* ,
const V* )
const override
325 bool DoGet(
const T*
object, V* v)
const override
331 bool HasGetter()
const override
336 bool HasSetter()
const override
341 U (T::*m_getter)()
const;
360template <
typename V,
typename T,
typename U>
361inline Ptr<const AttributeAccessor>
372 MemberMethod(
void (T::*setter)(U))
379 bool DoSet(T*
object,
const V* v)
const override
382 bool ok = v->GetAccessor(tmp);
387 (
object->*m_setter)(tmp);
391 bool DoGet(
const T* , V* )
const override
396 bool HasGetter()
const override
401 bool HasSetter()
const override
406 void (T::*m_setter)(U);
429template <
typename W,
typename T,
typename U,
typename V>
430inline Ptr<const AttributeAccessor>
445 MemberMethod(
void (T::*setter)(U), V (T::*getter)()
const)
453 bool DoSet(T*
object,
const W* v)
const override
456 bool ok = v->GetAccessor(tmp);
461 (
object->*m_setter)(tmp);
465 bool DoGet(
const T*
object, W* v)
const override
467 v->Set((
object->*m_getter)());
471 bool HasGetter()
const override
476 bool HasSetter()
const override
481 void (T::*m_setter)(U);
482 V (T::*m_getter)()
const;
492template <
typename W,
typename T,
typename U,
typename V>
493inline Ptr<const AttributeAccessor>
516template <
typename W,
typename T,
typename U,
typename V>
517inline Ptr<const AttributeAccessor>
532 MemberMethod(
bool (T::*setter)(U), V (T::*getter)()
const)
540 bool DoSet(T*
object,
const W* v)
const override
543 bool ok = v->GetAccessor(tmp);
548 ok = (
object->*m_setter)(tmp);
552 bool DoGet(
const T*
object, W* v)
const override
554 v->Set((
object->*m_getter)());
558 bool HasGetter()
const override
563 bool HasSetter()
const override
568 bool (T::*m_setter)(U);
569 V (T::*m_getter)()
const;
579template <
typename W,
typename T,
typename U,
typename V>
580inline Ptr<const AttributeAccessor>
586template <
typename V,
typename T1>
587inline Ptr<const AttributeAccessor>
593template <
typename V,
typename T1,
typename T2>
594inline Ptr<const AttributeAccessor>
ns3::AttributeValue, ns3::AttributeAccessor and ns3::AttributeChecker declarations.
Basic functionality for accessing class attributes via class data members, or get functor/set methods...
bool Set(ObjectBase *object, const AttributeValue &val) const override
Set the underlying member to the argument AttributeValue.
AccessorHelper()
Constructor.
virtual bool DoGet(const T *object, U *v) const =0
Getter implementation.
bool Get(const ObjectBase *object, AttributeValue &val) const override
Get the value of the underlying member into the AttributeValue.
virtual bool DoSet(T *object, const U *v) const =0
Setter implementation.
Hold a value for an Attribute.
Anchor the ns-3 type and attribute system.
Smart pointer class similar to boost::intrusive_ptr.
Ptr< const AttributeAccessor > DoMakeAccessorHelperOne(U T::*memberVariable)
MakeAccessorHelper implementation for a class data member.
Ptr< const AttributeAccessor > MakeAccessorHelper(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > DoMakeAccessorHelperTwo(void(T::*setter)(U), V(T::*getter)() const)
MakeAccessorHelper implementation with a class get functor method and a class set method returning vo...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
The non-const and non-reference type equivalent to T.
std::remove_cvref_t< T > Result
The non-const, non reference type.