Add make_unique and start using it
authorweinig@apple.com <weinig@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 21:46:10 +0000 (21:46 +0000)
committerweinig@apple.com <weinig@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 21:46:10 +0000 (21:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121523

Reviewed by Anders Carlsson.

../WebCore:

* html/HTMLAreaElement.h:
* html/HTMLFrameSetElement.h:
* platform/Length.cpp:
(WebCore::newCoordsArray):
(WebCore::newLengthArray):
* platform/Length.h:
Switch off OwnArrayPtr to std::unique_ptr<T[]> and make use of make_unique.

../WTF:

* wtf/StdLibExtras.h:
(std::make_unique):
Add temporary implementation of std::make_unique that we can use until our standard
libraries have support for it.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@156000 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/StdLibExtras.h
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLAreaElement.h
Source/WebCore/html/HTMLFrameSetElement.h
Source/WebCore/platform/Length.cpp
Source/WebCore/platform/Length.h

index 3f0464e..6e51714 100644 (file)
@@ -1,3 +1,15 @@
+2013-09-17  Sam Weinig  <sam@webkit.org>
+
+        Add make_unique and start using it
+        https://bugs.webkit.org/show_bug.cgi?id=121523
+
+        Reviewed by Anders Carlsson.
+
+        * wtf/StdLibExtras.h:
+        (std::make_unique):
+        Add temporary implementation of std::make_unique that we can use until our standard
+        libraries have support for it.
+
 2013-09-17  Darin Adler  <darin@apple.com>
 
         Make SVGTransform::valueAsString use StringBuilder
index c0932e7..35c1d4b 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef WTF_StdLibExtras_h
 #define WTF_StdLibExtras_h
 
+#include <memory>
 #include <wtf/Assertions.h>
 #include <wtf/CheckedArithmetic.h>
 
@@ -304,6 +305,65 @@ inline void* operator new(size_t, NotNullTag, void* location)
     return location;
 }
 
+
+// For standard libraries that do not yet include it, this adds the std::make_unique
+// type. It is defined in the same namespaces as it would be in library that had the
+// support.
+
+namespace std {
+
+    template<class T> struct _Unique_if {
+        typedef unique_ptr<T> _Single_object;
+    };
+
+    template<class T> struct _Unique_if<T[]> {
+        typedef unique_ptr<T[]> _Unknown_bound;
+    };
+
+    template<class T, size_t N> struct _Unique_if<T[N]> {
+        typedef void _Known_bound;
+    };
+
+#if COMPILER_SUPPORTS(CXX_VARIADIC_TEMPLATES)
+    template<class T, class... Args> typename _Unique_if<T>::_Single_object
+    make_unique(Args&&... args)
+    {
+        return unique_ptr<T>(new T(std::forward<Args>(args)...));
+    }
+#else
+    template<class T> typename _Unique_if<T>::_Single_object
+    make_unique()
+    {
+        return unique_ptr<T>(new T);
+    }
+
+    template<class T, class A1> typename _Unique_if<T>::_Single_object
+    make_unique(A1&& a1)
+    {
+        return unique_ptr<T>(new T(std::forward<A1>(a1)));
+    }
+
+    template<class T, class A1, class A2> typename _Unique_if<T>::_Single_object
+    make_unique(A1&& a1, A1&& a2)
+    {
+        return unique_ptr<T>(new T(std::forward<A1>(a1), std::forward<A2>(a2)));
+    }
+#endif
+
+    template<class T> typename _Unique_if<T>::_Unknown_bound
+    make_unique(size_t n)
+    {
+        typedef typename remove_extent<T>::type U;
+        return unique_ptr<T>(new U[n]());
+    }
+    
+#if COMPILER_SUPPORTS(CXX_VARIADIC_TEMPLATES)
+    template<class T, class... Args> typename _Unique_if<T>::_Known_bound
+    make_unique(Args&&...) = delete;
+#endif
+
+}
+
 using WTF::KB;
 using WTF::MB;
 using WTF::insertIntoBoundedVector;
index ccb0fa8..4081a80 100644 (file)
@@ -1,3 +1,18 @@
+2013-09-17  Sam Weinig  <sam@webkit.org>
+
+        Add make_unique and start using it
+        https://bugs.webkit.org/show_bug.cgi?id=121523
+
+        Reviewed by Anders Carlsson.
+
+        * html/HTMLAreaElement.h:
+        * html/HTMLFrameSetElement.h:
+        * platform/Length.cpp:
+        (WebCore::newCoordsArray):
+        (WebCore::newLengthArray):
+        * platform/Length.h:
+        Switch off OwnArrayPtr to std::unique_ptr<T[]> and make use of make_unique.
+
 2013-09-17  Simon Fraser  <simon.fraser@apple.com>
 
         Hardware accelerated CSS transitions appear pixelated when scaled up using transform
index f305de4..e4cb43a 100644 (file)
@@ -64,7 +64,7 @@ private:
     void invalidateCachedRegion();
 
     OwnPtr<Path> m_region;
-    OwnArrayPtr<Length> m_coords;
+    std::unique_ptr<Length[]> m_coords;
     int m_coordsLen;
     LayoutSize m_lastSize;
     Shape m_shape;
index af7d135..cc4a1d0 100644 (file)
@@ -84,8 +84,8 @@ private:
     virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
     virtual void removedFrom(ContainerNode*) OVERRIDE;
 
-    OwnArrayPtr<Length> m_rowLengths;
-    OwnArrayPtr<Length> m_colLengths;
+    std::unique_ptr<Length[]> m_rowLengths;
+    std::unique_ptr<Length[]> m_colLengths;
 
     int m_totalRows;
     int m_totalCols;
index fd0491d..784e23c 100644 (file)
@@ -28,7 +28,7 @@
 #include "CalculationValue.h"
 #include <wtf/ASCIICType.h>
 #include <wtf/Assertions.h>
-#include <wtf/OwnArrayPtr.h>
+#include <wtf/StdLibExtras.h>
 #include <wtf/text/StringBuffer.h>
 #include <wtf/text/WTFString.h>
 
@@ -85,7 +85,7 @@ static int countCharacter(const UChar* data, unsigned length, UChar character)
     return count;
 }
 
-OwnArrayPtr<Length> newCoordsArray(const String& string, int& len)
+std::unique_ptr<Length[]> newCoordsArray(const String& string, int& len)
 {
     unsigned length = string.length();
     const UChar* data = string.characters();
@@ -102,7 +102,7 @@ OwnArrayPtr<Length> newCoordsArray(const String& string, int& len)
     str = str->simplifyWhiteSpace();
 
     len = countCharacter(str->characters(), str->length(), ' ') + 1;
-    OwnArrayPtr<Length> r = adoptArrayPtr(new Length[len]);
+    auto r = std::make_unique<Length[]>(len);
 
     int i = 0;
     unsigned pos = 0;
@@ -119,7 +119,7 @@ OwnArrayPtr<Length> newCoordsArray(const String& string, int& len)
     return r;
 }
 
-OwnArrayPtr<Length> newLengthArray(const String& string, int& len)
+std::unique_ptr<Length[]> newLengthArray(const String& string, int& len)
 {
     RefPtr<StringImpl> str = string.impl()->simplifyWhiteSpace();
     if (!str->length()) {
@@ -128,7 +128,7 @@ OwnArrayPtr<Length> newLengthArray(const String& string, int& len)
     }
 
     len = countCharacter(str->characters(), str->length(), ',') + 1;
-    OwnArrayPtr<Length> r = adoptArrayPtr(new Length[len]);
+    auto r = std::make_unique<Length[]>(len);
 
     int i = 0;
     unsigned pos = 0;
index af1e653..f405181 100644 (file)
@@ -24,6 +24,7 @@
 #define Length_h
 
 #include "AnimationUtilities.h"
+#include <memory>
 #include <string.h>
 #include <wtf/Assertions.h>
 #include <wtf/FastMalloc.h>
@@ -305,8 +306,8 @@ private:
     bool m_isFloat;
 };
 
-OwnArrayPtr<Length> newCoordsArray(const String&, int& len);
-OwnArrayPtr<Length> newLengthArray(const String&, int& len);
+std::unique_ptr<Length[]> newCoordsArray(const String&, int& len);
+std::unique_ptr<Length[]> newLengthArray(const String&, int& len);
 
 } // namespace WebCore