src/core/object.h
changeset 2230 9f13ac3291e0
parent 1534 6b7a4e88c422
child 2231 a5b898c1ee2c
--- a/src/core/object.h	Sun Dec 30 19:36:44 2007 -0800
+++ b/src/core/object.h	Wed Jan 02 09:09:24 2008 +0100
@@ -166,6 +166,38 @@
   virtual Ptr<TraceResolver> GetTraceResolver (void) const;
 protected:
   /**
+   * This method is called by Object::Dispose.
+   * Subclasses are expected to override this method and chain
+   * up to their parent's implementation once they are done.
+   */
+  virtual void DoDispose (void);
+private:
+  friend class InterfaceIdTraceResolver;
+  template <typename T>
+  friend Ptr<T> CreateObject (void);
+  template <typename T, typename T1>
+  friend Ptr<T> CreateObject (T1 a1);
+  template <typename T, typename T1, typename T2>
+  friend Ptr<T> CreateObject (T1 a1, T2 a2);
+  template <typename T, typename T1, typename T2, typename T3>
+  friend Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3);
+  template <typename T, typename T1, typename T2, typename T3, typename T4>
+  friend Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4);
+  template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5>
+  friend Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+  template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+  friend Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+  template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
+  friend Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7);
+
+  Ptr<Object> DoQueryInterface (InterfaceId iid) const;
+  void DoCollectSources (std::string path, const TraceContext &context, 
+                         TraceResolver::SourceCollection *collection) const;
+  void DoTraceAll (std::ostream &os, const TraceContext &context) const;
+  bool Check (void) const;
+  bool CheckLoose (void) const;
+  void MaybeDelete (void) const;
+  /**
    * \param iid an InterfaceId
    *
    * Every subclass which defines a new InterfaceId for itself
@@ -173,21 +205,7 @@
    * from its constructor.
    */
   void SetInterfaceId (InterfaceId iid);
-  /**
-   * This method is called by Object::Dispose.
-   * Subclasses are expected to override this method and chain
-   * up to their parent's implementation once they are done.
-   */
-  virtual void DoDispose (void);
-private:
-  friend class InterfaceIdTraceResolver;
-  Ptr<Object> DoQueryInterface (InterfaceId iid) const;
-  void DoCollectSources (std::string path, const TraceContext &context, 
-                         TraceResolver::SourceCollection *collection) const;
-  void DoTraceAll (std::ostream &os, const TraceContext &context) const;
-  bool Check (void) const;
-  bool CheckLoose (void) const;
-  void MaybeDelete (void) const;
+
   mutable uint32_t m_count;
   InterfaceId m_iid;
   bool m_disposed;
@@ -195,6 +213,30 @@
   Object *m_next;
 };
 
+template <typename T>
+Ptr<T> CreateObject (void);
+
+template <typename T, typename T1>
+Ptr<T> CreateObject (T1 a1);
+
+template <typename T, typename T1, typename T2>
+Ptr<T> CreateObject (T1 a1, T2 a2);
+
+template <typename T, typename T1, typename T2, typename T3>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3);
+
+template <typename T, typename T1, typename T2, typename T3, typename T4>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4);
+
+template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
+
+template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6);
+
+template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7);
+
 } // namespace ns3
 
 namespace ns3 {
@@ -227,6 +269,71 @@
   return 0;
 }
 
+template <typename T>
+Ptr<T> CreateObject (void)
+{
+  Ptr<T> p = Ptr<T> (new T (), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+template <typename T, typename T1>
+Ptr<T> CreateObject (T1 a1)
+{
+  Ptr<T> p = Ptr<T> (new T (a1), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+template <typename T, typename T1, typename T2>
+Ptr<T> CreateObject (T1 a1, T2 a2)
+{
+  Ptr<T> p = Ptr<T> (new T (a1, a2), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+template <typename T, typename T1, typename T2, typename T3>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3)
+{
+  Ptr<T> p = Ptr<T> (new T (a1, a2, a3), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+template <typename T, typename T1, typename T2, typename T3, typename T4>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4)
+{
+  Ptr<T> p = Ptr<T> (new T (a1, a2, a3, a4), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
+{
+  Ptr<T> p = Ptr<T> (new T (a1, a2, a3, a4, a5), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
+{
+  Ptr<T> p = Ptr<T> (new T (a1, a2, a3, a4, a5, a6), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
+Ptr<T> CreateObject (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7)
+{
+  Ptr<T> p = Ptr<T> (new T (a1, a2, a3, a4, a5, a6, a7), false);
+  p->SetInterfaceId (T::iid);
+  return p;
+}
+
+
 } // namespace ns3
 
 #endif /* OBJECT_H */