#include <fstream>
 #include <list>
 #include <map>
-#include <set>
 #include <string>
 
 #include "base/callback.hh"
 {
 }
 
+typedef map<std::string, Info *> NameMapType;
+NameMapType &
+nameMap()
+{
+    static NameMapType the_map;
+    return the_map;
+}
+
 int Info::id_count = 0;
 
 int debug_break_id = -1;
 {
 }
 
+void
+Info::setName(const string &name)
+{
+    pair<NameMapType::iterator, bool> p =
+        nameMap().insert(make_pair(name, this));
+
+    Info *other = p.first->second;
+    bool result = p.second;
+    
+    if (!result) {
+        // using other->name instead of just name to avoid a compiler
+        // warning.  They should be the same.
+        panic("same statistic name used twice! name=%s\n", other->name);
+    }
+
+    this->name = name;
+}
+
 bool
 Info::less(Info *stat1, Info *stat2)
 {
 
     Info();
     virtual ~Info();
 
+    /** Set the name of this statistic */
+    void setName(const std::string &name);
+
     /**
      * Check that this stat has been set up properly and is ready for
      * use
      * @return A reference to this stat.
      */
     Derived &
-    name(const std::string &_name)
+    name(const std::string &name)
     {
         Info *info = this->info();
-        info->name = _name;
+        info->setName(name);
         info->flags |= print;
         return this->self();
     }