OSDN Git Service

TableGen: unique_ptr-ify RecordKeeper
authorDylan Noblesmith <nobled@dreamwidth.org>
Sun, 24 Aug 2014 19:10:57 +0000 (19:10 +0000)
committerDylan Noblesmith <nobled@dreamwidth.org>
Sun, 24 Aug 2014 19:10:57 +0000 (19:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216350 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/TableGen/Record.h
lib/TableGen/Record.cpp
utils/TableGen/CTagsEmitter.cpp
utils/TableGen/PseudoLoweringEmitter.cpp

index 5f610a6..d4bc557 100644 (file)
@@ -1650,36 +1650,32 @@ struct MultiClass {
 };
 
 class RecordKeeper {
-  std::map<std::string, Record*> Classes, Defs;
+  typedef std::map<std::string, std::unique_ptr<Record>> RecordMap;
+  RecordMap Classes, Defs;
 
 public:
-  ~RecordKeeper() {
-    for (std::map<std::string, Record*>::iterator I = Classes.begin(),
-           E = Classes.end(); I != E; ++I)
-      delete I->second;
-    for (std::map<std::string, Record*>::iterator I = Defs.begin(),
-           E = Defs.end(); I != E; ++I)
-      delete I->second;
-  }
-
-  const std::map<std::string, Record*> &getClasses() const { return Classes; }
-  const std::map<std::string, Record*> &getDefs() const { return Defs; }
+  const RecordMap &getClasses() const { return Classes; }
+  const RecordMap &getDefs() const { return Defs; }
 
   Record *getClass(const std::string &Name) const {
-    std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
-    return I == Classes.end() ? nullptr : I->second;
+    auto I = Classes.find(Name);
+    return I == Classes.end() ? nullptr : I->second.get();
   }
   Record *getDef(const std::string &Name) const {
-    std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
-    return I == Defs.end() ? nullptr : I->second;
+    auto I = Defs.find(Name);
+    return I == Defs.end() ? nullptr : I->second.get();
   }
-  void addClass(Record *R) {
-    bool Ins = Classes.insert(std::make_pair(R->getName(), R)).second;
+  void addClass(Record *_R) {
+    std::unique_ptr<Record> R(_R);
+    bool Ins = Classes.insert(std::make_pair(R->getName(),
+                                             std::move(R))).second;
     (void)Ins;
     assert(Ins && "Class already exists");
   }
-  void addDef(Record *R) {
-    bool Ins = Defs.insert(std::make_pair(R->getName(), R)).second;
+  void addDef(Record *_R) {
+    std::unique_ptr<Record> R(_R);
+    bool Ins = Defs.insert(std::make_pair(R->getName(),
+                                          std::move(R))).second;
     (void)Ins;
     assert(Ins && "Record already exists");
   }
index d4800c4..34e3ab4 100644 (file)
@@ -2031,7 +2031,7 @@ RecordKeeper::getAllDerivedDefinitions(const std::string &ClassName) const {
   std::vector<Record*> Defs;
   for (const auto &D : getDefs())
     if (D.second->isSubClassOf(Class))
-      Defs.push_back(D.second);
+      Defs.push_back(D.second.get());
 
   return Defs;
 }
index 072dcb5..bbed92a 100644 (file)
@@ -75,9 +75,9 @@ void CTagsEmitter::run(raw_ostream &OS) {
   // Collect tags.
   Tags.reserve(Classes.size() + Defs.size());
   for (const auto &C : Classes)
-    Tags.push_back(Tag(C.first, locate(C.second)));
+    Tags.push_back(Tag(C.first, locate(C.second.get())));
   for (const auto &D : Defs)
-    Tags.push_back(Tag(D.first, locate(D.second)));
+    Tags.push_back(Tag(D.first, locate(D.second.get())));
   // Emit tags.
   std::sort(Tags.begin(), Tags.end());
   OS << "!_TAG_FILE_FORMAT\t1\t/original ctags format/\n";
index e8933b4..ebb43f0 100644 (file)
@@ -280,7 +280,7 @@ void PseudoLoweringEmitter::run(raw_ostream &o) {
   for (const auto &D : Records.getDefs()) {
     if (D.second->isSubClassOf(ExpansionClass) &&
         D.second->isSubClassOf(InstructionClass))
-      Insts.push_back(D.second);
+      Insts.push_back(D.second.get());
   }
 
   // Process the pseudo expansion definitions, validating them as we do so.