/* * Copyright (c) 2008 INRIA * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Authors: Mathieu Lacage */ #ifndef NS_POINTER_H #define NS_POINTER_H #include "attribute.h" #include "object.h" /** * \file * \ingroup attribute_Pointer * ns3::PointerValue attribute value declarations and template implementations. */ namespace ns3 { // Additional docs for class PointerValue: /** Hold objects of type Ptr. */ class PointerValue : public AttributeValue { public: PointerValue(); /** * Construct this PointerValue by referencing an explicit Object. * * \param [in] object The object to begin with. */ PointerValue(Ptr object); /** * Set the value from by reference an Object. * * \param [in] object The object to reference. */ void SetObject(Ptr object); /** * Get the Object referenced by the PointerValue. * \returns The Object. */ Ptr GetObject() const; /** * Construct this PointerValue by referencing an explicit Object. * * \tparam T \deduced The type of the object. * \param [in] object The object to begin with. */ template PointerValue(const Ptr& object); /** * Cast to an Object of type \c T. * \tparam T \explicit The type to cast to. */ template operator Ptr() const; // Documentation generated by print-introspected-doxygen.cc template void Set(const Ptr& value); /** \tparam T \explicit The type to cast to. */ template Ptr Get() const; template bool GetAccessor(Ptr& value) const; Ptr Copy() const override; std::string SerializeToString(Ptr checker) const override; bool DeserializeFromString(std::string value, Ptr checker) override; private: Ptr m_value; }; class PointerChecker : public AttributeChecker { public: /** * Get the TypeId of the base type. * \returns The base TypeId. */ virtual TypeId GetPointeeTypeId() const = 0; }; /** * Create a PointerChecker for a type. * \tparam T \explicit The underlying type. * \returns The PointerChecker. */ template Ptr MakePointerChecker(); } // namespace ns3 /*************************************************************** * Implementation of the templates declared above. ***************************************************************/ namespace ns3 { namespace internal { /** PointerChecker implementation. */ template class PointerChecker : public ns3::PointerChecker { bool Check(const AttributeValue& val) const override { const PointerValue* value = dynamic_cast(&val); if (value == nullptr) { return false; } if (!value->GetObject()) { // a null pointer is a valid value return true; } T* ptr = dynamic_cast(PeekPointer(value->GetObject())); if (ptr == nullptr) { return false; } return true; } std::string GetValueTypeName() const override { return "ns3::PointerValue"; } bool HasUnderlyingTypeInformation() const override { return true; } std::string GetUnderlyingTypeInformation() const override { TypeId tid = T::GetTypeId(); return "ns3::Ptr< " + tid.GetName() + " >"; } Ptr Create() const override { return ns3::Create(); } bool Copy(const AttributeValue& source, AttributeValue& destination) const override { const PointerValue* src = dynamic_cast(&source); PointerValue* dst = dynamic_cast(&destination); if (src == nullptr || dst == nullptr) { return false; } *dst = *src; return true; } TypeId GetPointeeTypeId() const override { return T::GetTypeId(); } }; } // namespace internal template PointerValue::PointerValue(const Ptr& object) { m_value = object; } template void PointerValue::Set(const Ptr& object) { m_value = object; } template Ptr PointerValue::Get() const { T* v = dynamic_cast(PeekPointer(m_value)); return v; } template PointerValue::operator Ptr() const { return Get(); } template bool PointerValue::GetAccessor(Ptr& v) const { Ptr ptr = dynamic_cast(PeekPointer(m_value)); if (!ptr) { return false; } v = ptr; return true; } ATTRIBUTE_ACCESSOR_DEFINE(Pointer); template Ptr MakePointerChecker() { return Create>(); } } // namespace ns3 #endif /* NS_POINTER_H */