/* -*- 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" namespace ns3 { /** * \ingroup attribute * * \brief hold objects of type Ptr */ class PointerValue : public AttributeValue { public: PointerValue (); PointerValue (Ptr object); void SetObject (Ptr object); Ptr GetObject (void) const; template PointerValue (const Ptr &object); template void Set (const Ptr &object); template Ptr Get (void) const; template bool GetAccessor (Ptr &v) const; template operator Ptr () 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: virtual TypeId GetPointeeTypeId (void) const = 0; }; template Ptr MakePointerChecker (void); } // namespace ns3 namespace ns3 { namespace internal { template class APointerChecker : public 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 */