blob: d0405b88761b6d1177d84a3e8bb259e75940cbbe (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#ifndef TENSORFLOW_PUBLIC_STATUS_H_
#define TENSORFLOW_PUBLIC_STATUS_H_
#include <iosfwd>
#include <string>
#include "tensorflow/core/lib/core/error_codes.pb.h"
#include "tensorflow/core/lib/core/stringpiece.h"
#include "tensorflow/core/platform/logging.h"
namespace tensorflow {
class Status {
public:
/// Create a success status.
Status() : state_(NULL) {}
~Status();
/// \brief Create a status with the specified error code and msg as a
/// human-readable string containing more detailed information.
Status(tensorflow::error::Code code, tensorflow::StringPiece msg);
/// Copy the specified status.
Status(const Status& s);
void operator=(const Status& s);
static Status OK() { return Status(); }
/// Returns true iff the status indicates success.
bool ok() const { return (state_ == NULL); }
tensorflow::error::Code code() const {
return ok() ? tensorflow::error::OK : state_->code;
}
const string& error_message() const {
return ok() ? empty_string() : state_->msg;
}
bool operator==(const Status& x) const;
bool operator!=(const Status& x) const;
/// \brief If "ok()", stores "new_status" into *this. If "!ok()", preserves
/// the current status, but may augment with additional information
/// about "new_status".
///
/// Convenient way of keeping track of the first error encountered.
/// Instead of:
/// if (overall_status.ok()) overall_status = new_status
/// Use:
/// overall_status.Update(new_status);
void Update(const Status& new_status);
/// \brief Return a string representation of this status suitable for
/// printing. Returns the string "OK" for success.
string ToString() const;
private:
static const string& empty_string();
struct State {
tensorflow::error::Code code;
string msg;
};
/// OK status has a NULL state_. Otherwise, state_ points to
/// a State structure containing the error code and message(s)
State* state_;
void SlowCopyFrom(const State* src);
};
inline Status::Status(const Status& s)
: state_((s.state_ == NULL) ? NULL : new State(*s.state_)) {}
inline void Status::operator=(const Status& s) {
/// The following condition catches both aliasing (when this == &s),
/// and the common case where both s and *this are ok.
if (state_ != s.state_) {
SlowCopyFrom(s.state_);
}
}
inline bool Status::operator==(const Status& x) const {
return (this->state_ == x.state_) || (ToString() == x.ToString());
}
inline bool Status::operator!=(const Status& x) const { return !(*this == x); }
std::ostream& operator<<(std::ostream& os, const Status& x);
typedef std::function<void(const Status&)> StatusCallback;
#define TF_CHECK_OK(val) CHECK_EQ(::tensorflow::Status::OK(), (val))
#define TF_QCHECK_OK(val) QCHECK_EQ(::tensorflow::Status::OK(), (val))
} // namespace tensorflow
#endif // TENSORFLOW_PUBLIC_STATUS_H_
|