Add conversion methods to hidl_string and hidl_vec

Add unit test for libhidl.

Test: mma
Test: make libhidl-test

Bug: 30471989
Bug: 31982575

Change-Id: Ic7d73a10e5cc178786c628e18d3659400b1afb92
diff --git a/HidlSupport.cpp b/HidlSupport.cpp
index ed3e12e..c8a2821 100644
--- a/HidlSupport.cpp
+++ b/HidlSupport.cpp
@@ -20,6 +20,7 @@
 #include <android-base/logging.h>
 #include <cutils/properties.h>
 #include <regex>
+#include <utility>
 #endif
 
 namespace android {
@@ -28,9 +29,9 @@
 static const char *const kEmptyString = "";
 
 hidl_string::hidl_string()
-    : mBuffer(const_cast<char *>(kEmptyString)),
+    : mBuffer(kEmptyString),
       mSize(0),
-      mOwnsBuffer(true) {
+      mOwnsBuffer(false) {
 }
 
 hidl_string::~hidl_string() {
@@ -38,61 +39,100 @@
 }
 
 hidl_string::hidl_string(const char *s) : hidl_string() {
-    *this = s;
+    copyFrom(s, strlen(s));
 }
 
-hidl_string::hidl_string(const hidl_string &other)
-    : mBuffer(const_cast<char *>(kEmptyString)),
-      mSize(0),
-      mOwnsBuffer(true) {
-    setTo(other.c_str(), other.size());
+hidl_string::hidl_string(const hidl_string &other): hidl_string() {
+    copyFrom(other.c_str(), other.size());
+}
+
+hidl_string::hidl_string(const std::string &s) : hidl_string() {
+    copyFrom(s.c_str(), s.size());
+}
+
+hidl_string::hidl_string(hidl_string &&other): hidl_string() {
+    moveFrom(std::forward<hidl_string>(other));
+}
+
+hidl_string &hidl_string::operator=(hidl_string &&other) {
+    if (this != &other) {
+        clear();
+        moveFrom(std::forward<hidl_string>(other));
+    }
+    return *this;
 }
 
 hidl_string &hidl_string::operator=(const hidl_string &other) {
     if (this != &other) {
-        setTo(other.c_str(), other.size());
+        clear();
+        copyFrom(other.c_str(), other.size());
     }
 
     return *this;
 }
 
 hidl_string &hidl_string::operator=(const char *s) {
-    return setTo(s, strlen(s));
+    clear();
+    copyFrom(s, strlen(s));
+    return *this;
 }
 
-hidl_string &hidl_string::setTo(const char *data, size_t size) {
+hidl_string &hidl_string::operator=(const std::string &s) {
     clear();
+    copyFrom(s.c_str(), s.size());
+    return *this;
+}
 
-    mBuffer = (char *)malloc(size + 1);
-    memcpy(mBuffer, data, size);
-    mBuffer[size] = '\0';
+hidl_string::operator std::string() const {
+    return std::string(mBuffer, mSize);
+}
+
+hidl_string::operator const char *() const {
+    return mBuffer;
+}
+
+void hidl_string::copyFrom(const char *data, size_t size) {
+    // assume my resources are freed.
+
+    char *buf = (char *)malloc(size + 1);
+    memcpy(buf, data, size);
+    buf[size] = '\0';
+    mBuffer = buf;
 
     mSize = size;
     mOwnsBuffer = true;
+}
 
-    return *this;
+void hidl_string::moveFrom(hidl_string &&other) {
+    // assume my resources are freed.
+
+    mBuffer = other.mBuffer;
+    mSize = other.mSize;
+    mOwnsBuffer = other.mOwnsBuffer;
+
+    other.mOwnsBuffer = false;
 }
 
 void hidl_string::clear() {
     if (mOwnsBuffer && (mBuffer != kEmptyString)) {
-        free(mBuffer);
+        free(const_cast<char *>(mBuffer));
     }
 
-    mBuffer = const_cast<char *>(kEmptyString);
+    mBuffer = kEmptyString;
     mSize = 0;
-    mOwnsBuffer = true;
+    mOwnsBuffer = false;
 }
 
 void hidl_string::setToExternal(const char *data, size_t size) {
     clear();
 
-    mBuffer = const_cast<char *>(data);
+    mBuffer = data;
     mSize = size;
     mOwnsBuffer = false;
 }
 
 const char *hidl_string::c_str() const {
-    return mBuffer ? mBuffer : "";
+    return mBuffer;
 }
 
 size_t hidl_string::size() const {