Adding test for encrypted cloud storage; Adding preparation timing test for Fidelius...
[iotcloud.git] / version2 / src / C / IoTString.h
index bd838bb3ce8626634998ce586d8f55a3ff99cbbc..99e45bb2f287be3ce0e4e549ca812819b8b54ea1 100644 (file)
@@ -3,17 +3,18 @@
 
 #include "array.h"
 #include <string.h>
+#include <stdio.h>
 /**
  * IoTString wraps the underlying char string.
  * @author Brian Demsky <bdemsky@uci.edu>
  * @version 1.0
  */
 
-inline int hashCharArray(Array<char> *array) {
+inline unsigned int hashCharArray(Array<char> *array) {
        uint len = array->length();
-       int hash = 0;
+       unsigned int hash = 0;
        for (uint i = 0; i < len; i++) {
-               hash = 31 * hash + array->get(i);
+               hash = 31 * hash + ((unsigned int) array->get(i));
        }
        return hash;
 }
@@ -21,8 +22,10 @@ inline int hashCharArray(Array<char> *array) {
 class IoTString {
 private:
        Array<char> *array;
-       IoTString() {}
-       int hashvalue;
+       unsigned int hashvalue;
+       unsigned int refCount;
+  IoTString() : refCount (1) {}
+
        /**
         * Builds an IoTString object around the char array.  This
         * constructor makes a copy, so the caller is free to modify the char array.
@@ -31,25 +34,45 @@ private:
 public:
        IoTString(Array<char> *_array) :
                array(new Array<char>(_array)),
-               hashvalue(hashCharArray(array)) {
+                       hashvalue(hashCharArray(array)),
+                       refCount(1) {
        }
 
        IoTString(const char *_array) {
                int32_t len = strlen(_array);
                array = new Array<char>(len);
-               strcpy(array->internalArray(), _array);
+               memcpy(array->internalArray(), _array, len);
                hashvalue = hashCharArray(array);
+               refCount = 1;
        }
 
        IoTString(IoTString *string) :
-               array(new Array<char>(string->array)),
-               hashvalue(hashCharArray(array)) {
+         array(new Array<char>(string->array)),
+                       hashvalue(string->hashvalue),
+                       refCount(1) {
+       }
+
+       IoTString * acquireRef() {
+               refCount++;
+               return this;
        }
 
+       void releaseRef() {
+               if ((--refCount) == 0)
+                       delete this;
+       }
+       
        ~IoTString() {
                delete array;
        }
 
+       void print() {
+               for(uint i=0; i < array->length(); i++)
+                       printf("%c", array->get(i));
+       };
+       
+       char get(uint i) {return array->get(i);}
+
        /**
         * Internal method to grab a reference to our char array.  Caller
         * must not modify it.
@@ -67,6 +90,7 @@ public:
         * Returns the length in chars of the IoTString.
         */
 
+       
        bool equals(IoTString *str) {
                uint strlength = str->array->length();
                uint thislength = array->length();
@@ -77,18 +101,19 @@ public:
                return result == 0;
        }
 
-       int hashValue() { return hashvalue;}
+       unsigned int hashValue() { return hashvalue;}
        int length() { return array->length(); }
        friend IoTString *IoTString_shallow(Array<char> *_array);
 };
 
-IoTString *IoTString_shallow(Array<char> *_array) {
+inline IoTString *IoTString_shallow(Array<char> *_array) {
        IoTString *str = new IoTString();
        str->array = _array;
+       str->hashvalue = hashCharArray(_array);
        return str;
 }
 
-inline int hashString(IoTString *a) {
+inline unsigned int hashString(IoTString *a) {
        return a->hashValue();
 }