makeMoveWrapper(lvalue)
authorHans Fugal <fugalh@fb.com>
Mon, 2 Mar 2015 21:27:49 +0000 (13:27 -0800)
committerAlecs King <int@fb.com>
Tue, 3 Mar 2015 03:31:12 +0000 (19:31 -0800)
Summary: Because why not?

Test Plan: new unit tests

Reviewed By: hannesr@fb.com

Subscribers: trunkagent, exa, folly-diffs@, yfeldblum, marccelani

FB internal diff: D1866123

Signature: t1:1866123:1425331395:742369597757456e5925af55c5d4198b607126f1

folly/MoveWrapper.h
folly/test/MoveWrapperTest.cpp

index 7300f9a8a7c6c34126e0197f4622af782cfde582..6fbd710e69ab55b75769c9af418c3a8d4458c3b6 100644 (file)
@@ -63,9 +63,12 @@ class MoveWrapper {
   mutable T value;
 };
 
   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
 }
 
 } // namespace
index 6d660bea6000faaad3ea1cabf0645d769af5ef04..b5a21c7eb8efae4f95eb46b41e226deeccae9830 100644 (file)
@@ -34,4 +34,19 @@ TEST(makeMoveWrapper, NonEmpty) {
   EXPECT_EQ(**p, 5);
 }
 
   EXPECT_EQ(**p, 5);
 }
 
+TEST(makeMoveWrapper, rvalue) {
+  std::unique_ptr<int> p;
+  makeMoveWrapper(std::move(p));
+}
+
+TEST(makeMoveWrapper, lvalue) {
+  std::unique_ptr<int> p;
+  makeMoveWrapper(p);
+}
+
+TEST(makeMoveWrapper, lvalue_copyable) {
+  std::shared_ptr<int> p;
+  makeMoveWrapper(p);
+}
+
 } // namespace
 } // namespace