Make optional copyable when possible.

GitOrigin-RevId: 28c37171a9db3e868a21bc028ba24fee05833b35
This commit is contained in:
levlam 2018-08-12 15:31:24 +03:00
parent 4f8d855527
commit 3728c89f53

View File

@ -13,7 +13,7 @@
namespace td {
template <class T>
template <class T, bool = std::is_copy_constructible<T>::value>
class optional {
public:
optional() = default;
@ -22,6 +22,25 @@ class optional {
int> = 0>
optional(T1 &&t) : impl_(std::forward<T1>(t)) {
}
optional(const optional &other) {
if (other) {
impl_ = Result<T>(other.value());
}
}
optional &operator=(const optional &other) {
if (other) {
impl_ = Result<T>(other.value());
} else {
impl_ = Result<T>();
}
}
optional(optional &&other) = default;
optional &operator=(optional &&other) = default;
~optional() = default;
explicit operator bool() const {
return impl_.is_ok();
}
@ -39,4 +58,17 @@ class optional {
Result<T> impl_;
};
template <typename T>
struct optional<T, false> : optional<T, true> {
optional() = default;
using optional<T, true>::optional;
optional(const optional &other) = delete;
optional &operator=(const optional &other) = delete;
optional(optional &&) = default;
optional &operator=(optional &&) = default;
~optional() = default;
};
} // namespace td