Commit efcacd1c authored by Giuseppe Ottaviano's avatar Giuseppe Ottaviano Committed by Facebook Github Bot

MoveOnly utility

Summary: Same as `boost::noncopyable` but it does not disable move constructor/assignment.

Reviewed By: luciang

Differential Revision: D5311043

fbshipit-source-id: 44fe95712169b95a00e474385be43fa857cfd8ec
parent a1a70d94
......@@ -158,4 +158,27 @@ struct Identity {
return static_cast<T&&>(x);
}
};
}
namespace moveonly_ { // Protection from unintended ADL.
/**
* Disallow copy but not move in derived types. This is essentially
* boost::noncopyable (the implementation is almost identical) but it
* doesn't delete move constructor and move assignment.
*/
class MoveOnly {
protected:
constexpr MoveOnly() = default;
~MoveOnly() = default;
MoveOnly(MoveOnly&&) = default;
MoveOnly& operator=(MoveOnly&&) = default;
MoveOnly(const MoveOnly&) = delete;
MoveOnly& operator=(const MoveOnly&) = delete;
};
} // namespace moveonly_
using MoveOnly = moveonly_::MoveOnly;
} // namespace folly
......@@ -14,8 +14,9 @@
* limitations under the License.
*/
#include <folly/Utility.h>
#include <type_traits>
#include <folly/Utility.h>
#include <folly/portability/GTest.h>
namespace {
......@@ -88,3 +89,24 @@ TEST(FollyIntegerSequence, core) {
static_assert(seq3.size() == 3, "");
EXPECT_EQ(3, seq3.size());
}
TEST_F(UtilityTest, MoveOnly) {
class FooBar : folly::MoveOnly {
int a;
};
static_assert(
!std::is_copy_constructible<FooBar>::value,
"Should not be copy constructible");
// Test that move actually works.
FooBar foobar;
FooBar foobar2(std::move(foobar));
(void)foobar2;
// Test that inheriting from MoveOnly doesn't prevent the move
// constructor from being noexcept.
static_assert(
std::is_nothrow_move_constructible<FooBar>::value,
"Should have noexcept move constructor");
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment