get rid of implicit conversion of Attribute to/from Ptr<>. Replace this with an explicit Pointer class.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 09 Apr 2008 12:15:24 -0700
changeset 2927 73b47ce1d805
parent 2926 96d1fc816681
child 2928 554e10cdc747
get rid of implicit conversion of Attribute to/from Ptr<>. Replace this with an explicit Pointer class.
examples/simple-error-model.cc
samples/main-attribute-value.cc
src/core/attribute-test.cc
src/core/attribute.cc
src/core/attribute.h
src/core/config.cc
src/core/pointer.h
src/devices/csma/csma-net-device.cc
src/devices/point-to-point/point-to-point-net-device.cc
src/devices/wifi/propagation-loss-model.cc
src/devices/wifi/wifi-channel.cc
src/devices/wifi/wifi-net-device.cc
src/helper/mobility-helper.cc
src/mobility/hierarchical-mobility-model.cc
src/mobility/random-waypoint-mobility-model.cc
src/simulator/simulator.cc
--- a/examples/simple-error-model.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/examples/simple-error-model.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -159,7 +159,7 @@
   // specified by the default classId
   Ptr<RateErrorModel> em = CreateObject<RateErrorModel> ("RanVar", UniformVariable (0.0, 1.0),
                                                          "ErrorRate", Double (0.001));
-  d3d2.Get (0)->SetAttribute ("ReceiveErrorModel", em);
+  d3d2.Get (0)->SetAttribute ("ReceiveErrorModel", Pointer (em));
 
   // Now, let's use the ListErrorModel and explicitly force a loss
   // of the packets with pkt-uids = 11 and 17 on node 2, device 0
@@ -169,7 +169,7 @@
   // This time, we'll explicitly create the error model we want
   Ptr<ListErrorModel> pem = CreateObject<ListErrorModel> ();
   pem->SetList (sampleList);
-  d0d2.Get (1)->SetAttribute ("ReceiveErrorModel", pem);
+  d0d2.Get (1)->SetAttribute ("ReceiveErrorModel", Pointer (pem));
 
   std::ofstream ascii;
   ascii.open ("simple-error-model.tr");
--- a/samples/main-attribute-value.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/samples/main-attribute-value.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -24,6 +24,7 @@
 #include "ns3/config.h"
 #include "ns3/uinteger.h"
 #include "ns3/string.h"
+#include "ns3/pointer.h"
 #include "ns3/simulator.h"
 
 #include "ns3/node.h"
@@ -87,7 +88,7 @@
   // First, we observe that we can get a pointer to the (base class)
   // queue via the PointToPointNetDevice attributes, where it is called
   // TxQueue 
-  Ptr<Queue> txQueue = net0->GetAttribute ("TxQueue");
+  Ptr<Queue> txQueue = Pointer (net0->GetAttribute ("TxQueue"));
 
   // Using the GetObject function, we can perform a safe downcast
   // to a DropTailQueue, where MaxPackets is a member
--- a/src/core/attribute-test.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/core/attribute-test.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -109,10 +109,6 @@
 		     MakeBooleanAccessor (&AttributeObjectTest::DoSetTestB,
 					   &AttributeObjectTest::DoGetTestB),
 		     MakeBooleanChecker ())
-      .AddAttribute ("TestPtr", "help text", 
-		     Ptr<Derived> (0),
-		     MakePtrAccessor (&AttributeObjectTest::m_derived),
-		     MakePtrChecker<Derived> ())
       .AddAttribute ("TestInt16", "help text",
 		     Integer (-2),
 		     MakeIntegerAccessor (&AttributeObjectTest::m_int16),
@@ -219,7 +215,6 @@
   }
   bool m_boolTestA;
   bool m_boolTest;
-  Ptr<Derived> m_derived;
   int16_t m_int16;
   int16_t m_int16WithBounds;
   int16_t m_int16SetGet;
@@ -298,23 +293,6 @@
   CHECK_GET_PARAM (p, "TestBoolA", Boolean, true);
 
 
-  Ptr<Derived> derived = p->GetAttribute ("TestPtr");
-  NS_TEST_ASSERT (derived == 0);
-  derived = Create<Derived> ();
-  NS_TEST_ASSERT (p->SetAttributeFailSafe("TestPtr", derived));
-  Ptr<Derived> stored = p->GetAttribute ("TestPtr");
-  NS_TEST_ASSERT (stored == derived);
-  Ptr<Object> storedBase = p->GetAttribute ("TestPtr");
-  NS_TEST_ASSERT (stored == storedBase);
-  Ptr<AttributeObjectTest> x = p->GetAttribute ("TestPtr");
-  NS_TEST_ASSERT (x == 0);
-
-  p = CreateObject<AttributeObjectTest> ("TestPtr", Create<Derived> ());
-  NS_TEST_ASSERT (p != 0);
-  derived = 0;
-  derived = p->GetAttribute ("TestPtr");
-  NS_TEST_ASSERT (derived != 0);
-
   CHECK_GET_STR (p, "TestInt16", "-2");
   CHECK_GET_PARAM (p, "TestInt16", Integer, -2);
 
@@ -488,16 +466,15 @@
 
   NS_TEST_ASSERT (p->TraceConnectWithoutContext ("ValueSource", MakeCallback (&AttributeTest::NotifySourceValue, this)));
 
-
-  derived = Pointer (p->GetAttribute ("Pointer"));
+  Ptr<Derived>derived = Pointer (p->GetAttribute ("Pointer"));
   NS_TEST_ASSERT (derived == 0);
   derived = Create<Derived> ();
   NS_TEST_ASSERT (p->SetAttributeFailSafe("Pointer", Pointer (derived)));
-  stored = Pointer (p->GetAttribute ("Pointer"));
+  Ptr<Derived> stored = Pointer (p->GetAttribute ("Pointer"));
   NS_TEST_ASSERT (stored == derived);
-  storedBase = Pointer (p->GetAttribute ("Pointer"));
+  Ptr<Object> storedBase = Pointer (p->GetAttribute ("Pointer"));
   NS_TEST_ASSERT (stored == storedBase);
-  x = Pointer (p->GetAttribute ("Pointer"));
+  Ptr<AttributeObjectTest> x = Pointer (p->GetAttribute ("Pointer"));
   NS_TEST_ASSERT (x == 0);
 
   p = CreateObject<AttributeObjectTest> ("Pointer", Pointer (Create<Derived> ()));
--- a/src/core/attribute.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/core/attribute.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -172,19 +172,4 @@
 AttributeChecker::~AttributeChecker ()
 {}
 
-std::string 
-PtrValueBase::SerializeToString (Ptr<const AttributeChecker> checker) const
-{
-  std::ostringstream oss;
-  oss << PeekObjectBase ();
-  return oss.str ();
-}
-
-bool 
-PtrValueBase::DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker)
-{
-  // XXX
-  return false;
-}
-
 } // namespace ns3
--- a/src/core/attribute.h	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/core/attribute.h	Wed Apr 09 12:15:24 2008 -0700
@@ -135,17 +135,6 @@
   template <typename T>
   T DynCast (void) const;
 
-  /**
-   * \param pointer a pointer to convert into an Attribute.
-   */
-  template <typename T>
-  Attribute (Ptr<T> pointer);
-  /**
-   * \returns a pointer converted from this Attribute instance.
-   */
-  template <typename T>
-  operator Ptr<T> ();
-
 private:
   Attribute (AttributeValue *value);
   AttributeValue *m_value;
@@ -231,171 +220,11 @@
   mutable uint32_t m_count;
 };
 
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (Ptr<U> T::*memberVariable);
-
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (void (T::*setter) (Ptr<U>));
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (Ptr<U> (T::*getter) (void) const);
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (void (T::*setter) (Ptr<U>),
-                 Ptr<U> (T::*getter) (void) const);
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (Ptr<U> (T::*getter) (void) const,
-                 void (T::*setter) (Ptr<U>));
-
-
-
-class PtrChecker : public AttributeChecker {};
-
-template <typename T>
-Ptr<AttributeChecker> MakePtrChecker (void);
-
-
-
 } // namespace ns3
 
 namespace ns3 {
 
 /********************************************************
- *   The class used to access the pointer stored in a
- *   PtrValue<T> AttributeValue instance.
- ********************************************************/
-
-class PtrValueBase : public AttributeValue
-{
-public:
-  virtual ObjectBase *PeekObjectBase (void) const = 0;
-  virtual bool SetObjectBase (ObjectBase *object) = 0;
-  virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
-  virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
-};
-
-/********************************************************
- *        Store the content of a Ptr<T> in a AttributeValue
- ********************************************************/
-
-namespace internal {
-
-template <typename T>
-class PtrValue : public PtrValueBase
-{
-public:
-  PtrValue () 
-    : m_pointer () {}
-  PtrValue (Ptr<T> pointer) 
-    : m_pointer (pointer) {}
-
-  virtual ObjectBase *PeekObjectBase (void) const {
-    return PeekPointer (m_pointer);
-  }
-  virtual bool SetObjectBase (ObjectBase *object) {
-    T *ptr = dynamic_cast<T *> (object);
-    if (ptr == 0)
-      {
-	return false;
-      }
-    m_pointer = ptr;
-    return true;
-  }
-  virtual Attribute Copy (void) const {
-    return Attribute::Create<PtrValue<T> > (*this);
-  }
-private:
-  Ptr<T> m_pointer;
-};
-
-template <typename T>
-class APtrChecker : public PtrChecker
-{
-  virtual bool Check (Attribute val) const {
-    const PtrValueBase *value = val.DynCast<const PtrValueBase *> ();
-    if (value == 0)
-      {
-	return false;
-      }
-    if (value->PeekObjectBase () == 0)
-      {
-	return true;
-      }
-    T *ptr = dynamic_cast<T*> (value->PeekObjectBase ());
-    if (ptr == 0)
-      {
-	return false;
-      }
-    return true;
-  }
-  virtual std::string GetType (void) const {
-    // XXX: we should be able to return better information
-    return "Ptr<>";
-  }
-  virtual bool HasTypeConstraints (void) const {
-    return false;
-  }
-  virtual std::string GetTypeConstraints (void) const {
-    return "";
-  }
-  virtual Attribute Create (void) const {
-    return Attribute::Create<PtrValue<T> > ();
-  }
-};
-
-/********************************************************
- *              The Accessor associated to 
- *               PtrValue<T>
- ********************************************************/
-
-template <typename T, typename U>
-class PtrAccessor : public AttributeAccessor
-{
-public:
-  virtual ~PtrAccessor () {}
-  virtual bool Set (ObjectBase * object, Attribute val) const {
-      T *obj = dynamic_cast<T *> (object);
-      if (obj == 0)
-        {
-          return false;
-        }
-      const PtrValueBase *value = val.DynCast<const PtrValueBase *> ();
-      if (value == 0)
-        {
-          return false;
-        }
-      Ptr<U> ptr = dynamic_cast<U*> (value->PeekObjectBase ());
-      if (ptr == 0)
-        {
-          return false;
-        }
-      DoSet (obj, ptr);
-      return true;
-    }
-  virtual bool Get (const ObjectBase * object, Attribute val) const {
-      const T *obj = dynamic_cast<const T *> (object);
-      if (obj == 0)
-        {
-          return false;
-        }
-      PtrValueBase *value = val.DynCast<PtrValueBase *> ();
-      if (value == 0)
-        {
-          return false;
-        }
-      return value->SetObjectBase (PeekPointer (DoGet (obj)));
-    }
-private:
-  virtual void DoSet (T *object, Ptr<U> value) const = 0;
-  virtual Ptr<U> DoGet (const T *object) const = 0;
-};
-
-} // namespace internal
-
-/********************************************************
  *        The implementation of the Attribute 
  *          class template methods.
  ********************************************************/
@@ -420,120 +249,6 @@
   return dynamic_cast<T> (m_value);
 }
 
-template <typename T>
-Attribute::Attribute (Ptr<T> pointer)
-  : m_value (new internal::PtrValue<T> (pointer))
-{}
-template <typename T>
-Attribute::operator Ptr<T> ()
-{
-  PtrValueBase *value = DynCast<PtrValueBase *> ();
-  if (value == 0)
-    {
-      return 0;
-    }
-  ObjectBase *objectBase = value->PeekObjectBase ();
-  T *obj = dynamic_cast<T *> (objectBase);
-  if (obj == 0)
-    {
-      return 0;
-    }
-  return obj;
-}
-
-
-
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (Ptr<U> T::*memberVariable)
-{
-  struct MemberVariable : public internal::PtrAccessor<T,U>
-  {
-    Ptr<U> T::*m_memberVariable;
-    virtual void DoSet (T *object, Ptr<U> value) const {
-      (object->*m_memberVariable) = value;
-    }
-    virtual Ptr<U> DoGet (const T *object) const {
-      return object->*m_memberVariable;
-    }
-  } *spec = new MemberVariable ();
-  spec->m_memberVariable = memberVariable;
-  return Ptr<const AttributeAccessor> (spec, false);
-}
-
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (void (T::*setter) (Ptr<U>))
-{
-  struct MemberMethod : public internal::PtrAccessor<T,U>
-  {
-    void (T::*m_setter) (Ptr<U>);
-    virtual void DoSet (T *object, Ptr<U> value) const {
-      (object->*m_setter) (value);
-    }
-    virtual Ptr<U> DoGet (const T *object) const {
-      return 0;
-      //return (object->*m_getter) ();
-    }
-  } *spec = new MemberMethod ();
-  spec->m_setter = setter;
-  return Ptr<const AttributeAccessor> (spec, false);
-}
-
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (Ptr<U> (T::*getter) (void) const)
-{
-  struct MemberMethod : public internal::PtrAccessor<T,U>
-  {
-    Ptr<U> (T::*m_getter) (void) const;
-    virtual void DoSet (T *object, Ptr<U> value) const {
-      //(object->*m_setter) (value);
-    }
-    virtual Ptr<U> DoGet (const T *object) const {
-      return (object->*m_getter) ();
-    }
-  } *spec = new MemberMethod ();
-  spec->m_getter = getter;
-  return Ptr<const AttributeAccessor> (spec, false);
-}
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (void (T::*setter) (Ptr<U>),
-                 Ptr<U> (T::*getter) (void) const)
-{
-  return MakePtrAccessor (getter, setter);
-}
-template <typename T, typename U>
-Ptr<const AttributeAccessor>
-MakePtrAccessor (Ptr<U> (T::*getter) (void) const,
-                 void (T::*setter) (Ptr<U>))
-{
-  struct MemberMethod : public internal::PtrAccessor<T,U>
-  {
-    void (T::*m_setter) (Ptr<U>);
-    Ptr<U> (T::*m_getter) (void) const;
-    virtual void DoSet (T *object, Ptr<U> value) const {
-      (object->*m_setter) (value);
-    }
-    virtual Ptr<U> DoGet (const T *object) const {
-      return (object->*m_getter) ();
-    }
-  } *spec = new MemberMethod ();
-  spec->m_setter = setter;
-  spec->m_getter = getter;
-  return Ptr<const AttributeAccessor> (spec, false);
-}
-
-
-
-template <typename T>
-Ptr<AttributeChecker>
-MakePtrChecker (void)
-{
-  return Create<internal::APtrChecker<T> > ();
-}
-
 } // namespace ns3
 
 #endif /* ATTRIBUTE_H */
--- a/src/core/config.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/core/config.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -22,6 +22,7 @@
 #include "object.h"
 #include "global-value.h"
 #include "object-vector.h"
+#include "pointer.h"
 #include "log.h"
 #include <sstream>
 
@@ -213,14 +214,11 @@
 	  return;
 	}
       // attempt to cast to a pointer checker.
-      const PtrChecker *ptr = dynamic_cast<const PtrChecker *> (PeekPointer (info.checker));
+      const PointerChecker *ptr = dynamic_cast<const PointerChecker *> (PeekPointer (info.checker));
       if (ptr != 0)
 	{
 	  NS_LOG_DEBUG ("GetAttribute(ptr)="<<item<<" on path="<<GetResolvedPath (""));
-	  // XXX: This is not completely right because anything could be stored in a
-	  // Ptr<>. We really need to fix this by thinking seriously about our
-	  // object hierarchy.
-	  Ptr<Object> object = root->GetAttribute (item);
+	  Ptr<Object> object = Pointer (root->GetAttribute (item));
 	  if (object == 0)
 	    {
 	      NS_LOG_ERROR ("Requested object name=\""<<item<<
@@ -520,13 +518,13 @@
 		   MakeObjectVectorAccessor (&MyNode::m_nodesB),
 		   MakeObjectVectorChecker ())
     .AddAttribute ("NodeA", "",
-		   Ptr<MyNode> (0),
-		   MakePtrAccessor (&MyNode::m_nodeA),
-		   MakePtrChecker<MyNode> ())
+                   Pointer (),
+		   MakePointerAccessor (&MyNode::m_nodeA),
+		   MakePointerChecker<MyNode> ())
     .AddAttribute ("NodeB", "",
-		   Ptr<MyNode> (0),
-		   MakePtrAccessor (&MyNode::m_nodeB),
-		   MakePtrChecker<MyNode> ())
+                   Pointer (),
+		   MakePointerAccessor (&MyNode::m_nodeB),
+		   MakePointerChecker<MyNode> ())
     .AddAttribute ("A", "",
 		   Integer (10),
 		   MakeIntegerAccessor (&MyNode::m_a),
--- a/src/core/pointer.h	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/core/pointer.h	Wed Apr 09 12:15:24 2008 -0700
@@ -88,7 +88,7 @@
 namespace internal {
 
 template <typename T>
-class APointerChecker : public PtrChecker
+class APointerChecker : public PointerChecker
 {
   virtual bool Check (Attribute val) const {
     const PointerValue *value = val.DynCast<const PointerValue *> ();
--- a/src/devices/csma/csma-net-device.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/devices/csma/csma-net-device.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -27,6 +27,7 @@
 #include "ns3/error-model.h"
 #include "ns3/enum.h"
 #include "ns3/boolean.h"
+#include "ns3/pointer.h"
 #include "ns3/trace-source-accessor.h"
 #include "csma-net-device.h"
 #include "csma-channel.h"
@@ -68,13 +69,13 @@
                    MakeDataRateAccessor (&CsmaNetDevice::m_bps),
                    MakeDataRateChecker ())
     .AddAttribute ("RxErrorModel", "XXX",
-                   Ptr<ErrorModel> (0),
-                   MakePtrAccessor (&CsmaNetDevice::m_receiveErrorModel),
-                   MakePtrChecker<ErrorModel> ())
+                   Pointer (),
+                   MakePointerAccessor (&CsmaNetDevice::m_receiveErrorModel),
+                   MakePointerChecker<ErrorModel> ())
     .AddAttribute ("TxQueue", "XXX",
-                   Ptr<Queue> (0),
-                   MakePtrAccessor (&CsmaNetDevice::m_queue),
-                   MakePtrChecker<Queue> ())
+                   Pointer (),
+                   MakePointerAccessor (&CsmaNetDevice::m_queue),
+                   MakePointerChecker<Queue> ())
     .AddTraceSource ("Rx", "Receive MAC packet.",
                      MakeTraceSourceAccessor (&CsmaNetDevice::m_rxTrace))
     .AddTraceSource ("Drop", "Drop MAC packet.",
--- a/src/devices/point-to-point/point-to-point-net-device.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/devices/point-to-point/point-to-point-net-device.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -26,6 +26,7 @@
 #include "ns3/llc-snap-header.h"
 #include "ns3/error-model.h"
 #include "ns3/trace-source-accessor.h"
+#include "ns3/pointer.h"
 #include "point-to-point-net-device.h"
 #include "point-to-point-channel.h"
 
@@ -50,13 +51,13 @@
                    MakeDataRateAccessor (&PointToPointNetDevice::m_bps),
                    MakeDataRateChecker ())
     .AddAttribute ("ReceiveErrorModel", "XXX",
-                   Ptr<ErrorModel> (0),
-                   MakePtrAccessor (&PointToPointNetDevice::m_receiveErrorModel),
-                   MakePtrChecker<ErrorModel> ())
+                   Pointer (),
+                   MakePointerAccessor (&PointToPointNetDevice::m_receiveErrorModel),
+                   MakePointerChecker<ErrorModel> ())
     .AddAttribute ("TxQueue", "XXX",
-                   Ptr<Queue> (0),
-                   MakePtrAccessor (&PointToPointNetDevice::m_queue),
-                   MakePtrChecker<Queue> ())
+                   Pointer (),
+                   MakePointerAccessor (&PointToPointNetDevice::m_queue),
+                   MakePointerChecker<Queue> ())
     .AddAttribute ("InterframeGap", "XXX",
                    Seconds (0.0),
                    MakeTimeAccessor (&PointToPointNetDevice::m_tInterframeGap),
--- a/src/devices/wifi/propagation-loss-model.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/devices/wifi/propagation-loss-model.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -22,6 +22,7 @@
 #include "ns3/mobility-model.h"
 #include "ns3/static-mobility-model.h"
 #include "ns3/double.h"
+#include "ns3/pointer.h"
 #include <math.h>
 
 NS_LOG_COMPONENT_DEFINE ("PropagationLossModel");
@@ -192,9 +193,9 @@
                    MakeDoubleChecker<double> ())
     .AddAttribute ("ReferenceModel",
                    "The reference model at the reference distance.",
-                   Ptr<PropagationLossModel> (0),
-                   MakePtrAccessor (&LogDistancePropagationLossModel::m_reference),
-                   MakePtrChecker<PropagationLossModel> ())
+                   Pointer (),
+                   MakePointerAccessor (&LogDistancePropagationLossModel::m_reference),
+                   MakePointerChecker<PropagationLossModel> ())
     ;
   return tid;
                    
--- a/src/devices/wifi/wifi-channel.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/devices/wifi/wifi-channel.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -23,6 +23,7 @@
 #include "ns3/net-device.h"
 #include "ns3/node.h"
 #include "ns3/log.h"
+#include "ns3/pointer.h"
 #include "wifi-channel.h"
 #include "propagation-loss-model.h"
 #include "propagation-delay-model.h"
@@ -38,13 +39,13 @@
     .SetParent<WifiChannel> ()
     .AddConstructor<WifiChannel> ()
     .AddAttribute ("PropagationLossModel", "XXX",
-                   Ptr<PropagationLossModel> (0),
-                   MakePtrAccessor (&WifiChannel::m_loss),
-                   MakePtrChecker<PropagationLossModel> ())
+                   Pointer (),
+                   MakePointerAccessor (&WifiChannel::m_loss),
+                   MakePointerChecker<PropagationLossModel> ())
     .AddAttribute ("PropagationDelayModel", "XXX",
-                   Ptr<PropagationDelayModel> (0),
-                   MakePtrAccessor (&WifiChannel::m_delay),
-                   MakePtrChecker<PropagationDelayModel> ())
+                   Pointer (),
+                   MakePointerAccessor (&WifiChannel::m_delay),
+                   MakePointerChecker<PropagationDelayModel> ())
     ;
   return tid;
 }
--- a/src/devices/wifi/wifi-net-device.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/devices/wifi/wifi-net-device.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -25,6 +25,7 @@
 #include "ns3/llc-snap-header.h"
 #include "ns3/packet.h"
 #include "ns3/uinteger.h"
+#include "ns3/pointer.h"
 #include "ns3/node.h"
 #include "ns3/trace-source-accessor.h"
 
@@ -36,25 +37,25 @@
   static TypeId tid = TypeId ("ns3::WifiNetDevice")
     .SetParent<NetDevice> ()
     .AddAttribute ("Channel", "XXX",
-                   Ptr<Channel> (0),
-                   MakePtrAccessor (&WifiNetDevice::DoGetChannel,
-                                    &WifiNetDevice::SetChannel),
-                   MakePtrChecker<Channel> ())
+                   Pointer (),
+                   MakePointerAccessor (&WifiNetDevice::DoGetChannel,
+                                        &WifiNetDevice::SetChannel),
+                   MakePointerChecker<Channel> ())
     .AddAttribute ("Phy", "XXX",
-                   Ptr<WifiPhy> (0),
-                   MakePtrAccessor (&WifiNetDevice::GetPhy,
-                                    &WifiNetDevice::SetPhy),
-                   MakePtrChecker<WifiPhy> ())
+                   Pointer (),
+                   MakePointerAccessor (&WifiNetDevice::GetPhy,
+                                        &WifiNetDevice::SetPhy),
+                   MakePointerChecker<WifiPhy> ())
     .AddAttribute ("Mac", "XXX",
-                   Ptr<WifiMac> (0),
-                   MakePtrAccessor (&WifiNetDevice::GetMac,
-                                    &WifiNetDevice::SetMac),
-                   MakePtrChecker<WifiMac> ())
+                   Pointer (),
+                   MakePointerAccessor (&WifiNetDevice::GetMac,
+                                        &WifiNetDevice::SetMac),
+                   MakePointerChecker<WifiMac> ())
     .AddAttribute ("RemoteStationManager", "XXX",
-                   Ptr<WifiRemoteStationManager> (0),
-                   MakePtrAccessor (&WifiNetDevice::SetRemoteStationManager,
-                                    &WifiNetDevice::GetRemoteStationManager),
-                   MakePtrChecker<WifiRemoteStationManager> ())
+                   Pointer (),
+                   MakePointerAccessor (&WifiNetDevice::SetRemoteStationManager,
+                                        &WifiNetDevice::GetRemoteStationManager),
+                   MakePointerChecker<WifiRemoteStationManager> ())
     .AddTraceSource ("Rx", "XXX",
                      MakeTraceSourceAccessor (&WifiNetDevice::m_rxLogger))
     .AddTraceSource ("Tx", "XXX",
--- a/src/helper/mobility-helper.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/helper/mobility-helper.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -23,6 +23,7 @@
 #include "ns3/position-allocator.h"
 #include "ns3/hierarchical-mobility-model.h"
 #include "ns3/log.h"
+#include "ns3/pointer.h"
 
 namespace ns3 {
 
@@ -146,8 +147,8 @@
 	      // we need to setup a hierarchical mobility model
 	      Ptr<MobilityModel> parent = m_mobilityStack.back ();
 	      Ptr<MobilityModel> hierarchical = 
-		CreateObject<HierarchicalMobilityModel> ("Child", model,
-							 "Parent", parent);
+		CreateObject<HierarchicalMobilityModel> ("Child", Pointer (model),
+							 "Parent", Pointer (parent));
 	      object->AggregateObject (hierarchical);
 	      NS_LOG_DEBUG ("node="<<object<<", mob="<<hierarchical);
 	    }
--- a/src/mobility/hierarchical-mobility-model.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/mobility/hierarchical-mobility-model.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -19,6 +19,7 @@
  */
 #include "hierarchical-mobility-model.h"
 #include "mobility-model-notifier.h"
+#include "ns3/pointer.h"
 
 namespace ns3 {
 
@@ -31,13 +32,13 @@
     .SetParent<MobilityModel> ()
     .AddConstructor<HierarchicalMobilityModel> ()
     .AddAttribute ("Child", "The child mobility model.",
-                   Ptr<MobilityModel> (0),
-                   MakePtrAccessor (&HierarchicalMobilityModel::SetChild),
-                   MakePtrChecker<MobilityModel> ())
+                   Pointer (),
+                   MakePointerAccessor (&HierarchicalMobilityModel::SetChild),
+                   MakePointerChecker<MobilityModel> ())
     .AddAttribute ("Parent", "The parent mobility model.",
-                   Ptr<MobilityModel> (0),
-                   MakePtrAccessor (&HierarchicalMobilityModel::SetParent),
-                   MakePtrChecker<MobilityModel> ())
+                   Pointer (),
+                   MakePointerAccessor (&HierarchicalMobilityModel::SetParent),
+                   MakePointerChecker<MobilityModel> ())
     ;
   return tid;
 }
--- a/src/mobility/random-waypoint-mobility-model.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/mobility/random-waypoint-mobility-model.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -20,6 +20,7 @@
 #include <cmath>
 #include "ns3/simulator.h"
 #include "ns3/random-variable.h"
+#include "ns3/pointer.h"
 #include "random-waypoint-mobility-model.h"
 #include "position-allocator.h"
 
@@ -46,9 +47,9 @@
                    MakeRandomVariableChecker ())
     .AddAttribute ("Position",
                    "The position model used to pick a destination point.",
-                   Ptr<PositionAllocator> (0),
-                   MakePtrAccessor (&RandomWaypointMobilityModel::m_position),
-                   MakePtrChecker<PositionAllocator> ());
+                   Pointer (),
+                   MakePointerAccessor (&RandomWaypointMobilityModel::m_position),
+                   MakePointerChecker<PositionAllocator> ());
   
   return tid;
 }
--- a/src/simulator/simulator.cc	Wed Apr 09 11:46:04 2008 -0700
+++ b/src/simulator/simulator.cc	Wed Apr 09 12:15:24 2008 -0700
@@ -23,6 +23,7 @@
 #include "event-impl.h"
 
 #include "ns3/ptr.h"
+#include "ns3/pointer.h"
 #include "ns3/assert.h"
 
 
@@ -108,10 +109,10 @@
     .AddConstructor<SimulatorPrivate> ()
     .AddAttribute ("Scheduler",
                    "XXX",
-                   Ptr<Scheduler> (0),
+                   Pointer (),
                    // XXX: allow getting the scheduler too.
-                   MakePtrAccessor (&SimulatorPrivate::SetScheduler),
-                   MakePtrChecker<Scheduler> ())
+                   MakePointerAccessor (&SimulatorPrivate::SetScheduler),
+                   MakePointerChecker<Scheduler> ())
     ;
   return tid;
 }