1 //===- llvm/ADT/ilist_node_base.h - Intrusive List Node Base -----*- C++ -*-==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_ADT_ILIST_NODE_BASE_H 11 #define LLVM_ADT_ILIST_NODE_BASE_H 12 13 #include "llvm/ADT/PointerIntPair.h" 14 15 namespace llvm { 16 17 /// Base class for ilist nodes. 18 /// 19 /// Optionally tracks whether this node is the sentinel. 20 template <bool EnableSentinelTracking> class ilist_node_base; 21 22 template <> class ilist_node_base<false> { 23 ilist_node_base *Prev = nullptr; 24 ilist_node_base *Next = nullptr; 25 26 public: setPrev(ilist_node_base * Prev)27 void setPrev(ilist_node_base *Prev) { this->Prev = Prev; } setNext(ilist_node_base * Next)28 void setNext(ilist_node_base *Next) { this->Next = Next; } getPrev()29 ilist_node_base *getPrev() const { return Prev; } getNext()30 ilist_node_base *getNext() const { return Next; } 31 isKnownSentinel()32 bool isKnownSentinel() const { return false; } initializeSentinel()33 void initializeSentinel() {} 34 }; 35 36 template <> class ilist_node_base<true> { 37 PointerIntPair<ilist_node_base *, 1> PrevAndSentinel; 38 ilist_node_base *Next = nullptr; 39 40 public: setPrev(ilist_node_base * Prev)41 void setPrev(ilist_node_base *Prev) { PrevAndSentinel.setPointer(Prev); } setNext(ilist_node_base * Next)42 void setNext(ilist_node_base *Next) { this->Next = Next; } getPrev()43 ilist_node_base *getPrev() const { return PrevAndSentinel.getPointer(); } getNext()44 ilist_node_base *getNext() const { return Next; } 45 isSentinel()46 bool isSentinel() const { return PrevAndSentinel.getInt(); } isKnownSentinel()47 bool isKnownSentinel() const { return isSentinel(); } initializeSentinel()48 void initializeSentinel() { PrevAndSentinel.setInt(true); } 49 }; 50 51 } // end namespace llvm 52 53 #endif // LLVM_ADT_ILIST_NODE_BASE_H 54