--- 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 */