Simplify and optimize Create template function. Add Ptr::operator *
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Mon, 01 Oct 2007 14:07:53 +0200
changeset 1864 f5f263266774
parent 1533 1e8249c58fda
child 1865 829dc1815014
Simplify and optimize Create template function. Add Ptr::operator *
src/core/ptr.h
--- a/src/core/ptr.h	Fri Sep 28 17:13:20 2007 +0100
+++ b/src/core/ptr.h	Mon Oct 01 14:07:53 2007 +0200
@@ -100,6 +100,8 @@
 
   T *operator -> () const;
   T *operator -> ();
+  const T &operator * () const;
+  const T &operator * ();
   // allow if (!sp)
   bool operator! ();
   // allow if (sp)
@@ -221,73 +223,49 @@
 template <typename T>
 Ptr<T> Create (void)
 {
-  T *obj = new T ();
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (), false);
 }
 
 template <typename T, typename T1>
 Ptr<T> Create (T1 a1)
 {
-  T *obj = new T (a1);
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (a1), false);
 }
 
 template <typename T, typename T1, typename T2>
 Ptr<T> Create (T1 a1, T2 a2)
 {
-  T *obj = new T (a1, a2);
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (a1, a2), false);
 }
 
 template <typename T, typename T1, typename T2, typename T3>
 Ptr<T> Create (T1 a1, T2 a2, T3 a3)
 {
-  T *obj = new T (a1, a2, a3);
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (a1, a2, a3), false);
 }
 
 template <typename T, typename T1, typename T2, typename T3, typename T4>
 Ptr<T> Create (T1 a1, T2 a2, T3 a3, T4 a4)
 {
-  T *obj = new T (a1, a2, a3, a4);
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (a1, a2, a3, a4), false);
 }
 
 template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5>
 Ptr<T> Create (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
 {
-  T *obj = new T (a1, a2, a3, a4, a5);
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (a1, a2, a3, a4, a5), false);
 }
 
 template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
 Ptr<T> Create (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6)
 {
-  T *obj = new T (a1, a2, a3, a4, a5, a6);
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (a1, a2, a3, a4, a5, a6), false);
 }
 
 template <typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
 Ptr<T> Create (T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7)
 {
-  T *obj = new T (a1, a2, a3, a4, a5, a6, a7);
-  Ptr<T> p = obj;
-  obj->Unref ();
-  return p;
+  return Ptr<T> (new T (a1, a2, a3, a4, a5, a6, a7), false);
 }
 
 template <typename T>
@@ -452,6 +430,21 @@
 }
 
 template <typename T>
+const T &
+Ptr<T>::operator * () const
+{
+  return *m_ptr;
+}
+
+template <typename T>
+const T &
+Ptr<T>::operator * ()
+{
+  return *m_ptr;
+}
+
+
+template <typename T>
 bool 
 Ptr<T>::operator! () 
 {