ADT: Add ilist_node::get{Prev,Next}Node, which return the adjacent node or null.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 12 May 2010 21:35:19 +0000 (21:35 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 12 May 2010 21:35:19 +0000 (21:35 +0000)
 - This provides a convenient alternative to using something llvm::prior or
   manual iterator access, for example::

    if (T *Prev = foo->getPrevNode())
      ...

   instead of::

     iterator it(foo);
     if (it != begin()) {
       --it;
       ...
     }

 - Chris, please review.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103647 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/ilist_node.h
unittests/ADT/ilistTest.cpp [new file with mode: 0644]

index da25f959e612a6dc2045fb31dba09f2fbf531b3e..3de4f156d20e60629457aee7929152522fdfef6e 100644 (file)
@@ -49,6 +49,56 @@ class ilist_node : private ilist_half_node<NodeTy> {
   void setNext(NodeTy *N) { Next = N; }
 protected:
   ilist_node() : Next(0) {}
+
+public:
+  /// @name Adjacent Node Accessors
+  /// @{
+
+  /// \brief Get the previous node, or 0 for the list head.
+  NodeTy *getPrevNode() {
+    NodeTy *Prev = this->getPrev();
+
+    // Check for sentinel.
+    if (!Prev->getNext())
+      return 0;
+
+    return Prev;
+  }
+
+  /// \brief Get the previous node, or 0 for the list head.
+  const NodeTy *getPrevNode() const {
+    NodeTy *Prev = this->getPrev();
+
+    // Check for sentinel.
+    if (!Prev->getNext())
+      return 0;
+
+    return Prev;
+  }
+
+  /// \brief Get the next node, or 0 for the list tail.
+  NodeTy *getNextNode() {
+    NodeTy *Next = getNext();
+
+    // Check for sentinel.
+    if (!Next->getNext())
+      return 0;
+
+    return Next;
+  }
+
+  /// \brief Get the next node, or 0 for the list tail.
+  const NodeTy *getNextNode() const {
+    NodeTy *Next = getNext();
+
+    // Check for sentinel.
+    if (!Next->getNext())
+      return 0;
+
+    return Next;
+  }
+
+  /// @}
 };
 
 } // End llvm namespace
diff --git a/unittests/ADT/ilistTest.cpp b/unittests/ADT/ilistTest.cpp
new file mode 100644 (file)
index 0000000..3bf04dc
--- /dev/null
@@ -0,0 +1,39 @@
+//===- llvm/unittest/ADT/APInt.cpp - APInt unit tests ---------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <ostream>
+#include "gtest/gtest.h"
+#include "llvm/ADT/ilist.h"
+#include "llvm/ADT/ilist_node.h"
+
+using namespace llvm;
+
+namespace {
+
+struct Node : ilist_node<Node> {
+  int Value;
+
+  Node() {}
+  Node(int _Value) : Value(_Value) {}
+};
+
+TEST(ilistTest, Basic) {
+  ilist<Node> List;
+  List.push_back(Node(1));
+  EXPECT_EQ(1, List.back().Value);
+  EXPECT_EQ(0, List.back().getPrevNode());
+  EXPECT_EQ(0, List.back().getNextNode());
+
+  List.push_back(Node(2));
+  EXPECT_EQ(2, List.back().Value);
+  EXPECT_EQ(2, List.front().getNextNode()->Value);
+  EXPECT_EQ(1, List.back().getPrevNode()->Value);
+}
+
+}