blob: bd60c909de78f957045a6afad86886372d550b1f [file] [log] [blame]
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +00001//===- unittests/ADT/IListSentinelTest.cpp - ilist_sentinel unit tests ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000010#include "llvm/ADT/ilist_node.h"
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000011#include "gtest/gtest.h"
12
13using namespace llvm;
14
15namespace {
16
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000017template <class T, class... Options> struct PickSentinel {
18 typedef ilist_sentinel<
19 typename ilist_detail::compute_node_options<T, Options...>::type>
20 type;
21};
22
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000023class Node : public ilist_node<Node> {};
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000024class TrackingNode : public ilist_node<Node, ilist_sentinel_tracking<true>> {};
25typedef PickSentinel<Node>::type Sentinel;
26typedef PickSentinel<Node, ilist_sentinel_tracking<true>>::type
27 TrackingSentinel;
28typedef PickSentinel<Node, ilist_sentinel_tracking<false>>::type
29 NoTrackingSentinel;
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000030
Duncan P. N. Exon Smith34c4d2a2016-09-10 16:55:06 +000031struct LocalAccess : ilist_detail::NodeAccess {
32 using NodeAccess::getPrev;
33 using NodeAccess::getNext;
34};
35
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000036TEST(IListSentinelTest, DefaultConstructor) {
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000037 Sentinel S;
Duncan P. N. Exon Smith34c4d2a2016-09-10 16:55:06 +000038 EXPECT_EQ(&S, LocalAccess::getPrev(S));
39 EXPECT_EQ(&S, LocalAccess::getNext(S));
Joerg Sonnenbergerece29ea2016-09-30 19:52:27 +000040#if LLVM_ENABLE_ABI_BREAKING_CHECKS
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000041 EXPECT_TRUE(S.isKnownSentinel());
42#else
43 EXPECT_FALSE(S.isKnownSentinel());
44#endif
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000045
46 TrackingSentinel TS;
47 NoTrackingSentinel NTS;
48 EXPECT_TRUE(TS.isSentinel());
49 EXPECT_TRUE(TS.isKnownSentinel());
50 EXPECT_FALSE(NTS.isKnownSentinel());
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000051}
52
53TEST(IListSentinelTest, NormalNodeIsNotKnownSentinel) {
54 Node N;
Duncan P. N. Exon Smith34c4d2a2016-09-10 16:55:06 +000055 EXPECT_EQ(nullptr, LocalAccess::getPrev(N));
56 EXPECT_EQ(nullptr, LocalAccess::getNext(N));
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000057 EXPECT_FALSE(N.isKnownSentinel());
Duncan P. N. Exon Smith085bbf12016-09-11 16:20:53 +000058
59 TrackingNode TN;
60 EXPECT_FALSE(TN.isSentinel());
Duncan P. N. Exon Smith9f5c83b2016-08-22 22:21:07 +000061}
62
63} // end namespace