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;
238template <
typename V,
typename T,
typename U>
253 MemberVariable(U T::* memberVariable)
256 m_memberVariable(memberVariable)
261 bool DoSet(T*
object,
const V* v)
const override
264 bool ok = v->GetAccessor(tmp);
269 (
object->*m_memberVariable) = tmp;
273 bool DoGet(
const T*
object, V* v)
const override
275 v->Set(
object->*m_memberVariable);
279 bool HasGetter()
const override
284 bool HasSetter()
const override
291 U T::* m_memberVariable;
310template <
typename V,
typename T,
typename U>
311inline Ptr<const AttributeAccessor>
322 MemberMethod(U (T::*getter)()
const)
329 bool DoSet(T* ,
const V* )
const override
334 bool DoGet(
const T*
object, V* v)
const override
340 bool HasGetter()
const override
345 bool HasSetter()
const override
350 U (T::*m_getter)()
const;
369template <
typename V,
typename T,
typename U>
370inline Ptr<const AttributeAccessor>
381 MemberMethod(
void (T::*setter)(U))
388 bool DoSet(T*
object,
const V* v)
const override
391 bool ok = v->GetAccessor(tmp);
396 (
object->*m_setter)(tmp);
400 bool DoGet(
const T* , V* )
const override
405 bool HasGetter()
const override
410 bool HasSetter()
const override
415 void (T::*m_setter)(U);
438template <
typename W,
typename T,
typename U,
typename V>
439inline Ptr<const AttributeAccessor>
454 MemberMethod(
void (T::*setter)(U), V (T::*getter)()
const)
462 bool DoSet(T*
object,
const W* v)
const override
465 bool ok = v->GetAccessor(tmp);
470 (
object->*m_setter)(tmp);
474 bool DoGet(
const T*
object, W* v)
const override
480 bool HasGetter()
const override
485 bool HasSetter()
const override
490 void (T::*m_setter)(U);
491 V (T::*m_getter)()
const;
501template <
typename W,
typename T,
typename U,
typename V>
502inline Ptr<const AttributeAccessor>
525template <
typename W,
typename T,
typename U,
typename V>
526inline Ptr<const AttributeAccessor>
541 MemberMethod(
bool (T::*setter)(U), V (T::*getter)()
const)
549 bool DoSet(T*
object,
const W* v)
const override
552 bool ok = v->GetAccessor(tmp);
557 ok = (
object->*m_setter)(tmp);
561 bool DoGet(
const T*
object, W* v)
const override
563 v->Set((
object->*m_getter)());
567 bool HasGetter()
const override
572 bool HasSetter()
const override
577 bool (T::*m_setter)(U);
578 V (T::*m_getter)()
const;
588template <
typename W,
typename T,
typename U,
typename V>
589inline Ptr<const AttributeAccessor>
595template <
typename V,
typename T1>
596inline Ptr<const AttributeAccessor>
602template <
typename V,
typename T1,
typename T2>
603inline 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.
allow setting and getting the value of an attribute.
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.