Move tensorflow::Status to tensorflow/core/platform

This is to make TF code structure better/easier to follow.

PiperOrigin-RevId: 282599457
Change-Id: I1fabbbaf7231e8f306d392633ff2a1adf5f639c8
diff --git a/tensorflow/core/BUILD b/tensorflow/core/BUILD
index 25cd693..b0dec24 100644
--- a/tensorflow/core/BUILD
+++ b/tensorflow/core/BUILD
@@ -433,6 +433,7 @@
         "//tensorflow/core/platform:profile_utils/i_cpu_utils_helper.h",
         "//tensorflow/core/platform:stacktrace.h",
         "//tensorflow/core/platform:stacktrace_handler.h",
+        "//tensorflow/core/platform:status.h",
         "//tensorflow/core/platform:stringpiece.h",
         "//tensorflow/core/platform:stringprintf.h",
         "//tensorflow/core/platform:strcat.h",
@@ -491,6 +492,7 @@
         "//tensorflow/core/platform:macros",
         "//tensorflow/core/platform:protobuf",
         "//tensorflow/core/platform:platform",
+        "//tensorflow/core/platform:status",
         "//tensorflow/core/platform:stringpiece",
         "//tensorflow/core/platform:tstring",
         "//tensorflow/core/platform:types",
@@ -529,9 +531,6 @@
     visibility = ["//visibility:public"],
     deps = [
         ":lib_internal",
-        "//tensorflow/core/platform:str_util",
-        "//tensorflow/core/platform:stringpiece",
-        "//tensorflow/core/platform:stringprintf",
         "@com_google_absl//absl/container:inlined_vector",
         "@com_google_absl//absl/strings",
         "@com_google_absl//absl/types:optional",
@@ -2160,7 +2159,6 @@
         "@com_google_absl//absl/strings",
         "//third_party/eigen3",
         "@com_google_absl//absl/base:core_headers",
-        "//tensorflow/core/platform:regexp",
         "//tensorflow/core/platform/default/build_config:platformlib",
     ] + if_static([":lib_internal_impl"]),
 )
@@ -2281,9 +2279,11 @@
         "//tensorflow/core/platform:regexp",
         "//tensorflow/core/platform:scanner",
         "//tensorflow/core/platform:setround",
-        "//tensorflow/core/platform:strong_hash",
+        "//tensorflow/core/platform:status",
         "//tensorflow/core/platform:strcat",
+        "//tensorflow/core/platform:stringpiece",
         "//tensorflow/core/platform:stringprintf",
+        "//tensorflow/core/platform:strong_hash",
         "//tensorflow/core/platform:str_util",
         "//tensorflow/core/platform:subprocess",
         "//tensorflow/core/platform:tensor_coding",
diff --git a/tensorflow/core/lib/core/BUILD b/tensorflow/core/lib/core/BUILD
index 5e51b4b..af8ed22 100644
--- a/tensorflow/core/lib/core/BUILD
+++ b/tensorflow/core/lib/core/BUILD
@@ -100,21 +100,9 @@
 
 cc_library(
     name = "status",
-    srcs = ["status.cc"],
     hdrs = ["status.h"],
     deps = [
-        ":error_codes_proto_cc",
-        "//tensorflow/core:error_codes_proto_impl_cc",
-        "//tensorflow/core/platform:logging",
-        "//tensorflow/core/platform:macros",
-        "//tensorflow/core/platform:mutex",
-        "//tensorflow/core/platform:stacktrace",
-        "//tensorflow/core/platform:str_util",
-        "//tensorflow/core/platform:strcat",
-        "//tensorflow/core/platform:stringpiece",
-        "//tensorflow/core/platform:stringprintf",
-        "//tensorflow/core/platform:types",
-        "@com_google_absl//absl/base",
+        "//tensorflow/core/platform:status",
     ],
 )
 
@@ -190,7 +178,6 @@
         "arena.cc",
         "bitmap.cc",
         "coding.cc",
-        "status.cc",
     ],
     visibility = ["//tensorflow/core:__pkg__"],
 )
diff --git a/tensorflow/core/lib/core/status.h b/tensorflow/core/lib/core/status.h
index a863f2f..47a4908 100644
--- a/tensorflow/core/lib/core/status.h
+++ b/tensorflow/core/lib/core/status.h
@@ -16,185 +16,6 @@
 #ifndef TENSORFLOW_CORE_LIB_CORE_STATUS_H_
 #define TENSORFLOW_CORE_LIB_CORE_STATUS_H_
 
-#include <functional>
-#include <iosfwd>
-#include <memory>
-#include <string>
-
-#include "tensorflow/core/platform/logging.h"
-#include "tensorflow/core/platform/macros.h"
-#include "tensorflow/core/platform/stringpiece.h"
-#include "tensorflow/core/platform/types.h"
-#include "tensorflow/core/protobuf/error_codes.pb.h"
-
-namespace tensorflow {
-
-#if defined(__clang__)
-// Only clang supports warn_unused_result as a type annotation.
-class TF_MUST_USE_RESULT Status;
-#endif
-
-/// @ingroup core
-/// Denotes success or failure of a call in Tensorflow.
-class Status {
- public:
-  /// Create a success status.
-  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);
-  Status& operator=(const Status& s);
-#ifndef SWIG
-  Status(Status&& s) noexcept;
-  Status& operator=(Status&& s) noexcept;
-#endif  // SWIG
-
-  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;
-
-  // Ignores any errors. This method does nothing except potentially suppress
-  // complaints from any tools that are checking that errors are not dropped on
-  // the floor.
-  void IgnoreError() 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)
-  std::unique_ptr<State> state_;
-
-  void SlowCopyFrom(const State* src);
-};
-
-// Helper class to manage multiple child status values.
-class StatusGroup {
- public:
-  // Utility function to mark a Status as derived. By marking derived status,
-  // Derived status messages are ignored when reporting errors to end users.
-  static Status MakeDerived(const Status& s);
-  static bool IsDerived(const Status& s);
-
-  // Enable warning and error log collection for appending to the aggregated
-  // status. This function may be called more than once.
-  static void ConfigureLogHistory();
-
-  // Return a merged status with combined child status messages with a summary.
-  Status as_summary_status() const;
-  // Return a merged status with combined child status messages with
-  // concatenation.
-  Status as_concatenated_status() const;
-
-  bool ok() const { return ok_; }
-
-  // Augment this group with the child status `status`.
-  void Update(const Status& status);
-
-  // Attach recent warning and error log messages
-  void AttachLogMessages();
-  bool HasLogMessages() const { return !recent_logs_.empty(); }
-
- private:
-  bool ok_ = true;
-  size_t num_ok_ = 0;
-  std::vector<Status> children_;
-  std::vector<std::string> recent_logs_;  // recent warning and error logs
-};
-
-inline Status::Status(const Status& s)
-    : state_((s.state_ == nullptr) ? nullptr : new State(*s.state_)) {}
-
-inline Status& 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_.get());
-  }
-  return *this;
-}
-
-#ifndef SWIG
-inline Status::Status(Status&& s) noexcept : state_(std::move(s.state_)) {}
-
-inline Status& Status::operator=(Status&& s) noexcept {
-  if (state_ != s.state_) {
-    state_ = std::move(s.state_);
-  }
-  return *this;
-}
-#endif  // SWIG
-
-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); }
-
-/// @ingroup core
-std::ostream& operator<<(std::ostream& os, const Status& x);
-
-typedef std::function<void(const Status&)> StatusCallback;
-
-extern tensorflow::string* TfCheckOpHelperOutOfLine(
-    const ::tensorflow::Status& v, const char* msg);
-
-inline tensorflow::string* TfCheckOpHelper(::tensorflow::Status v,
-                                           const char* msg) {
-  if (v.ok()) return nullptr;
-  return TfCheckOpHelperOutOfLine(v, msg);
-}
-
-#define TF_DO_CHECK_OK(val, level)                                \
-  while (auto _result = ::tensorflow::TfCheckOpHelper(val, #val)) \
-  LOG(level) << *(_result)
-
-#define TF_CHECK_OK(val) TF_DO_CHECK_OK(val, FATAL)
-#define TF_QCHECK_OK(val) TF_DO_CHECK_OK(val, QFATAL)
-
-// DEBUG only version of TF_CHECK_OK.  Compiler still parses 'val' even in opt
-// mode.
-#ifndef NDEBUG
-#define TF_DCHECK_OK(val) TF_CHECK_OK(val)
-#else
-#define TF_DCHECK_OK(val) \
-  while (false && (::tensorflow::Status::OK() == (val))) LOG(FATAL)
-#endif
-
-}  // namespace tensorflow
+#include "tensorflow/core/platform/status.h"
 
 #endif  // TENSORFLOW_CORE_LIB_CORE_STATUS_H_
diff --git a/tensorflow/core/platform/BUILD b/tensorflow/core/platform/BUILD
index 4ec29ce..5140d45 100644
--- a/tensorflow/core/platform/BUILD
+++ b/tensorflow/core/platform/BUILD
@@ -428,6 +428,16 @@
 )
 
 cc_library(
+    name = "setround",
+    srcs = ["setround.cc"],
+    hdrs = ["setround.h"],
+    deps = [
+        ":logging",
+        ":macros",
+    ],
+)
+
+cc_library(
     name = "stacktrace",
     hdrs = ["stacktrace.h"],
     deps = [
@@ -453,12 +463,21 @@
 )
 
 cc_library(
-    name = "setround",
-    srcs = ["setround.cc"],
-    hdrs = ["setround.h"],
+    name = "status",
+    srcs = ["status.cc"],
+    hdrs = ["status.h"],
     deps = [
         ":logging",
         ":macros",
+        ":mutex",
+        ":stacktrace",
+        ":str_util",
+        ":strcat",
+        ":stringpiece",
+        ":stringprintf",
+        ":types",
+        "//tensorflow/core:error_codes_proto_impl_cc",
+        "@com_google_absl//absl/base",
     ],
 )
 
@@ -805,6 +824,7 @@
             "protobuf_util.cc",
             "scanner.cc",
             "setround.cc",
+            "status.cc",
             "strcat.cc",
             "stringprintf.cc",
             "str_util.cc",
diff --git a/tensorflow/core/lib/core/status.cc b/tensorflow/core/platform/status.cc
similarity index 99%
rename from tensorflow/core/lib/core/status.cc
rename to tensorflow/core/platform/status.cc
index ac8d0fb..a7fd3e6 100644
--- a/tensorflow/core/lib/core/status.cc
+++ b/tensorflow/core/platform/status.cc
@@ -13,7 +13,7 @@
 limitations under the License.
 ==============================================================================*/
 
-#include "tensorflow/core/lib/core/status.h"
+#include "tensorflow/core/platform/status.h"
 
 #include <stdio.h>
 
diff --git a/tensorflow/core/platform/status.h b/tensorflow/core/platform/status.h
new file mode 100644
index 0000000..b9763a1
--- /dev/null
+++ b/tensorflow/core/platform/status.h
@@ -0,0 +1,200 @@
+/* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+==============================================================================*/
+
+#ifndef TENSORFLOW_CORE_PLATFORM_STATUS_H_
+#define TENSORFLOW_CORE_PLATFORM_STATUS_H_
+
+#include <functional>
+#include <iosfwd>
+#include <memory>
+#include <string>
+
+#include "tensorflow/core/platform/logging.h"
+#include "tensorflow/core/platform/macros.h"
+#include "tensorflow/core/platform/stringpiece.h"
+#include "tensorflow/core/platform/types.h"
+#include "tensorflow/core/protobuf/error_codes.pb.h"
+
+namespace tensorflow {
+
+#if defined(__clang__)
+// Only clang supports warn_unused_result as a type annotation.
+class TF_MUST_USE_RESULT Status;
+#endif
+
+/// @ingroup core
+/// Denotes success or failure of a call in Tensorflow.
+class Status {
+ public:
+  /// Create a success status.
+  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);
+  Status& operator=(const Status& s);
+#ifndef SWIG
+  Status(Status&& s) noexcept;
+  Status& operator=(Status&& s) noexcept;
+#endif  // SWIG
+
+  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;
+
+  // Ignores any errors. This method does nothing except potentially suppress
+  // complaints from any tools that are checking that errors are not dropped on
+  // the floor.
+  void IgnoreError() 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)
+  std::unique_ptr<State> state_;
+
+  void SlowCopyFrom(const State* src);
+};
+
+// Helper class to manage multiple child status values.
+class StatusGroup {
+ public:
+  // Utility function to mark a Status as derived. By marking derived status,
+  // Derived status messages are ignored when reporting errors to end users.
+  static Status MakeDerived(const Status& s);
+  static bool IsDerived(const Status& s);
+
+  // Enable warning and error log collection for appending to the aggregated
+  // status. This function may be called more than once.
+  static void ConfigureLogHistory();
+
+  // Return a merged status with combined child status messages with a summary.
+  Status as_summary_status() const;
+  // Return a merged status with combined child status messages with
+  // concatenation.
+  Status as_concatenated_status() const;
+
+  bool ok() const { return ok_; }
+
+  // Augment this group with the child status `status`.
+  void Update(const Status& status);
+
+  // Attach recent warning and error log messages
+  void AttachLogMessages();
+  bool HasLogMessages() const { return !recent_logs_.empty(); }
+
+ private:
+  bool ok_ = true;
+  size_t num_ok_ = 0;
+  std::vector<Status> children_;
+  std::vector<std::string> recent_logs_;  // recent warning and error logs
+};
+
+inline Status::Status(const Status& s)
+    : state_((s.state_ == nullptr) ? nullptr : new State(*s.state_)) {}
+
+inline Status& 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_.get());
+  }
+  return *this;
+}
+
+#ifndef SWIG
+inline Status::Status(Status&& s) noexcept : state_(std::move(s.state_)) {}
+
+inline Status& Status::operator=(Status&& s) noexcept {
+  if (state_ != s.state_) {
+    state_ = std::move(s.state_);
+  }
+  return *this;
+}
+#endif  // SWIG
+
+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); }
+
+/// @ingroup core
+std::ostream& operator<<(std::ostream& os, const Status& x);
+
+typedef std::function<void(const Status&)> StatusCallback;
+
+extern tensorflow::string* TfCheckOpHelperOutOfLine(
+    const ::tensorflow::Status& v, const char* msg);
+
+inline tensorflow::string* TfCheckOpHelper(::tensorflow::Status v,
+                                           const char* msg) {
+  if (v.ok()) return nullptr;
+  return TfCheckOpHelperOutOfLine(v, msg);
+}
+
+#define TF_DO_CHECK_OK(val, level)                                \
+  while (auto _result = ::tensorflow::TfCheckOpHelper(val, #val)) \
+  LOG(level) << *(_result)
+
+#define TF_CHECK_OK(val) TF_DO_CHECK_OK(val, FATAL)
+#define TF_QCHECK_OK(val) TF_DO_CHECK_OK(val, QFATAL)
+
+// DEBUG only version of TF_CHECK_OK.  Compiler still parses 'val' even in opt
+// mode.
+#ifndef NDEBUG
+#define TF_DCHECK_OK(val) TF_CHECK_OK(val)
+#else
+#define TF_DCHECK_OK(val) \
+  while (false && (::tensorflow::Status::OK() == (val))) LOG(FATAL)
+#endif
+
+}  // namespace tensorflow
+
+#endif  // TENSORFLOW_CORE_PLATFORM_STATUS_H_
diff --git a/tensorflow/python/lib/io/file_io.i b/tensorflow/python/lib/io/file_io.i
index 087444f..cbd619b 100644
--- a/tensorflow/python/lib/io/file_io.i
+++ b/tensorflow/python/lib/io/file_io.i
@@ -276,7 +276,7 @@
                       TF_Status* status);
 
 %ignore tensorflow::Status::operator=;
-%include "tensorflow/core/lib/core/status.h"
+%include "tensorflow/core/platform/status.h"
 
 %ignoreall
 %unignore tensorflow::io;