Changeset 221977 in webkit


Ignore:
Timestamp:
Sep 13, 2017 10:50:48 AM (7 years ago)
Author:
commit-queue@webkit.org
Message:

Add a lambda-based map for Vectors
https://bugs.webkit.org/show_bug.cgi?id=176487

Patch by Youenn Fablet <youenn@apple.com> on 2017-09-13
Reviewed by Darin Adler.

Source/WebKit:

  • NetworkProcess/cache/CacheStorageEngineCaches.cpp:

(WebKit::CacheStorage::Caches::readCachesFromDisk):

Source/WTF:

This helper routine allows refactoring the reserveInitialCapacity/uncheckedAppend pattern, the mapper between source and destination item being a lambda.

  • wtf/Vector.h:

(WTF::Mapper::transform):
(WTF::Mapper::map):
(WTF::map):

Tools:

  • TestWebKitAPI/Tests/WTF/Vector.cpp:

(TestWebKitAPI::TEST):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r221959 r221977  
     12017-09-13  Youenn Fablet  <youenn@apple.com>
     2
     3        Add a lambda-based map for Vectors
     4        https://bugs.webkit.org/show_bug.cgi?id=176487
     5
     6        Reviewed by Darin Adler.
     7
     8        This helper routine allows refactoring the reserveInitialCapacity/uncheckedAppend pattern, the mapper between source and destination item being a lambda.
     9
     10        * wtf/Vector.h:
     11        (WTF::Mapper::transform):
     12        (WTF::Mapper::map):
     13        (WTF::map):
     14
    1152017-09-12  Yusuke Suzuki  <utatane.tea@gmail.com>
    216
  • trunk/Source/WTF/wtf/Vector.h

    r221422 r221977  
    15611561}
    15621562
     1563template<typename Transformer, typename SourceType> struct Mapper {
     1564    using RealSourceType = typename std::remove_reference<SourceType>::type;
     1565    using SourceItemType = typename RealSourceType::ValueType;
     1566    using DestinationItemType = typename std::result_of<Transformer(SourceItemType&&)>::type;
     1567
     1568    static Vector<DestinationItemType> map(const RealSourceType& source, const Transformer& transformer)
     1569    {
     1570        Vector<DestinationItemType> result;
     1571        result.reserveInitialCapacity(source.size());
     1572        for (auto& item : source)
     1573            result.uncheckedAppend(transformer(item));
     1574        return result;
     1575    }
     1576
     1577    static Vector<DestinationItemType> map(RealSourceType&& source, const Transformer& transformer)
     1578    {
     1579        Vector<DestinationItemType> result;
     1580        result.reserveInitialCapacity(source.size());
     1581        for (auto& item : source)
     1582            result.uncheckedAppend(transformer(std::forward<SourceItemType>(item)));
     1583        return result;
     1584    }
     1585};
     1586
     1587template<typename Transformer, typename VectorType>
     1588Vector<typename Mapper<Transformer, VectorType>::DestinationItemType> map(VectorType&& source, const Transformer& transformer)
     1589{
     1590    return Mapper<Transformer, VectorType>::map(std::forward<VectorType>(source), transformer);
     1591}
     1592
    15631593} // namespace WTF
    15641594
  • trunk/Source/WebKit/ChangeLog

    r221976 r221977  
     12017-09-13  Youenn Fablet  <youenn@apple.com>
     2
     3        Add a lambda-based map for Vectors
     4        https://bugs.webkit.org/show_bug.cgi?id=176487
     5
     6        Reviewed by Darin Adler.
     7
     8        * NetworkProcess/cache/CacheStorageEngineCaches.cpp:
     9        (WebKit::CacheStorage::Caches::readCachesFromDisk):
     10
    1112017-09-13  John Wilander  <wilander@apple.com>
    212
  • trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp

    r221710 r221977  
    241241            return;
    242242        }
    243         Vector<Cache> caches;
    244         caches.reserveInitialCapacity(result.value().size());
    245         for (auto& name : result.value())
    246             caches.uncheckedAppend(Cache { *this, m_engine->nextCacheIdentifier(), Cache::State::Uninitialized, WTFMove(name) });
    247 
    248         callback(WTFMove(caches));
     243        callback(WTF::map(WTFMove(result.value()), [this] (String&& name) {
     244            return Cache { *this, m_engine->nextCacheIdentifier(), Cache::State::Uninitialized, WTFMove(name) };
     245        }));
    249246    });
    250247}
  • trunk/Tools/ChangeLog

    r221976 r221977  
     12017-09-13  Youenn Fablet  <youenn@apple.com>
     2
     3        Add a lambda-based map for Vectors
     4        https://bugs.webkit.org/show_bug.cgi?id=176487
     5
     6        Reviewed by Darin Adler.
     7
     8        * TestWebKitAPI/Tests/WTF/Vector.cpp:
     9        (TestWebKitAPI::TEST):
     10
    1112017-09-13  John Wilander  <wilander@apple.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp

    r215943 r221977  
    652652}
    653653
     654TEST(WTF_Vector, MapLambda)
     655{
     656    Vector<int> vector { 2, 3, 4};
     657
     658    int counter = 0;
     659    auto mapped = WTF::map(vector, [&] (int item) {
     660        counter += 2;
     661        return counter <= item;
     662    });
     663
     664    EXPECT_EQ(3U, mapped.size());
     665    EXPECT_TRUE(mapped[0]);
     666    EXPECT_FALSE(mapped[1]);
     667    EXPECT_FALSE(mapped[2]);
     668}
     669
     670TEST(WTF_Vector, MapLambdaMove)
     671{
     672    Vector<MoveOnly> vector;
     673
     674    vector.reserveInitialCapacity(3);
     675    for (unsigned i = 0; i < 3; ++i)
     676        vector.uncheckedAppend(MoveOnly { i });
     677
     678
     679    unsigned counter = 0;
     680    auto mapped = WTF::map(WTFMove(vector), [&] (MoveOnly&& item) {
     681        item = item.value() + ++counter;
     682        return WTFMove(item);
     683    });
     684
     685    EXPECT_EQ(3U, mapped.size());
     686    EXPECT_EQ(1U, mapped[0].value());
     687    EXPECT_EQ(3U, mapped[1].value());
     688    EXPECT_EQ(5U, mapped[2].value());
     689}
     690
    654691} // namespace TestWebKitAPI
Note: See TracChangeset for help on using the changeset viewer.