/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* * 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 ()) { 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 */