Enable Option to hold a noncopyable type. Review: https://reviews.apache.org/r/35431
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/fb0a6d9e Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/fb0a6d9e Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/fb0a6d9e Branch: refs/heads/master Commit: fb0a6d9e69282073ad3bcd68ab32c49c817d01b3 Parents: 654cabf Author: Michael Park <[email protected]> Authored: Sun Jun 14 03:26:56 2015 -0700 Committer: Benjamin Hindman <[email protected]> Committed: Sun Jun 14 04:12:01 2015 -0700 ---------------------------------------------------------------------- .../3rdparty/stout/include/stout/option.hpp | 27 ++++++++++++++ .../3rdparty/stout/tests/option_tests.cpp | 39 ++++++++++++++++++++ 2 files changed, 66 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/fb0a6d9e/3rdparty/libprocess/3rdparty/stout/include/stout/option.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/option.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/option.hpp index 8d5217a..3d9b7a7 100644 --- a/3rdparty/libprocess/3rdparty/stout/include/stout/option.hpp +++ b/3rdparty/libprocess/3rdparty/stout/include/stout/option.hpp @@ -39,6 +39,8 @@ public: Option(const T& _t) : state(SOME), t(_t) {} + Option(T&& _t) : state(SOME), t(std::move(_t)) {} + template <typename U> Option(const U& u) : state(SOME), t(u) {} @@ -47,6 +49,9 @@ public: template <typename U> Option(const _Some<U>& some) : state(SOME), t(some.t) {} + template <typename U> + Option(_Some<U>&& some) : state(SOME), t(std::move(some.t)) {} + Option(const Option<T>& that) : state(that.state) { if (that.isSome()) { @@ -54,6 +59,13 @@ public: } } + Option(Option<T>&& that) : state(std::move(that.state)) + { + if (that.isSome()) { + new (&t) T(std::move(that.t)); + } + } + ~Option() { if (isSome()) { @@ -76,6 +88,21 @@ public: return *this; } + Option<T>& operator = (Option<T>&& that) + { + if (this != &that) { + if (isSome()) { + t.~T(); + } + state = std::move(that.state); + if (that.isSome()) { + new (&t) T(std::move(that.t)); + } + } + + return *this; + } + bool operator == (const Option<T>& that) const { return (isNone() && that.isNone()) || http://git-wip-us.apache.org/repos/asf/mesos/blob/fb0a6d9e/3rdparty/libprocess/3rdparty/stout/tests/option_tests.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/3rdparty/stout/tests/option_tests.cpp b/3rdparty/libprocess/3rdparty/stout/tests/option_tests.cpp index f1ae80a..0e5d451 100644 --- a/3rdparty/libprocess/3rdparty/stout/tests/option_tests.cpp +++ b/3rdparty/libprocess/3rdparty/stout/tests/option_tests.cpp @@ -101,3 +101,42 @@ TEST(OptionTest, NonConstReference) s.get() += " world"; EXPECT_EQ("hello world", s.get()); } + + +struct NonCopyable +{ + NonCopyable() = default; + NonCopyable(NonCopyable&&) = default; + NonCopyable(const NonCopyable& that) = delete; +}; + + +TEST(OptionTest, NonCopyable) +{ + Option<NonCopyable> o1(NonCopyable{}); + ASSERT_SOME(o1); + + o1 = NonCopyable(); + ASSERT_SOME(o1); + + o1 = None(); + ASSERT_NONE(o1); + + Option<NonCopyable> o2 = NonCopyable(); + ASSERT_SOME(o2); + + o2 = NonCopyable(); + ASSERT_SOME(o2); + + o2 = None(); + ASSERT_NONE(o2); + + Option<NonCopyable> o3 = None(); + ASSERT_NONE(o3); + + Option<NonCopyable> o4 = Some(NonCopyable()); + ASSERT_SOME(o4); + + o4 = Some(NonCopyable()); + ASSERT_SOME(o4); +}
