X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSymbolTableListTraits.h;h=91a4eb99ff0d368c489c7b0d9ff50829b93bf08a;hb=9da42434301d77f4f1ebf976943f836ec34c18da;hp=a78d27f6e87cfeea9c2783efd17bae9ea9120104;hpb=276222a5ae189ed5c6a2afb248d4c8f0335585b4;p=oota-llvm.git diff --git a/include/llvm/SymbolTableListTraits.h b/include/llvm/SymbolTableListTraits.h index a78d27f6e87..91a4eb99ff0 100644 --- a/include/llvm/SymbolTableListTraits.h +++ b/include/llvm/SymbolTableListTraits.h @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -25,19 +25,20 @@ #ifndef LLVM_SYMBOLTABLELISTTRAITS_H #define LLVM_SYMBOLTABLELISTTRAITS_H -namespace llvm { +#include "llvm/ADT/ilist.h" +namespace llvm { +class ValueSymbolTable; + template class ilist_iterator; template class iplist; template struct ilist_traits; -// ValueSubClass - The type of objects that I hold, e.g. Instruction. -// ItemParentType - The type of object that owns the list, e.g. BasicBlock. -// TraitBaseClass - The class this trait should inherit from, it should -// inherit from ilist_traits +// ValueSubClass - The type of objects that I hold, e.g. Instruction. +// ItemParentClass - The type of object that owns the list, e.g. BasicBlock. // template -class SymbolTableListTraits { +class SymbolTableListTraits : public ilist_default_traits { typedef ilist_traits TraitsClass; public: SymbolTableListTraits() {} @@ -45,30 +46,32 @@ public: /// getListOwner - Return the object that owns this list. If this is a list /// of instructions, it returns the BasicBlock that owns them. ItemParentClass *getListOwner() { - return reinterpret_cast(reinterpret_cast(this)- - TraitsClass::getListOffset()); - } - static ValueSubClass *getPrev(ValueSubClass *V) { return V->getPrev(); } - static ValueSubClass *getNext(ValueSubClass *V) { return V->getNext(); } - static const ValueSubClass *getPrev(const ValueSubClass *V) { - return V->getPrev(); + typedef iplist ItemParentClass::*Sublist; + size_t Offset(size_t(&((ItemParentClass*)0->*ItemParentClass:: + getSublistAccess(static_cast(0))))); + iplist* Anchor(static_cast*>(this)); + return reinterpret_cast(reinterpret_cast(Anchor)- + Offset); } - static const ValueSubClass *getNext(const ValueSubClass *V) { - return V->getNext(); + + static iplist &getList(ItemParentClass *Par) { + return Par->*(Par->getSublistAccess((ValueSubClass*)0)); } - static void setPrev(ValueSubClass *V, ValueSubClass *P) { V->setPrev(P); } - static void setNext(ValueSubClass *V, ValueSubClass *N) { V->setNext(N); } + static ValueSymbolTable *getSymTab(ItemParentClass *Par) { + return Par ? toPtr(Par->getValueSymbolTable()) : 0; + } void addNodeToList(ValueSubClass *V); void removeNodeFromList(ValueSubClass *V); - void transferNodesFromList(iplist > &L2, + void transferNodesFromList(ilist_traits &L2, ilist_iterator first, ilist_iterator last); //private: template void setSymTabObject(TPtr *, TPtr); + static ValueSymbolTable *toPtr(ValueSymbolTable *P) { return P; } + static ValueSymbolTable *toPtr(ValueSymbolTable &R) { return &R; } }; } // End llvm namespace