Use negative error codes in Result.
GitOrigin-RevId: 3ee4ccc424062be87198b2d706b791d5bf8e2020
This commit is contained in:
parent
0c907b38a8
commit
6e57c13f43
@ -58,26 +58,6 @@ class PromiseInterface {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T = Unit>
|
|
||||||
class FutureInterface {
|
|
||||||
public:
|
|
||||||
FutureInterface() = default;
|
|
||||||
FutureInterface(const FutureInterface &) = delete;
|
|
||||||
FutureInterface &operator=(const FutureInterface &) = delete;
|
|
||||||
FutureInterface(FutureInterface &&) = default;
|
|
||||||
FutureInterface &operator=(FutureInterface &&) = default;
|
|
||||||
virtual ~FutureInterface() = default;
|
|
||||||
virtual bool is_ready() = 0;
|
|
||||||
virtual bool is_ok() = 0;
|
|
||||||
virtual bool is_error() = 0;
|
|
||||||
virtual const T &ok() = 0;
|
|
||||||
virtual T move_as_ok() = 0;
|
|
||||||
virtual const Status &error() = 0;
|
|
||||||
virtual Status move_as_error() TD_WARN_UNUSED_RESULT = 0;
|
|
||||||
virtual const Result<T> &result() = 0;
|
|
||||||
virtual Result<T> move_as_result() TD_WARN_UNUSED_RESULT = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
class SafePromise;
|
class SafePromise;
|
||||||
|
|
||||||
|
@ -173,6 +173,18 @@ class Status {
|
|||||||
return ptr_ != nullptr;
|
return ptr_ != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TD_STATUS_NO_ENSURE
|
||||||
|
void ensure() const {
|
||||||
|
if (!is_ok()) {
|
||||||
|
LOG(FATAL) << "Unexpected Status " << to_string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void ensure_error() const {
|
||||||
|
if (is_ok()) {
|
||||||
|
LOG(FATAL) << "Unexpected Status::OK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
void ensure_impl(CSlice file_name, int line) const {
|
void ensure_impl(CSlice file_name, int line) const {
|
||||||
if (!is_ok()) {
|
if (!is_ok()) {
|
||||||
LOG(FATAL) << "Unexpected Status " << to_string() << " in file " << file_name << " at line " << line;
|
LOG(FATAL) << "Unexpected Status " << to_string() << " in file " << file_name << " at line " << line;
|
||||||
@ -183,6 +195,7 @@ class Status {
|
|||||||
LOG(FATAL) << "Unexpected Status::OK in file " << file_name << " at line " << line;
|
LOG(FATAL) << "Unexpected Status::OK in file " << file_name << " at line " << line;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void ignore() const {
|
void ignore() const {
|
||||||
// nop
|
// nop
|
||||||
@ -311,7 +324,7 @@ class Status {
|
|||||||
template <class T = Unit>
|
template <class T = Unit>
|
||||||
class Result {
|
class Result {
|
||||||
public:
|
public:
|
||||||
Result() : status_(Status::Error<1>()) {
|
Result() : status_(Status::Error<-1>()) {
|
||||||
}
|
}
|
||||||
template <class S, std::enable_if_t<!std::is_same<std::decay_t<S>, Result>::value, int> = 0>
|
template <class S, std::enable_if_t<!std::is_same<std::decay_t<S>, Result>::value, int> = 0>
|
||||||
Result(S &&x) : status_(), value_(std::forward<S>(x)) {
|
Result(S &&x) : status_(), value_(std::forward<S>(x)) {
|
||||||
@ -326,7 +339,7 @@ class Result {
|
|||||||
new (&value_) T(std::move(other.value_));
|
new (&value_) T(std::move(other.value_));
|
||||||
other.value_.~T();
|
other.value_.~T();
|
||||||
}
|
}
|
||||||
other.status_ = Status::Error<2>();
|
other.status_ = Status::Error<-2>();
|
||||||
}
|
}
|
||||||
Result &operator=(Result &&other) {
|
Result &operator=(Result &&other) {
|
||||||
if (status_.is_ok()) {
|
if (status_.is_ok()) {
|
||||||
@ -344,7 +357,7 @@ class Result {
|
|||||||
other.value_.~T();
|
other.value_.~T();
|
||||||
}
|
}
|
||||||
status_ = std::move(other.status_);
|
status_ = std::move(other.status_);
|
||||||
other.status_ = Status::Error<3>();
|
other.status_ = Status::Error<-3>();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
~Result() {
|
~Result() {
|
||||||
@ -353,12 +366,21 @@ class Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TD_STATUS_NO_ENSURE
|
||||||
|
void ensure() const {
|
||||||
|
status_.ensure();
|
||||||
|
}
|
||||||
|
void ensure_error() const {
|
||||||
|
status_.ensure_error();
|
||||||
|
}
|
||||||
|
#else
|
||||||
void ensure_impl(CSlice file_name, int line) const {
|
void ensure_impl(CSlice file_name, int line) const {
|
||||||
status_.ensure_impl(file_name, line);
|
status_.ensure_impl(file_name, line);
|
||||||
}
|
}
|
||||||
void ensure_error_impl(CSlice file_name, int line) const {
|
void ensure_error_impl(CSlice file_name, int line) const {
|
||||||
status_.ensure_error_impl(file_name, line);
|
status_.ensure_error_impl(file_name, line);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
void ignore() const {
|
void ignore() const {
|
||||||
status_.ignore();
|
status_.ignore();
|
||||||
}
|
}
|
||||||
@ -375,7 +397,7 @@ class Result {
|
|||||||
Status move_as_error() TD_WARN_UNUSED_RESULT {
|
Status move_as_error() TD_WARN_UNUSED_RESULT {
|
||||||
CHECK(status_.is_error());
|
CHECK(status_.is_error());
|
||||||
SCOPE_EXIT {
|
SCOPE_EXIT {
|
||||||
status_ = Status::Error<4>();
|
status_ = Status::Error<-4>();
|
||||||
};
|
};
|
||||||
return std::move(status_);
|
return std::move(status_);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user