From: Mike Aizatsky Date: Thu, 17 Mar 2016 23:22:22 +0000 (+0000) Subject: allow lambdas in mapped_iterator X-Git-Tag: llvmorg-3.9.0-rc1~11497 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=35aff03cf213795f2adbe9edc4e8424193dc34ac;p=platform%2Fupstream%2Fllvm.git allow lambdas in mapped_iterator Differential Revision: http://reviews.llvm.org/D17311 llvm-svn: 263759 --- diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index 28f7594..e40a29f 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/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/llvm/unittests/ADT/CMakeLists.txt b/llvm/unittests/ADT/CMakeLists.txt index bce1bf9..1388f5d0 100644 --- a/llvm/unittests/ADT/CMakeLists.txt +++ b/llvm/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/llvm/unittests/ADT/MappedIteratorTest.cpp b/llvm/unittests/ADT/MappedIteratorTest.cpp new file mode 100644 index 0000000..8c6a103 --- /dev/null +++ b/llvm/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()); +} +}