aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/core/public/status.h
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_