Allow to pass ObjC blocks into folly::Function
[folly.git] / folly / Function.h
index 4bb7e6bea4e1fa90ac08dcd80928ae375b4b3fad..0ad0158292e0a26dad68db9d887350fda0a49cce 100644 (file)
@@ -480,9 +480,11 @@ class Function final : private detail::function::FunctionTraits<FunctionType> {
   Function(const Function&) = delete;
 
 #if __OBJC__
-  // Delete conversion from Objective-C blocks
+  // Make sure Objective C blocks are copied
   template <class ReturnType, class... Args>
-  Function(ReturnType (^)(Args...)) = delete;
+  /*implicit*/ Function(ReturnType (^objCBlock)(Args... args))
+      : Function([blockCopy = (ReturnType (^)(Args...))[objCBlock copy]](
+                     Args... args) { return blockCopy(args...); }){};
 #endif
 
   /**
@@ -565,9 +567,13 @@ class Function final : private detail::function::FunctionTraits<FunctionType> {
   Function& operator=(const Function&) = delete;
 
 #if __OBJC__
-  // Delete conversion from Objective-C blocks
+  // Make sure Objective C blocks are copied
   template <class ReturnType, class... Args>
-  Function& operator=(ReturnType (^)(Args...)) = delete;
+  /* implicit */ Function &operator=(ReturnType (^objCBlock)(Args... args)) {
+    (*this) = [blockCopy = (ReturnType (^)(Args...))[objCBlock copy]](
+                  Args... args) { return blockCopy(args...); };
+    return *this;
+  }
 #endif
 
   /**