/* -*- 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 * Pointer 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 (void) 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 (void) const; template bool GetAccessor (Ptr &value) const; virtual Ptr Copy (void) const; virtual std::string SerializeToString (Ptr checker) const; virtual bool DeserializeFromString (std::string value, Ptr checker); private: Ptr m_value; }; class PointerChecker : public AttributeChecker { public: /** * Get the TypeId of the base type. * \returns The base TypeId. */ virtual TypeId GetPointeeTypeId (void) const = 0; }; /** * Create a PointerChecker for a type. * \tparam T \explicit The underlying type. * \returns The PointerChecker. */ template Ptr MakePointerChecker (void); } // namespace ns3 /*************************************************************** * Implementation of the templates declared above. ***************************************************************/ namespace ns3 { namespace internal { /** PointerChecker implementation. */ template class PointerChecker : public ns3::PointerChecker { virtual bool Check (const AttributeValue &val) const { const PointerValue *value = dynamic_cast (&val); if (value == 0) { return false; } if (value->GetObject () == 0) { return true; } T *ptr = dynamic_cast (PeekPointer (value->GetObject ())); if (ptr == 0) { return false; } return true; } virtual std::string GetValueTypeName (void) const { return "ns3::PointerValue"; } virtual bool HasUnderlyingTypeInformation (void) const { return true; } virtual std::string GetUnderlyingTypeInformation (void) const { TypeId tid = T::GetTypeId (); return "ns3::Ptr< " + tid.GetName () + " >"; } virtual Ptr Create (void) const { return ns3::Create (); } virtual bool Copy (const AttributeValue &source, AttributeValue &destination) const { const PointerValue *src = dynamic_cast (&source); PointerValue *dst = dynamic_cast (&destination); if (src == 0 || dst == 0) { return false; } *dst = *src; return true; } virtual TypeId GetPointeeTypeId (void) const { 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 (void) 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 == 0) { return false; } v = ptr; return true; } ATTRIBUTE_ACCESSOR_DEFINE (Pointer); template Ptr MakePointerChecker (void) { return Create > (); } } // namespace ns3 #endif /* NS_POINTER_H */