From 4408c622adf83653cf3fa921499ae904e3a03f7f Mon Sep 17 00:00:00 2001 From: Mike Aizatsky Date: Thu, 17 Mar 2016 23:22:22 +0000 Subject: [PATCH] allow lambdas in mapped_iterator Differential Revision: http://reviews.llvm.org/D17311 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@263759 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/STLExtras.h | 2 +- unittests/ADT/CMakeLists.txt | 1 + unittests/ADT/MappedIteratorTest.cpp | 51 ++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 unittests/ADT/MappedIteratorTest.cpp diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h index 28f75949373..e40a29f4619 100644 --- a/include/llvm/ADT/STLExtras.h +++ b/include/llvm/ADT/STLExtras.h @@ -117,7 +117,7 @@ public: iterator_category; typedef typename std::iterator_traits::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; diff --git a/unittests/ADT/CMakeLists.txt b/unittests/ADT/CMakeLists.txt index bce1bf93a33..1388f5d0074 100644 --- a/unittests/ADT/CMakeLists.txt +++ b/unittests/ADT/CMakeLists.txt @@ -22,6 +22,7 @@ set(ADTSources IntervalMapTest.cpp IntrusiveRefCntPtrTest.cpp MakeUniqueTest.cpp + MappedIteratorTest.cpp MapVectorTest.cpp OptionalTest.cpp PackedVectorTest.cpp diff --git a/unittests/ADT/MappedIteratorTest.cpp b/unittests/ADT/MappedIteratorTest.cpp new file mode 100644 index 00000000000..8c6a10306a8 --- /dev/null +++ b/unittests/ADT/MappedIteratorTest.cpp @@ -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 + +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/iterator_range.h" +#include "gtest/gtest.h" + +using namespace llvm; + +namespace { + +template +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()); +} +} -- 2.11.0