Reformat and remove STL reference from header

b/19148482

Reformmated according to Android C++ style guidelines.
Removed STL references in headers.

Change-Id: I6d82b8fe5ac868067b6d9ebe797125feb97e5641
diff --git a/rsMap.h b/rsMap.h
new file mode 100644
index 0000000..f68b851
--- /dev/null
+++ b/rsMap.h
@@ -0,0 +1,167 @@
+#ifndef ANDOID_RENDERSCRIPT_MAP_H
+#define ANDOID_RENDERSCRIPT_MAP_H
+
+#include <stddef.h>
+
+namespace android {
+namespace renderscript {
+
+template <class T1, class T2>
+class Pair {
+public:
+    Pair() {}
+    Pair(T1 f1, T2 f2) : first(f1), second(f2) {}
+
+    T1 first;
+    T2 second;
+};
+
+template <class T1, class T2>
+Pair<T1, T2> make_pair(T1 first, T2 second) {
+    return Pair<T1, T2>(first, second);
+}
+
+#define MAP_LOG_NUM_BUCKET 8
+#define MAP_NUM_BUCKET (1 << MAP_LOG_NUM_BUCKET)
+#define MAP_NUM_BUCKET_MASK (MAP_NUM_BUCKET - 1)
+
+template <class KeyType, class ValueType>
+class Map {
+private:
+    typedef Pair<KeyType, ValueType> MapEntry;
+
+    struct LinkNode {
+        MapEntry entry;
+        LinkNode* next;
+    };
+
+public:
+    Map() : endIterator(MAP_NUM_BUCKET, nullptr, this) {
+        for (size_t i = 0; i < MAP_NUM_BUCKET; i++) { bucket[i] = nullptr; }
+    }
+
+    ~Map() {
+        for (size_t i = 0; i < MAP_NUM_BUCKET; i++) {
+            LinkNode* p = bucket[i];
+            LinkNode* next;
+            while (p != nullptr) {
+                next = p->next;
+                delete p;
+                p = next;
+            }
+        }
+    }
+
+    ValueType& operator[](const KeyType& key) {
+        const size_t index = hash(key) & MAP_NUM_BUCKET_MASK;
+        LinkNode* node = bucket[index];
+        LinkNode* prev = nullptr;
+
+        while (node != nullptr) {
+            if (node->entry.first == key) {
+                return node->entry.second;
+            }
+            prev = node;
+            node = node->next;
+        }
+
+        node = new LinkNode();
+        node->entry.first = key;
+        node->next = nullptr;
+        if (prev == nullptr) {
+            bucket[index] = node;
+        } else {
+            prev->next = node;
+        }
+        return node->entry.second;
+    }
+
+    class iterator {
+        friend class Map;
+    public:
+        iterator& operator++() {
+            LinkNode* next;
+
+            next = node->next;
+            if (next != nullptr) {
+                node = next;
+                return *this;
+            }
+
+            while (++bucket_index < MAP_NUM_BUCKET) {
+                next = map->bucket[bucket_index];
+                if (next != nullptr) {
+                    node = next;
+                    return *this;
+                }
+            }
+
+            node = nullptr;
+            return *this;
+        }
+
+        bool operator==(const iterator& other) const {
+            return node == other.node && bucket_index == other.bucket_index &&
+                    map == other.map;
+        }
+
+        bool operator!=(const iterator& other) const {
+            return node != other.node || bucket_index != other.bucket_index ||
+                    map != other.map;
+        }
+
+        const MapEntry& operator*() const {
+            return node->entry;
+        }
+
+    protected:
+        iterator(size_t index, LinkNode* n, const Map* m) : bucket_index(index), node(n), map(m) {}
+
+    private:
+        size_t bucket_index;
+        LinkNode* node;
+        const Map* map;
+    };
+
+    iterator begin() const {
+        for (size_t i = 0; i < MAP_NUM_BUCKET; i++) {
+            LinkNode* node = bucket[i];
+            if (node != nullptr) {
+                return iterator(i, node, this);
+            }
+        }
+
+        return end();
+    }
+
+    const iterator& end() const { return endIterator; }
+
+    iterator begin() { return ((const Map*)this)->begin(); }
+
+    const iterator& end() { return endIterator; }
+
+    iterator find(const KeyType& key) const {
+        const size_t index = hash(key) & MAP_NUM_BUCKET_MASK;
+        LinkNode* node = bucket[index];
+
+        while (node != nullptr) {
+            if (node->entry.first == key) {
+                return iterator(index, node, this);
+            }
+            node = node->next;
+        }
+
+        return end();
+    }
+
+private:
+    size_t hash(const KeyType& key) const { return ((size_t)key) >> 4; }
+
+    LinkNode* bucket[MAP_NUM_BUCKET];
+    const iterator endIterator;
+};
+
+}  // namespace renderscript
+}  // namespace android
+
+#endif  // ANDOID_RENDERSCRIPT_MAP_H