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 3f0464e3d41eb8025466c067e4a8a2573f8accea..6e517140409e5e9750f1b1d035225f5889d01ca2 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 c0932e766a59d7da181ad798c9695571bca6779f..35c1d4bc044ac4771cafed46b85bbb572f9bad65 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 ccb0fa8fe95341fcc146822b8eaf58f97a170912..4081a805921d058e8de37a25ff34a2c4a4255b4c 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 f305de405083ccf7e530794c90b26d8dcc393ac9..e4cb43a20947abd5634c004fd424b85c07ffde92 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 af7d135d3421c3ec032f5ac55edfa8b69139919e..cc4a1d02966b537633926cc88d56be86b8a913b7 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 fd0491d490368b07123bf1608beff549ca0ba992..784e23c20bd352b6e2ff9dfcaa6a45cf1099015a 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 af1e653449dd9a8a87a06c4ec18595ed4ba96412..f405181cd1dfb54b9bb21e69b05f3703880b4d9e 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