Close AsyncServerSocket sockets in reverse order
[folly.git] / folly / MoveWrapper.h
index 7300f9a8a7c6c34126e0197f4622af782cfde582..853f50ef4255700b20ecc51b779728f7162e1e66 100644 (file)
@@ -54,6 +54,9 @@ class MoveWrapper {
   const T* operator->() const { return &value; }
         T* operator->()       { return &value; }
 
+  /// move the value out (sugar for std::move(*moveWrapper))
+  T&& move() { return std::move(value); }
+
   // If you want these you're probably doing it wrong, though they'd be
   // easy enough to implement
   MoveWrapper& operator=(MoveWrapper const&) = delete;
@@ -63,9 +66,12 @@ class MoveWrapper {
   mutable T value;
 };
 
-template <class T>
-MoveWrapper<T> makeMoveWrapper(T&& t) {
-    return MoveWrapper<T>(std::forward<T>(t));
+/// Make a MoveWrapper from the argument. Because the name "makeMoveWrapper"
+/// is already quite transparent in its intent, this will work for lvalues as
+/// if you had wrapped them in std::move.
+template <class T, class T0 = typename std::remove_reference<T>::type>
+MoveWrapper<T0> makeMoveWrapper(T&& t) {
+  return MoveWrapper<T0>(std::forward<T0>(t));
 }
 
 } // namespace