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