All code written
[iotcloud.git] / version2 / src / C / IoTString.h
index c90d46da44c84c582c83177b123cd978d32a3492..cb2d68b1af6dd13ddebf8ebcf2f95faef0bca912 100644 (file)
@@ -2,27 +2,56 @@
 #define IOTSTRING_H
 
 #include "array.h"
 #define IOTSTRING_H
 
 #include "array.h"
-
+#include <string.h>
 /**
  * IoTString wraps the underlying char string.
  * @author Brian Demsky <bdemsky@uci.edu>
  * @version 1.0
  */
 
 /**
  * IoTString wraps the underlying char string.
  * @author Brian Demsky <bdemsky@uci.edu>
  * @version 1.0
  */
 
+inline int hashCharArray(Array<char> *array) {
+       uint len = array->length();
+       int hash = 0;
+       for (uint i = 0; i < len; i++) {
+               hash = 31 * hash + array->get(i);
+       }
+       return hash;
+}
+
 class IoTString {
 private:
        Array<char> *array;
        IoTString() {}
 class IoTString {
 private:
        Array<char> *array;
        IoTString() {}
-
+       int hashvalue;
        /**
         * Builds an IoTString object around the char array.  This
         * constructor makes a copy, so the caller is free to modify the char array.
         */
 
 public:
        /**
         * Builds an IoTString object around the char array.  This
         * constructor makes a copy, so the caller is free to modify the char array.
         */
 
 public:
-       IoTString(Array<char> *_array) : array(new Array<char>(_array)) {}
-       ~IoTString() {}
+       IoTString(Array<char> *_array) :
+               array(new Array<char>(_array)),
+               hashvalue(hashCharArray(array)) {
+       }
+
+       IoTString(const char *_array) {
+               int32_t len = strlen(_array);
+               array = new Array<char>(len);
+               strcpy(array->internalArray(), _array);
+               hashvalue = hashCharArray(array);
+       }
+
+       IoTString(IoTString *string) :
+               array(new Array<char>(string->array)),
+               hashvalue(hashCharArray(array)) {
+       }
 
 
+       ~IoTString() {
+               delete array;
+       }
+
+       char get(uint i) {return array->get(i);}
+       
        /**
         * Internal method to grab a reference to our char array.  Caller
         * must not modify it.
        /**
         * Internal method to grab a reference to our char array.  Caller
         * must not modify it.
@@ -40,7 +69,7 @@ public:
         * Returns the length in chars of the IoTString.
         */
 
         * Returns the length in chars of the IoTString.
         */
 
-       bool equals(IoTString * str) {
+       bool equals(IoTString *str) {
                uint strlength = str->array->length();
                uint thislength = array->length();
                if (strlength != thislength)
                uint strlength = str->array->length();
                uint thislength = array->length();
                if (strlength != thislength)
@@ -49,14 +78,23 @@ public:
                int result = memcmp(str->array->internalArray(), array->internalArray(), strlength);
                return result == 0;
        }
                int result = memcmp(str->array->internalArray(), array->internalArray(), strlength);
                return result == 0;
        }
-       
+
+       int hashValue() { return hashvalue;}
        int length() { return array->length(); }
        friend IoTString *IoTString_shallow(Array<char> *_array);
 };
 
        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;
        return str;
 }
        IoTString *str = new IoTString();
        str->array = _array;
        return str;
 }
+
+inline int hashString(IoTString *a) {
+       return a->hashValue();
+}
+
+inline bool StringEquals(IoTString *a, IoTString *b) {
+       return a->equals(b);
+}
 #endif
 #endif