Changeset 207627 in webkit


Ignore:
Timestamp:
Oct 20, 2016 11:27:28 AM (7 years ago)
Author:
weinig@apple.com
Message:

Add convenience function that combines WTF::visit(...) with WTF::makeVisitor(...)
https://bugs.webkit.org/show_bug.cgi?id=163713

Reviewed by Dan Bernstein.

Source/WebCore:

Switch uses of WTF::visit to use WTF::switchOn.

  • dom/MessageEvent.cpp:

(WebCore::MessageEvent::source):

  • dom/Node.cpp:

(WebCore::nodeSetPreTransformedFromNodeOrStringVector):
(WebCore::Node::convertNodesOrStringsIntoNode):

  • html/HTMLSelectElement.cpp:

(WebCore::HTMLSelectElement::add):

  • html/track/TrackEvent.cpp:

(WebCore::TrackEvent::TrackEvent):

  • testing/TypeConversions.h:

(WebCore::TypeConversions::typeConversionsDictionaryUnionType):

Source/WTF:

  • Add WTF::switchOn which merges WTF::visit with WTF::makeVisitor in the following way:

WTF::visit(WTF::makeVisitor(...), variant)

  • wtf/Variant.h:

(WTF::switchOn):

Tools:

  • TestWebKitAPI/Tests/WTF/Variant.cpp:

Add test for WTF::switchOn()

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r207585 r207627  
     12016-10-19  Sam Weinig  <sam@webkit.org>
     2
     3        Add convenience function that combines WTF::visit(...) with WTF::makeVisitor(...)
     4        https://bugs.webkit.org/show_bug.cgi?id=163713
     5
     6        Reviewed by Dan Bernstein.
     7
     8        - Add WTF::switchOn which merges WTF::visit with WTF::makeVisitor in the following
     9          way:
     10                WTF::visit(WTF::makeVisitor(...), variant)
     11
     12        * wtf/Variant.h:
     13        (WTF::switchOn):
     14
    1152016-10-19  Alex Christensen  <achristensen@webkit.org>
    216
  • trunk/Source/WTF/wtf/Variant.h

    r207517 r207627  
    4949#include <utility>
    5050#include <wtf/Compiler.h>
     51#include <wtf/StdLibExtras.h>
    5152
    5253#if COMPILER(MSVC)
     
    20412042};
    20422043
     2044// -- WebKit Additions --
     2045
     2046template<class V, class... F>
     2047auto switchOn(V&& v, F&&... f) -> decltype(visit(makeVisitor(std::forward<F>(f)...), std::forward<V>(v)))
     2048{
     2049    return visit(makeVisitor(std::forward<F>(f)...), std::forward<V>(v));
     2050}
     2051
    20432052} // namespace WTF
    20442053
  • trunk/Source/WebCore/ChangeLog

    r207622 r207627  
     12016-10-20  Sam Weinig  <sam@webkit.org>
     2
     3        Add convenience function that combines WTF::visit(...) with WTF::makeVisitor(...)
     4        https://bugs.webkit.org/show_bug.cgi?id=163713
     5
     6        Reviewed by Dan Bernstein.
     7
     8        Switch uses of WTF::visit to use WTF::switchOn.
     9
     10        * dom/MessageEvent.cpp:
     11        (WebCore::MessageEvent::source):
     12        * dom/Node.cpp:
     13        (WebCore::nodeSetPreTransformedFromNodeOrStringVector):
     14        (WebCore::Node::convertNodesOrStringsIntoNode):
     15        * html/HTMLSelectElement.cpp:
     16        (WebCore::HTMLSelectElement::add):
     17        * html/track/TrackEvent.cpp:
     18        (WebCore::TrackEvent::TrackEvent):
     19        * testing/TypeConversions.h:
     20        (WebCore::TypeConversions::typeConversionsDictionaryUnionType):
     21
    1222016-10-20  Dave Hyatt  <hyatt@apple.com>
    223
  • trunk/Source/WebCore/dom/MessageEvent.cpp

    r207517 r207627  
    173173        return nullptr;
    174174
    175     auto visitor = WTF::makeVisitor(
     175    return WTF::switchOn(m_source.value(),
    176176        [](const RefPtr<DOMWindow>& window) -> EventTarget* { return const_cast<EventTarget*>(static_cast<const EventTarget*>(window.get())); },
    177177        [](const RefPtr<MessagePort>& messagePort) -> EventTarget* { return const_cast<EventTarget*>(static_cast<const EventTarget*>(messagePort.get())); }
    178178    );
    179 
    180     return WTF::visit(visitor, m_source.value());
    181179}
    182180
  • trunk/Source/WebCore/dom/Node.cpp

    r207517 r207627  
    439439{
    440440    HashSet<RefPtr<Node>> nodeSet;
    441 
    442     auto visitor = WTF::makeVisitor(
    443         [&](const RefPtr<Node>& node) { nodeSet.add(const_cast<Node*>(node.get())); },
    444         [](const String&) { }
    445     );
    446 
    447     for (const auto& variant : vector)
    448         WTF::visit(visitor, variant);
     441    for (const auto& variant : vector) {
     442        WTF::switchOn(variant,
     443            [&](const RefPtr<Node>& node) { nodeSet.add(const_cast<Node*>(node.get())); },
     444            [](const String&) { }
     445        );
     446    }
    449447
    450448    return nodeSet;
     
    476474    Vector<Ref<Node>> nodes;
    477475    nodes.reserveInitialCapacity(nodeOrStringVector.size());
    478 
    479     auto visitor = WTF::makeVisitor(
    480         [&](RefPtr<Node>& node) { nodes.uncheckedAppend(*node.get()); },
    481         [&](String& string) { nodes.uncheckedAppend(Text::create(document(), string)); }
    482     );
    483 
    484     for (auto& variant : nodeOrStringVector)
    485         WTF::visit(visitor, variant);
     476    for (auto& variant : nodeOrStringVector) {
     477        WTF::switchOn(variant,
     478            [&](RefPtr<Node>& node) { nodes.uncheckedAppend(*node.get()); },
     479            [&](String& string) { nodes.uncheckedAppend(Text::create(document(), string)); }
     480        );
     481    }
    486482
    487483    if (nodes.size() == 1)
  • trunk/Source/WebCore/html/HTMLSelectElement.cpp

    r207517 r207627  
    226226    HTMLElement* beforeElement = nullptr;
    227227    if (before) {
    228         auto visitor = WTF::makeVisitor(
     228        beforeElement = WTF::switchOn(before.value(),
    229229            [](const RefPtr<HTMLElement>& element) -> HTMLElement* { return element.get(); },
    230230            [this](int index) -> HTMLElement* { return item(index); }
    231231        );
    232 
    233         beforeElement = WTF::visit(visitor, before.value());
    234     }
    235     HTMLElement& toInsert = WTF::visit([](const auto& htmlElement) -> HTMLElement& {
    236         return *htmlElement;
    237     }, element);
     232    }
     233    HTMLElement& toInsert = WTF::switchOn(element,
     234        [](const auto& htmlElement) -> HTMLElement& { return *htmlElement; }
     235    );
    238236
    239237
  • trunk/Source/WebCore/html/track/TrackEvent.cpp

    r207517 r207627  
    4444{
    4545    if (initializer.track) {
    46         m_track = WTF::visit([](const auto& trackbase) -> TrackBase* {
    47             return trackbase.get();
    48         }, *initializer.track);
     46        m_track = WTF::switchOn(*initializer.track,
     47            [](const auto& trackbase) -> TrackBase* { return trackbase.get(); }
     48        );
    4949    }
    5050}
  • trunk/Source/WebCore/testing/TypeConversions.h

    r207575 r207627  
    112112    UnionType typeConversionsDictionaryUnionType()
    113113    {
    114         return WTF::visit(WTF::makeVisitor(
     114        return WTF::switchOn(m_typeConversionsDictionaryUnionValue,
    115115            [](const RefPtr<Node>&) -> UnionType { return UnionType::Node; },
    116116            [](const Vector<String>&) -> UnionType { return UnionType::Sequence; },
    117117            [](const OtherDictionary&) -> UnionType { return UnionType::Dictionary; }
    118         ), m_typeConversionsDictionaryUnionValue);
     118        );
    119119    }
    120120
  • trunk/Tools/ChangeLog

    r207617 r207627  
     12016-10-20  Sam Weinig  <sam@webkit.org>
     2
     3        Add convenience function that combines WTF::visit(...) with WTF::makeVisitor(...)
     4        https://bugs.webkit.org/show_bug.cgi?id=163713
     5
     6        Reviewed by Dan Bernstein.
     7
     8        * TestWebKitAPI/Tests/WTF/Variant.cpp:
     9        Add test for WTF::switchOn()
     10
    1112016-10-20  Fujii Hironori  <Hironori.Fujii@sony.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp

    r207517 r207627  
    142142}
    143143
     144TEST(WTF_Variant, VisitorUsingSwitchOn)
     145{
     146    enum class Type {
     147        None,
     148        Int,
     149        Float,
     150        String,
     151    };
     152
     153    Type type = Type::None;
     154
     155    Variant<int, float, String> variant = 8;
     156    type = WTF::switchOn(variant,
     157        [](int) { return Type::Int; },
     158        [](float) { return Type::Float; },
     159        [](String) { return Type::String; }
     160    );
     161    EXPECT_TRUE(Type::Int == type);
     162
     163
     164    variant = 1.0f;
     165    type = WTF::switchOn(variant,
     166        [](int) { return Type::Int; },
     167        [](float) { return Type::Float; },
     168        [](String) { return Type::String; }
     169    );
     170    EXPECT_TRUE(Type::Float == type);
     171
     172
     173    variant = "hello";
     174    type = WTF::switchOn(variant,
     175        [](int) { return Type::Int; },
     176        [](float) { return Type::Float; },
     177        [](String) { return Type::String; }
     178    );
     179    EXPECT_TRUE(Type::String == type);
     180}
     181
    144182TEST(WTF_Variant, ConstructorDestructor)
    145183{
Note: See TracChangeset for help on using the changeset viewer.