Add getSSLContext() to AsyncSSLSocket
[folly.git] / folly / Memory.h
index d24422190250cf4bdf7c05426a185f9d159ca4e5..121f43dbdd53803a2029d5703d8042946e9b8f6e 100644 (file)
@@ -43,21 +43,21 @@ namespace folly {
 
 #else
 
-template<typename T, typename... Args>
+template <typename T, typename... Args>
 typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type
 make_unique(Args&&... args) {
   return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
 }
 
 // Allows 'make_unique<T[]>(10)'. (N3690 s20.9.1.4 p3-4)
-template<typename T>
+template <typename T>
 typename std::enable_if<std::is_array<T>::value, std::unique_ptr<T>>::type
 make_unique(const size_t n) {
   return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]());
 }
 
 // Disallows 'make_unique<T[10]>()'. (N3690 s20.9.1.4 p5)
-template<typename T, typename... Args>
+template <typename T, typename... Args>
 typename std::enable_if<
   std::extent<T>::value != 0, std::unique_ptr<T>>::type
 make_unique(Args&&...) = delete;
@@ -137,7 +137,18 @@ std::weak_ptr<T> to_weak_ptr(const std::shared_ptr<T>& ptr) {
   return std::weak_ptr<T>(ptr);
 }
 
-using SysBufferDeleter = static_function_deleter<void, ::free>;
+namespace detail {
+/**
+ * Not all STL implementations define ::free in a way that its address can be
+ * determined at compile time. So we must wrap ::free in a function whose
+ * address can be determined.
+ */
+inline void SysFree(void* p) {
+  ::free(p);
+}
+}
+
+using SysBufferDeleter = static_function_deleter<void, &detail::SysFree>;
 using SysBufferUniquePtr = std::unique_ptr<void, SysBufferDeleter>;
 inline SysBufferUniquePtr allocate_sys_buffer(size_t size) {
   return SysBufferUniquePtr(::malloc(size));
@@ -306,7 +317,7 @@ class allocator_delete
 {
   typedef typename std::remove_reference<Allocator>::type allocator_type;
 
-public:
+ public:
   typedef typename Allocator::pointer pointer;
 
   allocator_delete() = default;
@@ -345,7 +356,7 @@ class is_simple_allocator {
   typedef typename std::remove_reference<T>::type value_type;
   typedef value_type* pointer;
 
-public:
+ public:
   constexpr static bool value = !has_destroy<allocator, void(pointer)>::value
     && !has_destroy<allocator, void(void*)>::value;
 };
@@ -480,7 +491,7 @@ template <class T> struct IsArenaAllocator : std::false_type { };
  */
 template <typename T>
 class enable_shared_from_this : public std::enable_shared_from_this<T> {
-public:
+ public:
   constexpr enable_shared_from_this() noexcept = default;
 
   std::weak_ptr<T> weak_from_this() noexcept {
@@ -491,7 +502,7 @@ public:
     return weak_from_this_<T>(this);
   }
 
-private:
+ private:
   // Uses SFINAE to detect and call
   // std::enable_shared_from_this<T>::weak_from_this() if available. Falls
   // back to std::enable_shared_from_this<T>::shared_from_this() otherwise.
@@ -535,4 +546,4 @@ private:
 
 #endif
 
-}  // namespace folly
+} // namespace folly