HDFS-9712. libhdfs++: Reimplement Status object as a normal struct

Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/2e0dd25c
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/2e0dd25c
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/2e0dd25c

Branch: refs/heads/HDFS-8707
Commit: 2e0dd25cbab627493e6c60f488adaac3f92a583f
Parents: b0485f0
Author: Bob Hansen <b...@hp.com>
Authored: Mon Feb 1 07:57:29 2016 -0500
Committer: Bob Hansen <b...@hp.com>
Committed: Mon Feb 1 07:57:29 2016 -0500

----------------------------------------------------------------------
 .../native/libhdfspp/include/hdfspp/status.h    | 68 +++++------------
 .../main/native/libhdfspp/lib/common/status.cc  | 80 ++++++++++++--------
 2 files changed, 64 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/2e0dd25c/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h
 
b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h
index 89be771..a91ac9d 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h
@@ -23,43 +23,30 @@
 
 namespace hdfs {
 
-class StatusHelper;
 class Status {
  public:
   // Create a success status.
-  Status() : state_(NULL) { }
-  ~Status() { delete[] state_; }
-  explicit Status(int code, const char *msg);
+  Status() : code_(0) {};
+  Status(int code, const char *msg);
+  Status(int code, const char *msg1, const char *msg2);
 
-  // Copy the specified status.
-  Status(const Status& s);
-  void operator=(const Status& s);
+  // Factory methods
+  static Status OK();
+  static Status InvalidArgument(const char *msg);
+  static Status ResourceUnavailable(const char *msg);
+  static Status Unimplemented();
+  static Status Exception(const char *expception_class_name, const char 
*error_message);
+  static Status Error(const char *error_message);
+  static Status Canceled();
 
-  // Return a success status.
-  static Status OK() { return Status(); }
-  static Status InvalidArgument(const char *msg)
-  { return Status(kInvalidArgument, msg); }
-  static Status ResourceUnavailable(const char *msg)
-  { return Status(kResourceUnavailable, msg); }
-  static Status Unimplemented()
-  { return Status(kUnimplemented, ""); }
-  static Status Exception(const char *expception_class_name, const char 
*error_message)
-  { return Status(kException, expception_class_name, error_message); }
-  static Status Error(const char *error_message)
-  { return Exception("Exception", error_message); }
-  static Status Canceled()
-  { return Status(kOperationCanceled,""); }
+  // success
+  bool ok() const { return code_ == 0; }
 
-  // Returns true iff the status indicates success.
-  bool ok() const { return (state_ == NULL); }
-
-  // Return a string representation of this status suitable for printing.
   // Returns the string "OK" for success.
   std::string ToString() const;
 
-  int code() const {
-    return (state_ == NULL) ? kOk : static_cast<int>(state_[4]);
-  }
+  // get error code
+  int code() const { return code_; }
 
   enum Code {
     kOk = 0,
@@ -71,31 +58,10 @@ class Status {
   };
 
  private:
-  // OK status has a NULL state_.  Otherwise, state_ is a new[] array
-  // of the following form:
-  //    state_[0..3] == length of message
-  //    state_[4]    == code
-  //    state_[5..]  == message
-  const char* state_;
-
-  explicit Status(int code, const char *msg1, const char *msg2);
-  static const char *CopyState(const char* s);
-  static const char *ConstructState(int code, const char *msg1, const char 
*msg2);
+  int code_;
+  std::string msg_;
 };
 
-inline Status::Status(const Status& s) {
-  state_ = (s.state_ == NULL) ? NULL : CopyState(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_) {
-    delete[] state_;
-    state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
-  }
-}
-
 }
 
 #endif

http://git-wip-us.apache.org/repos/asf/hadoop/blob/2e0dd25c/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc
 
b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc
index 828f6aa..eb22247 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc
@@ -19,48 +19,62 @@
 #include "hdfspp/status.h"
 
 #include <cassert>
-#include <cstring>
+#include <sstream>
 
 namespace hdfs {
 
-Status::Status(int code, const char *msg1)
-    : state_(ConstructState(code, msg1, nullptr)) {}
-
-Status::Status(int code, const char *msg1, const char *msg2)
-    : state_(ConstructState(code, msg1, msg2)) {}
-
-const char *Status::ConstructState(int code, const char *msg1,
-                                   const char *msg2) {
-  assert(code != kOk);
-  const uint32_t len1 = strlen(msg1);
-  const uint32_t len2 = msg2 ? strlen(msg2) : 0;
-  const uint32_t size = len1 + (len2 ? (2 + len2) : 0);
-  char *result = new char[size + 8 + 2];
-  *reinterpret_cast<uint32_t *>(result) = size;
-  *reinterpret_cast<uint32_t *>(result + 4) = code;
-  memcpy(result + 8, msg1, len1);
-  if (len2) {
-    result[8 + len1] = ':';
-    result[9 + len1] = ' ';
-    memcpy(result + 10 + len1, msg2, len2);
+Status::Status(int code, const char *msg1) : code_(code) {
+  if(msg1) {
+    msg_ = msg1;
   }
-  return result;
 }
 
+Status::Status(int code, const char *msg1, const char *msg2) : code_(code) {
+  std::stringstream ss;
+  if(msg1) {
+    ss << msg1;
+    if(msg2) {
+      ss << ":" << msg2;
+    }
+  }
+  msg_ = ss.str();
+}
+
+
+Status Status::OK() {
+  return Status();
+}
+
+Status Status::InvalidArgument(const char *msg) {
+  return Status(kInvalidArgument, msg);
+}
+
+Status Status::ResourceUnavailable(const char *msg) {
+  return Status(kResourceUnavailable, msg);
+}
+
+Status Status::Unimplemented() {
+  return Status(kUnimplemented, "");
+}
+
+Status Status::Exception(const char *exception_class_name, const char 
*error_message) {
+  return Status(kException, exception_class_name, error_message);
+}
+
+Status Status::Error(const char *error_message) {
+  return Exception("Exception", error_message);
+}
+
+Status Status::Canceled() {
+  return Status(kOperationCanceled,"Operation canceled");
+}
+
+
 std::string Status::ToString() const {
-  if (!state_) {
+  if (code_ == kOk) {
     return "OK";
-  } else {
-    uint32_t length = *reinterpret_cast<const uint32_t *>(state_);
-    return std::string(state_ + 8, length);
   }
+  return msg_;
 }
 
-const char *Status::CopyState(const char *state) {
-  uint32_t size;
-  memcpy(&size, state, sizeof(size));
-  char *result = new char[size + 8];
-  memcpy(result, state, size + 8);
-  return result;
-}
 }

Reply via email to