[PATCH] D51881: [ADT] Made numerous methods of ImmutableList const

Umann Kristóf via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 12 04:21:36 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL342045: [ADT] Made numerous methods of ImmutableList const (authored by Szelethus, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D51881?vs=164826&id=165060#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D51881

Files:
  llvm/trunk/include/llvm/ADT/ImmutableList.h
  llvm/trunk/unittests/ADT/ImmutableListTest.cpp


Index: llvm/trunk/unittests/ADT/ImmutableListTest.cpp
===================================================================
--- llvm/trunk/unittests/ADT/ImmutableListTest.cpp
+++ llvm/trunk/unittests/ADT/ImmutableListTest.cpp
@@ -80,6 +80,36 @@
   EXPECT_FALSE(L2.contains(2));
 }
 
+// We'll store references to objects of this type.
+struct Unmodifiable {
+  Unmodifiable() = default;
+
+  // We'll delete all of these special member functions to make sure no copy or
+  // move happens during insertation.
+  Unmodifiable(const Unmodifiable &) = delete;
+  Unmodifiable(const Unmodifiable &&) = delete;
+  Unmodifiable &operator=(const Unmodifiable &) = delete;
+  Unmodifiable &operator=(const Unmodifiable &&) = delete;
+
+  void doNothing() const {}
+
+  void Profile(FoldingSetNodeID &ID) const { ID.AddPointer(this); }
+};
+
+// Mostly just a check whether ImmutableList::iterator can be instantiated
+// with a reference type as a template argument.
+TEST_F(ImmutableListTest, ReferenceStoringTest) {
+  ImmutableList<const Unmodifiable &>::Factory f;
+
+  Unmodifiable N;
+  ImmutableList<const Unmodifiable &> L = f.create(N);
+  for (ImmutableList<const Unmodifiable &>::iterator It = L.begin(),
+                                                     E = L.end();
+       It != E; ++It) {
+    It->doNothing();
+  }
+}
+
 TEST_F(ImmutableListTest, CreatingIntListTest) {
   ImmutableList<Wrapper<int>>::Factory f;
 
Index: llvm/trunk/include/llvm/ADT/ImmutableList.h
===================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableList.h
+++ llvm/trunk/include/llvm/ADT/ImmutableList.h
@@ -94,6 +94,9 @@
     bool operator==(const iterator& I) const { return L == I.L; }
     bool operator!=(const iterator& I) const { return L != I.L; }
     const value_type& operator*() const { return L->getHead(); }
+    const typename std::remove_reference<value_type>::type* operator->() const {
+      return &L->getHead();
+    }
 
     ImmutableList getList() const { return L; }
   };
@@ -127,14 +130,14 @@
   bool operator==(const ImmutableList& L) const { return isEqual(L); }
 
   /// getHead - Returns the head of the list.
-  const T& getHead() {
+  const T& getHead() const {
     assert(!isEmpty() && "Cannot get the head of an empty list.");
     return X->getHead();
   }
 
   /// getTail - Returns the tail of the list, which is another (possibly empty)
   ///  ImmutableList.
-  ImmutableList getTail() {
+  ImmutableList getTail() const {
     return X ? X->getTail() : nullptr;
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51881.165060.patch
Type: text/x-patch
Size: 2546 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180912/29cec1b1/attachment.bin>


More information about the llvm-commits mailing list