Added virtual function to generate an instruction sequence to
[oota-llvm.git] / include / llvm / ValueHolder.h
index 774fe1ee870cc7d3b126cb31ac88a844df486642..09aa49d05777bfd9bceb2d3878b796192767465c 100644 (file)
 #define LLVM_VALUEHOLDER_H
 
 #include <vector>
-class SymTabValue;
 
-// ItemParentType ItemParent - I call setParent() on all of my 
-// "ValueSubclass" items, and this is the value that I pass in.
+// ValueSubClass  - The type of objects that I hold
+// ItemParentType - I call setParent() on all of my "ValueSubclass" items, and
+//                  this is the value that I pass in.
+// SymTabType     - This is the class type (which should be derived from
+//                  SymTabValue), whose symtab I insert my ValueSubClass items
+//                  into.  Most of the time it is ItemParentType, but
+//                  Instructions have item parents of bb's but symtabtype's of
+//                  a Method
 //
-template<class ValueSubclass, class ItemParentType> 
+template<class ValueSubclass, class ItemParentType, class SymTabType
 class ValueHolder {
   // TODO: Should I use a deque instead of a vector?
   vector<ValueSubclass*> ValueList;
 
   ItemParentType *ItemParent;
-  SymTabValue *Parent;
+  SymTabType *Parent;
 
   ValueHolder(const ValueHolder &V);   // DO NOT IMPLEMENT
 public:
-  inline ValueHolder(ItemParentType *IP, SymTabValue *parent = 0) { 
+  inline ValueHolder(ItemParentType *IP, SymTabType *parent = 0) { 
     assert(IP && "Item parent may not be null!");
     ItemParent = IP;
     Parent = 0;
@@ -41,9 +46,9 @@ public:
     assert(Parent == 0 && "Should have been unlinked from method!");
   }
 
-  inline const SymTabValue *getParent() const { return Parent; }
-  inline SymTabValue *getParent() { return Parent; }
-  void setParent(SymTabValue *Parent);  // Defined in ValueHolderImpl.h
+  inline const SymTabType *getParent() const { return Parent; }
+  inline SymTabType *getParent() { return Parent; }
+  void setParent(SymTabType *Parent);  // Defined in ValueHolderImpl.h
 
   inline unsigned size() const { return ValueList.size(); }
   inline bool empty()    const { return ValueList.empty(); }
@@ -61,16 +66,15 @@ public:
   typedef reverse_iterator<const_iterator> const_reverse_iterator;
   typedef reverse_iterator<iterator>             reverse_iterator;
 
+  inline iterator                begin()       { return ValueList.begin(); }
+  inline const_iterator          begin() const { return ValueList.begin(); }
+  inline iterator                end  ()       { return ValueList.end();   }
+  inline const_iterator          end  () const { return ValueList.end();   }
 
-  inline iterator       begin()       { return ValueList.begin(); }
-  inline const_iterator begin() const { return ValueList.begin(); }
-  inline iterator       end()         { return ValueList.end();   }
-  inline const_iterator end()   const { return ValueList.end();   }
-
-  inline reverse_iterator rbegin() { return ValueList.rbegin(); }
+  inline reverse_iterator       rbegin()       { return ValueList.rbegin(); }
   inline const_reverse_iterator rbegin() const { return ValueList.rbegin(); }
-  inline reverse_iterator rend() { return ValueList.rend(); }
-  inline const_reverse_iterator rend() const { return ValueList.rend(); }
+  inline reverse_iterator       rend  ()       { return ValueList.rend();   }
+  inline const_reverse_iterator rend  () const { return ValueList.rend();   }
   
   void delete_all() {            // Delete all removes and deletes all elements
     while (!empty()) {
@@ -83,12 +87,19 @@ public:
   // specified by the iterator, and leaves the iterator pointing to the element 
   // that used to follow the element deleted.
   //
-  ValueSubclass *remove(iterator &DI);        // Defined in ValueHolderImpl.h
-  ValueSubclass *remove(const iterator &DI);  // Defined in ValueHolderImpl.h
-  void     remove(ValueSubclass *D);          // Defined in ValueHolderImpl.h
+  ValueSubclass *remove(iterator &DI);         // Defined in ValueHolderImpl.h
+  ValueSubclass *remove(const iterator &DI);   // Defined in ValueHolderImpl.h
+  void           remove(ValueSubclass *D);     // Defined in ValueHolderImpl.h
+  ValueSubclass *pop_back();                   // Defined in ValueHolderImpl.h
+
+  void push_front(ValueSubclass *Inst);        // Defined in ValueHolderImpl.h
+  void push_back(ValueSubclass *Inst);         // Defined in ValueHolderImpl.h
 
-  inline void push_front(ValueSubclass *Inst); // Defined in ValueHolderImpl.h
-  inline void push_back(ValueSubclass *Inst);  // Defined in ValueHolderImpl.h
+  // ValueHolder::insert - This method inserts the specified value *BEFORE* the 
+  // indicated iterator position, and returns an interator to the newly inserted
+  // value.
+  //
+  iterator insert(iterator Pos, ValueSubclass *Inst);
 };
 
 #endif