Merge "Stop using __system_property_area__" am: 90c12683ee am: 0ce0b54a0e
am: 369e25dccb

Change-Id: I1921850653794829a1e0df168afe71cebdc5a795
diff --git a/include/nativehelper/ScopedUtfChars.h b/include/nativehelper/ScopedUtfChars.h
index 9cfa9a0..aa8489d 100644
--- a/include/nativehelper/ScopedUtfChars.h
+++ b/include/nativehelper/ScopedUtfChars.h
@@ -22,30 +22,53 @@
 
 // A smart pointer that provides read-only access to a Java string's UTF chars.
 // Unlike GetStringUTFChars, we throw NullPointerException rather than abort if
-// passed a null jstring, and c_str will return NULL.
+// passed a null jstring, and c_str will return nullptr.
 // This makes the correct idiom very simple:
 //
 //   ScopedUtfChars name(env, java_name);
-//   if (name.c_str() == NULL) {
-//     return NULL;
+//   if (name.c_str() == nullptr) {
+//     return nullptr;
 //   }
 class ScopedUtfChars {
  public:
   ScopedUtfChars(JNIEnv* env, jstring s) : env_(env), string_(s) {
-    if (s == NULL) {
-      utf_chars_ = NULL;
-      jniThrowNullPointerException(env, NULL);
+    if (s == nullptr) {
+      utf_chars_ = nullptr;
+      jniThrowNullPointerException(env, nullptr);
     } else {
-      utf_chars_ = env->GetStringUTFChars(s, NULL);
+      utf_chars_ = env->GetStringUTFChars(s, nullptr);
     }
   }
 
+  ScopedUtfChars(ScopedUtfChars&& rhs) :
+      env_(rhs.env_), string_(rhs.string_), utf_chars_(rhs.utf_chars_) {
+    rhs.env_ = nullptr;
+    rhs.string_ = nullptr;
+    rhs.utf_chars_ = nullptr;
+  }
+
   ~ScopedUtfChars() {
     if (utf_chars_) {
       env_->ReleaseStringUTFChars(string_, utf_chars_);
     }
   }
 
+  ScopedUtfChars& operator=(ScopedUtfChars&& rhs) {
+    if (this != &rhs) {
+      // Delete the currently owned UTF chars.
+      this->~ScopedUtfChars();
+
+      // Move the rhs ScopedUtfChars and zero it out.
+      env_ = rhs.env_;
+      string_ = rhs.string_;
+      utf_chars_ = rhs.utf_chars_;
+      rhs.env_ = nullptr;
+      rhs.string_ = nullptr;
+      rhs.utf_chars_ = nullptr;
+    }
+    return *this;
+  }
+
   const char* c_str() const {
     return utf_chars_;
   }
@@ -59,8 +82,8 @@
   }
 
  private:
-  JNIEnv* const env_;
-  const jstring string_;
+  JNIEnv* env_;
+  jstring string_;
   const char* utf_chars_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedUtfChars);