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