Mark more roots.

This is most of the stuff. (Everything that currently exists, though there's
more to come.)

Change-Id: I235a21b006820a027c494374a5b52ffefed89c32
diff --git a/src/intern_table_test.cc b/src/intern_table_test.cc
index d230a01..0362b05 100644
--- a/src/intern_table_test.cc
+++ b/src/intern_table_test.cc
@@ -36,20 +36,33 @@
   EXPECT_EQ(2U, t.Size());
 }
 
-std::vector<const String*> gExpectedWeakStrings;
-bool TestPredicate(const String* s) {
-  bool erased = false;
-  typedef std::vector<const String*>::iterator It; // TODO: C++0x auto
-  for (It it = gExpectedWeakStrings.begin(), end = gExpectedWeakStrings.end(); it != end; ++it) {
-    if (*it == s) {
-      gExpectedWeakStrings.erase(it);
-      erased = true;
-      break;
+class TestPredicate : public InternTable::Predicate {
+ public:
+  bool operator()(const String* s) const {
+    bool erased = false;
+    typedef std::vector<const String*>::iterator It; // TODO: C++0x auto
+    for (It it = expected_.begin(), end = expected_.end(); it != end; ++it) {
+      if (*it == s) {
+        expected_.erase(it);
+        erased = true;
+        break;
+      }
     }
+    EXPECT_TRUE(erased);
+    return true;
   }
-  EXPECT_TRUE(erased);
-  return true;
-}
+
+  void Expect(const String* s) {
+    expected_.push_back(s);
+  }
+
+  ~TestPredicate() {
+    EXPECT_EQ(0U, expected_.size());
+  }
+
+ private:
+  mutable std::vector<const String*> expected_;
+};
 
 TEST_F(InternTableTest, RemoveWeakIf) {
   InternTable t;
@@ -61,11 +74,10 @@
   EXPECT_EQ(4U, t.Size());
 
   // We should traverse only the weaks...
-  gExpectedWeakStrings.clear();
-  gExpectedWeakStrings.push_back(s0);
-  gExpectedWeakStrings.push_back(s1);
-  t.RemoveWeakIf(TestPredicate);
-  EXPECT_EQ(0U, gExpectedWeakStrings.size());
+  TestPredicate p;
+  p.Expect(s0);
+  p.Expect(s1);
+  t.RemoveWeakIf(p);
 
   EXPECT_EQ(2U, t.Size());