1193323Sed//==-- llvm/ADT/ilist_node.h - Intrusive Linked List Helper ------*- C++ -*-==// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// This file defines the ilist_node class template, which is a convenient 11193323Sed// base class for creating classes that can be used with ilists. 12193323Sed// 13193323Sed//===----------------------------------------------------------------------===// 14193323Sed 15249423Sdim#ifndef LLVM_ADT_ILISTNODE_H 16249423Sdim#define LLVM_ADT_ILISTNODE_H 17193323Sed 18193323Sednamespace llvm { 19193323Sed 20193323Sedtemplate<typename NodeTy> 21198090Srdivackystruct ilist_traits; 22193323Sed 23198090Srdivacky/// ilist_half_node - Base class that provides prev services for sentinels. 24198090Srdivacky/// 25193323Sedtemplate<typename NodeTy> 26198090Srdivackyclass ilist_half_node { 27198090Srdivacky friend struct ilist_traits<NodeTy>; 28198090Srdivacky NodeTy *Prev; 29198090Srdivackyprotected: 30198090Srdivacky NodeTy *getPrev() { return Prev; } 31198090Srdivacky const NodeTy *getPrev() const { return Prev; } 32198090Srdivacky void setPrev(NodeTy *P) { Prev = P; } 33198090Srdivacky ilist_half_node() : Prev(0) {} 34198090Srdivacky}; 35193323Sed 36198090Srdivackytemplate<typename NodeTy> 37198090Srdivackystruct ilist_nextprev_traits; 38198090Srdivacky 39193323Sed/// ilist_node - Base class that provides next/prev services for nodes 40193323Sed/// that use ilist_nextprev_traits or ilist_default_traits. 41193323Sed/// 42193323Sedtemplate<typename NodeTy> 43198090Srdivackyclass ilist_node : private ilist_half_node<NodeTy> { 44193323Sed friend struct ilist_nextprev_traits<NodeTy>; 45193323Sed friend struct ilist_traits<NodeTy>; 46198090Srdivacky NodeTy *Next; 47193323Sed NodeTy *getNext() { return Next; } 48193323Sed const NodeTy *getNext() const { return Next; } 49193323Sed void setNext(NodeTy *N) { Next = N; } 50193323Sedprotected: 51198090Srdivacky ilist_node() : Next(0) {} 52208599Srdivacky 53208599Srdivackypublic: 54208599Srdivacky /// @name Adjacent Node Accessors 55208599Srdivacky /// @{ 56208599Srdivacky 57208599Srdivacky /// \brief Get the previous node, or 0 for the list head. 58208599Srdivacky NodeTy *getPrevNode() { 59208599Srdivacky NodeTy *Prev = this->getPrev(); 60208599Srdivacky 61208599Srdivacky // Check for sentinel. 62208599Srdivacky if (!Prev->getNext()) 63208599Srdivacky return 0; 64208599Srdivacky 65208599Srdivacky return Prev; 66208599Srdivacky } 67208599Srdivacky 68208599Srdivacky /// \brief Get the previous node, or 0 for the list head. 69208599Srdivacky const NodeTy *getPrevNode() const { 70208599Srdivacky const NodeTy *Prev = this->getPrev(); 71208599Srdivacky 72208599Srdivacky // Check for sentinel. 73208599Srdivacky if (!Prev->getNext()) 74208599Srdivacky return 0; 75208599Srdivacky 76208599Srdivacky return Prev; 77208599Srdivacky } 78208599Srdivacky 79208599Srdivacky /// \brief Get the next node, or 0 for the list tail. 80208599Srdivacky NodeTy *getNextNode() { 81208599Srdivacky NodeTy *Next = getNext(); 82208599Srdivacky 83208599Srdivacky // Check for sentinel. 84208599Srdivacky if (!Next->getNext()) 85208599Srdivacky return 0; 86208599Srdivacky 87208599Srdivacky return Next; 88208599Srdivacky } 89208599Srdivacky 90208599Srdivacky /// \brief Get the next node, or 0 for the list tail. 91208599Srdivacky const NodeTy *getNextNode() const { 92208599Srdivacky const NodeTy *Next = getNext(); 93208599Srdivacky 94208599Srdivacky // Check for sentinel. 95208599Srdivacky if (!Next->getNext()) 96208599Srdivacky return 0; 97208599Srdivacky 98208599Srdivacky return Next; 99208599Srdivacky } 100208599Srdivacky 101208599Srdivacky /// @} 102193323Sed}; 103193323Sed 104193323Sed} // End llvm namespace 105193323Sed 106193323Sed#endif 107