1 //===- llvm/ADT/ilist_node_base.h - Intrusive List Node Base -----*- C++ -*-==//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_ADT_ILIST_NODE_BASE_H
10 #define LLVM_ADT_ILIST_NODE_BASE_H
12 #include "llvm/ADT/PointerIntPair.h"
16 /// Base class for ilist nodes.
18 /// Optionally tracks whether this node is the sentinel.
19 template <bool EnableSentinelTracking
> class ilist_node_base
;
21 template <> class ilist_node_base
<false> {
22 ilist_node_base
*Prev
= nullptr;
23 ilist_node_base
*Next
= nullptr;
26 void setPrev(ilist_node_base
*Prev
) { this->Prev
= Prev
; }
27 void setNext(ilist_node_base
*Next
) { this->Next
= Next
; }
28 ilist_node_base
*getPrev() const { return Prev
; }
29 ilist_node_base
*getNext() const { return Next
; }
31 bool isKnownSentinel() const { return false; }
32 void initializeSentinel() {}
35 template <> class ilist_node_base
<true> {
36 PointerIntPair
<ilist_node_base
*, 1> PrevAndSentinel
;
37 ilist_node_base
*Next
= nullptr;
40 void setPrev(ilist_node_base
*Prev
) { PrevAndSentinel
.setPointer(Prev
); }
41 void setNext(ilist_node_base
*Next
) { this->Next
= Next
; }
42 ilist_node_base
*getPrev() const { return PrevAndSentinel
.getPointer(); }
43 ilist_node_base
*getNext() const { return Next
; }
45 bool isSentinel() const { return PrevAndSentinel
.getInt(); }
46 bool isKnownSentinel() const { return isSentinel(); }
47 void initializeSentinel() { PrevAndSentinel
.setInt(true); }
50 } // end namespace llvm
52 #endif // LLVM_ADT_ILIST_NODE_BASE_H