ilist_node.h revision aa81380353a27d9d216cafdd88df08a5eef43b74
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//==-- llvm/ADT/ilist_node.h - Intrusive Linked List Helper ------*- C++ -*-==// 23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// 33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// The LLVM Compiler Infrastructure 43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// 53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// This file is distributed under the University of Illinois Open Source 63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// License. See LICENSE.TXT for details. 73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// 83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//===----------------------------------------------------------------------===// 93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// 103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// This file defines the ilist_node class template, which is a convenient 113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// base class for creating classes that can be used with ilists. 123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// 133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//===----------------------------------------------------------------------===// 143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#ifndef LLVM_ADT_ILIST_NODE_H 163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define LLVM_ADT_ILIST_NODE_H 173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace llvm { 193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiantemplate<typename NodeTy> 213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstruct ilist_traits; 223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/// ilist_half_node - Base class that provides prev services for sentinels. 24b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk/// 253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiantemplate<typename NodeTy> 263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass ilist_half_node { 273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian friend struct ilist_traits<NodeTy>; 283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NodeTy *Prev; 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianprotected: 303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NodeTy *getPrev() { return Prev; } 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian const NodeTy *getPrev() const { return Prev; } 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setPrev(NodeTy *P) { Prev = P; } 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian ilist_half_node() : Prev(0) {} 3404379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li}; 3504379fa9a001934373bf17358978c753c7e4e8b5Wu-cheng Li 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiantemplate<typename NodeTy> 373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstruct ilist_nextprev_traits; 383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/// ilist_node - Base class that provides next/prev services for nodes 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/// that use ilist_nextprev_traits or ilist_default_traits. 413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/// 423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiantemplate<typename NodeTy> 433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass ilist_node : private ilist_half_node<NodeTy> { 443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian friend struct ilist_nextprev_traits<NodeTy>; 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian friend struct ilist_traits<NodeTy>; 463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NodeTy *Next; 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NodeTy *getNext() { return Next; } 483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian const NodeTy *getNext() const { return Next; } 493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian void setNext(NodeTy *N) { Next = N; } 50c0170bc6c6c81f5dfa86a132bf29ee48c01329d9Ray Chenprotected: 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian ilist_node() : Next(0) {} 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic: 543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian /// @name Adjacent Node Accessors 553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian /// @{ 563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian /// \brief Get the previous node, or 0 for the list head. 583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NodeTy *getPrevNode() { 593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian NodeTy *Prev = this->getPrev(); 603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian // Check for sentinel. 623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (!Prev->getNext()) 63a1c3d37ef921bfc79a0f7d2ac7f897943134d48dWu-cheng Li return 0; 64a1c3d37ef921bfc79a0f7d2ac7f897943134d48dWu-cheng Li 653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return Prev; 663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian /// \brief Get the previous node, or 0 for the list head. 694f1bff97170d33575e55a8e110b097c05607095fWu-cheng Li const NodeTy *getPrevNode() const { 704f1bff97170d33575e55a8e110b097c05607095fWu-cheng Li NodeTy *Prev = this->getPrev(); 714f1bff97170d33575e55a8e110b097c05607095fWu-cheng Li 7295fbf2cdccb127bae1f68827564b36290c8de2c3Eino-Ville Talvala // Check for sentinel. 7395fbf2cdccb127bae1f68827564b36290c8de2c3Eino-Ville Talvala if (!Prev->getNext()) 74fd99e1dda6a46ac3312cacb3bc1b633b2df95df2Eino-Ville Talvala return 0; 75fd99e1dda6a46ac3312cacb3bc1b633b2df95df2Eino-Ville Talvala 7638ecadbeb09fc0504621f5aa513e51b7a204983fWu-cheng Li return Prev; 7738ecadbeb09fc0504621f5aa513e51b7a204983fWu-cheng Li } 78949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Li 79949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Li /// \brief Get the next node, or 0 for the list tail. 80949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Li NodeTy *getNextNode() { 81949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Li NodeTy *Next = getNext(); 82949c5037a6e019ff575bd481d286908c2eaa1e34Wu-cheng Li 8309a2ab9dfe5c8fe74703b9894d930b1b1dbf0c11Wu-cheng Li // Check for sentinel. 840b0279e0d20a8beb69aa2af5f4cb278841710dfbWu-cheng Li if (!Next->getNext()) 850d14c25355b7807b88fcdc76040ef986aa754815James Dong return 0; 860d14c25355b7807b88fcdc76040ef986aa754815James Dong 870f5a6f9231e04b5c04af5dc2ad020755e2616f31James Dong return Next; 887fc25dd82dec8474139315b8e905f103c13406f5Wu-cheng Li } 897fc25dd82dec8474139315b8e905f103c13406f5Wu-cheng Li 9040cdc56efa47580d89a93750cefecb8ccbaf9a72Wu-cheng Li /// \brief Get the next node, or 0 for the list tail. 91a8e409f8f9b40737d0b03355894b5e141d0aff6bWu-cheng Li const NodeTy *getNextNode() const { 927019d2247e644470a0e8eb99b02b8b2d656fd9fbEino-Ville Talvala NodeTy *Next = getNext(); 937019d2247e644470a0e8eb99b02b8b2d656fd9fbEino-Ville Talvala 94c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // Check for sentinel. 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (!Next->getNext()) 96d8d888ea7c14715c2210c8dea1a623116c992264Wu-cheng Li return 0; 9795fbf2cdccb127bae1f68827564b36290c8de2c3Eino-Ville Talvala 98ae77ffa16bda593fb3751e41d45327d867f3c8e1Wu-cheng Li return Next; 99d8d888ea7c14715c2210c8dea1a623116c992264Wu-cheng Li } 1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian /// @} 1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; 1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} // End llvm namespace 1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif 1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian