allow lambdas in mapped_iterator
authorMike Aizatsky <aizatsky@chromium.org>
Thu, 17 Mar 2016 23:22:22 +0000 (23:22 +0000)
committerMike Aizatsky <aizatsky@chromium.org>
Thu, 17 Mar 2016 23:22:22 +0000 (23:22 +0000)
Differential Revision: http://reviews.llvm.org/D17311

llvm-svn: 263759

llvm/include/llvm/ADT/STLExtras.h
llvm/unittests/ADT/CMakeLists.txt
llvm/unittests/ADT/MappedIteratorTest.cpp [new file with mode: 0644]

index 28f7594..e40a29f 100644 (file)
@@ -117,7 +117,7 @@ public:
           iterator_category;
   typedef typename std::iterator_traits<RootIt>::difference_type
           difference_type;
-  typedef typename UnaryFunc::result_type value_type;
+  typedef decltype(Fn(*current)) value_type;
 
   typedef void pointer;
   //typedef typename UnaryFunc::result_type *pointer;
index bce1bf9..1388f5d 100644 (file)
@@ -22,6 +22,7 @@ set(ADTSources
   IntervalMapTest.cpp
   IntrusiveRefCntPtrTest.cpp
   MakeUniqueTest.cpp
+  MappedIteratorTest.cpp
   MapVectorTest.cpp
   OptionalTest.cpp
   PackedVectorTest.cpp
diff --git a/llvm/unittests/ADT/MappedIteratorTest.cpp b/llvm/unittests/ADT/MappedIteratorTest.cpp
new file mode 100644 (file)
index 0000000..8c6a103
--- /dev/null
@@ -0,0 +1,51 @@
+//===- 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 <vector>
+
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/iterator_range.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+template <class T, class Fn>
+auto map_range(const T &range, Fn fn)
+    -> decltype(make_range(map_iterator(range.begin(), fn),
+                           map_iterator(range.end(), fn))) {
+  return make_range(map_iterator(range.begin(), fn),
+                    map_iterator(range.end(), fn));
+}
+
+static char add1(char C) { return C + 1; }
+
+TEST(MappedIterator, FnTest) {
+  std::string S("abc");
+  std::string T;
+
+  for (char C : map_range(S, add1)) {
+    T.push_back(C);
+  }
+
+  EXPECT_STREQ("bcd", T.c_str());
+}
+
+TEST(MappedIterator, LambdaTest) {
+  std::string S("abc");
+  std::string T;
+
+  for (char C : map_range(S, [](char C) { return C + 1; })) {
+    T.push_back(C);
+  }
+
+  EXPECT_STREQ("bcd", T.c_str());
+}
+}