String intern table and support for unordered_map

Change-Id: I22d86d060780552675c5d7f14a98ffde480eac82
diff --git a/src/class_linker.h b/src/class_linker.h
index 70d268d..15bd054 100644
--- a/src/class_linker.h
+++ b/src/class_linker.h
@@ -7,11 +7,14 @@
 #include <utility>
 #include <vector>
 
-#include "heap.h"
-#include "macros.h"
 #include "dex_file.h"
-#include "thread.h"
+#include "heap.h"
+#include "intern_table.h"
+#include "macros.h"
 #include "object.h"
+#include "thread.h"
+#include "unordered_map.h"
+
 #include "gtest/gtest.h"
 
 namespace art {
@@ -34,24 +37,14 @@
 
   bool InitializeClass(Class* klass);
 
-  Class* LookupClass(const StringPiece& descriptor, ClassLoader* class_loader);
-
-  Class* ResolveClass(const Class* referring,
-                      uint32_t class_idx,
-                      const DexFile& dex_file);
-
-  String* ResolveString(const Class* referring,
-                        uint32_t string_idx,
-                        const DexFile& dex_file);
-
   void RegisterDexFile(const DexFile* dex_file);
 
-  // TODO replace with heap interface
-  typedef void (RootVistor)(Object* root, void* arg);
-  void VisitRoots(RootVistor* root_visitor, void* arg);
+  void VisitRoots(Heap::RootVistor* root_visitor, void* arg);
 
  private:
-  ClassLinker() {}
+  ClassLinker() {
+    classes_lock_ = Mutex::Create("ClassLinker::Lock");
+  }
 
   void Init(const std::vector<DexFile*>& boot_class_path_);
 
@@ -104,6 +97,16 @@
                   Class* klass,
                   Method* dst);
 
+  Class* ResolveClass(const Class* referring,
+                      uint32_t class_idx,
+                      const DexFile& dex_file);
+
+  String* ResolveString(const Class* referring,
+                        uint32_t string_idx,
+                        const DexFile& dex_file);
+
+  Class* LookupClass(const StringPiece& descriptor, ClassLoader* class_loader);
+
   // Inserts a class into the class table.  Returns true if the class
   // was inserted.
   bool InsertClass(Class* klass);
@@ -149,14 +152,11 @@
   // multimap from String::descriptor_ to Class* instances. Results
   // should be compared for a matching Class::descriptor_ and
   // Class::class_loader_.
-  // TODO: unordered_multimap
-  typedef std::multimap<const StringPiece, Class*> Table;
-
+  typedef std::tr1::unordered_multimap<StringPiece, Class*> Table;
   Table classes_;
-
   Mutex* classes_lock_;
 
-  // TODO: classpath
+  InternTable intern_table_;
 
   // indexes into class_roots_
   enum ClassRoot {