Codemod: use #include angle brackets in folly and thrift
[folly.git] / folly / Memory.h
index 8394f6ad24c3ce55414515f4b2a5c2ea2ab900e4..6270cfab8194db5312873bf3c4789816b7976b9d 100644 (file)
@@ -17,7 +17,7 @@
 #ifndef FOLLY_MEMORY_H_
 #define FOLLY_MEMORY_H_
 
-#include "folly/Traits.h"
+#include <folly/Traits.h>
 
 #include <cstddef>
 #include <cstdlib>
@@ -38,10 +38,24 @@ namespace folly {
  */
 
 template<typename T, typename Dp = std::default_delete<T>, typename... Args>
-std::unique_ptr<T, Dp> make_unique(Args&&... args) {
+typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T, Dp>>::type
+make_unique(Args&&... args) {
   return std::unique_ptr<T, Dp>(new T(std::forward<Args>(args)...));
 }
 
+// Allows 'make_unique<T[]>(10)'. (N3690 s20.9.1.4 p3-4)
+template<typename T, typename Dp = std::default_delete<T>>
+typename std::enable_if<std::is_array<T>::value, std::unique_ptr<T, Dp>>::type
+make_unique(const size_t n) {
+  return std::unique_ptr<T, Dp>(new typename std::remove_extent<T>::type[n]());
+}
+
+// Disallows 'make_unique<T[10]>()'. (N3690 s20.9.1.4 p5)
+template<typename T, typename Dp = std::default_delete<T>, typename... Args>
+typename std::enable_if<
+  std::extent<T>::value != 0, std::unique_ptr<T, Dp>>::type
+make_unique(Args&&...) = delete;
+
 /**
  * A SimpleAllocator must provide two methods:
  *