<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[204291] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/204291">204291</a></dd>
<dt>Author</dt> <dd>weinig@apple.com</dd>
<dt>Date</dt> <dd>2016-08-09 13:31:42 -0700 (Tue, 09 Aug 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>
Source/WebCore:
Replace NodeOrString with std::variant<Ref<Node>, String>
https://bugs.webkit.org/show_bug.cgi?id=160638
Reviewed by Anders Carlsson.
* WebCore.xcodeproj/project.pbxproj:
Remove NodeOrString.h/cpp
* bindings/js/JSNodeOrString.cpp:
* bindings/js/JSNodeOrString.h:
* dom/ContainerNode.cpp:
(WebCore::ContainerNode::append):
(WebCore::ContainerNode::prepend):
* dom/ContainerNode.h:
* dom/Node.cpp:
(WebCore::nodeSetPreTransformedFromNodeOrStringVector):
(WebCore::firstFollowingSiblingNotInNodeSet):
(WebCore::Node::convertNodesOrStringsIntoNode):
(WebCore::Node::before):
(WebCore::Node::after):
(WebCore::Node::replaceWith):
* dom/Node.h:
Replace NodeOrString with std::variant<Ref<Node>, String> and move convertNodesOrStringsIntoNode
into Node.
* dom/NodeOrString.cpp: Removed.
* dom/NodeOrString.h: Removed.
Source/WTF:
Replace NodeOrString with std::variant<RefPtr<Node>, String>
https://bugs.webkit.org/show_bug.cgi?id=160638
Reviewed by Anders Carlsson.
* wtf/StdLibExtras.h:
(WTF::Visitor::Visitor):
(WTF::makeVisitor):
Add WTF::makeVisitor() which takes a list of lambdas to use
an an overload set for a visitor object.
Also, re-export std::experimental::variant (and helpers) in the std
namespace using type aliasing.
* wtf/Variant.h:
Make std::experimental::variant work in WebCore.
Tools:
Replace NodeOrString with std::variant<RefPtr<Node>, String>
https://bugs.webkit.org/show_bug.cgi?id=160638
Reviewed by Anders Carlsson.
* TestWebKitAPI/CMakeLists.txt:
* TestWebKitAPI/Tests/WTF/Variant.cpp:
Add additional tests for the initial state of std::variant and using
makeVisitor for visiting.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfStdLibExtrash">trunk/Source/WTF/wtf/StdLibExtras.h</a></li>
<li><a href="#trunkSourceWTFwtfVarianth">trunk/Source/WTF/wtf/Variant.h</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSNodeOrStringcpp">trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSNodeOrStringh">trunk/Source/WebCore/bindings/js/JSNodeOrString.h</a></li>
<li><a href="#trunkSourceWebCoredomContainerNodecpp">trunk/Source/WebCore/dom/ContainerNode.cpp</a></li>
<li><a href="#trunkSourceWebCoredomContainerNodeh">trunk/Source/WebCore/dom/ContainerNode.h</a></li>
<li><a href="#trunkSourceWebCoredomDOMAllInOnecpp">trunk/Source/WebCore/dom/DOMAllInOne.cpp</a></li>
<li><a href="#trunkSourceWebCoredomNodecpp">trunk/Source/WebCore/dom/Node.cpp</a></li>
<li><a href="#trunkSourceWebCoredomNodeh">trunk/Source/WebCore/dom/Node.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPICMakeListstxt">trunk/Tools/TestWebKitAPI/CMakeLists.txt</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFVariantcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoredomNodeOrStringcpp">trunk/Source/WebCore/dom/NodeOrString.cpp</a></li>
<li><a href="#trunkSourceWebCoredomNodeOrStringh">trunk/Source/WebCore/dom/NodeOrString.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WTF/ChangeLog        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,5 +1,24 @@
</span><span class="cx"> 2016-08-06 Sam Weinig <sam@webkit.org>
</span><span class="cx">
</span><ins>+ Replace NodeOrString with std::variant<RefPtr<Node>, String>
+ https://bugs.webkit.org/show_bug.cgi?id=160638
+
+ Reviewed by Anders Carlsson.
+
+ * wtf/StdLibExtras.h:
+ (WTF::Visitor::Visitor):
+ (WTF::makeVisitor):
+ Add WTF::makeVisitor() which takes a list of lambdas to use
+ an an overload set for a visitor object.
+
+ Also, re-export std::experimental::variant (and helpers) in the std
+ namespace using type aliasing.
+
+ * wtf/Variant.h:
+ Make std::experimental::variant work in WebCore.
+
+2016-08-06 Sam Weinig <sam@webkit.org>
+
</ins><span class="cx"> WTF needs a variant implementation
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=160618
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWTFwtfStdLibExtrash"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/StdLibExtras.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/StdLibExtras.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WTF/wtf/StdLibExtras.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include <string.h>
</span><span class="cx"> #include <wtf/Assertions.h>
</span><span class="cx"> #include <wtf/CheckedArithmetic.h>
</span><ins>+#include <wtf/Variant.h>
</ins><span class="cx">
</span><span class="cx"> // This was used to declare and define a static local variable (static T;) so that
</span><span class="cx"> // it was leaked so that its destructors were not called at exit.
</span><span class="lines">@@ -309,6 +310,36 @@
</span><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+// Visitor adapted from http://stackoverflow.com/questions/25338795/is-there-a-name-for-this-tuple-creation-idiom
+
+template <class A, class... B>
+struct Visitor : Visitor<A>, Visitor<B...> {
+ Visitor(A a, B... b)
+ : Visitor<A>(a)
+ , Visitor<B...>(b...)
+ {
+ }
+
+ using Visitor<A>::operator ();
+ using Visitor<B...>::operator ();
+};
+
+template <class A>
+struct Visitor<A> : A {
+ Visitor(A a)
+ : A(a)
+ {
+ }
+
+ using A::operator();
+};
+
+template <class... F>
+auto makeVisitor(F... f)
+{
+ return Visitor<F...>(f...);
+}
+
</ins><span class="cx"> } // namespace WTF
</span><span class="cx">
</span><span class="cx"> // This version of placement new omits a 0 check.
</span><span class="lines">@@ -372,6 +403,14 @@
</span><span class="cx"> return move(forward<T>(value));
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+template<typename... Types>
+using variant = std::experimental::variant<Types...>;
+
+using std::experimental::get;
+using std::experimental::get_if;
+using std::experimental::holds_alternative;
+using std::experimental::visit;
+
</ins><span class="cx"> } // namespace std
</span><span class="cx">
</span><span class="cx"> #define WTFMove(value) std::move<WTF::CheckMoveParameter>(value)
</span></span></pre></div>
<a id="trunkSourceWTFwtfVarianth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Variant.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Variant.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WTF/wtf/Variant.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx">
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><ins>+#include <functional>
</ins><span class="cx"> #include <limits.h>
</span><span class="cx"> #include <new>
</span><span class="cx"> #include <stddef.h>
</span><span class="lines">@@ -48,30 +49,25 @@
</span><span class="cx"> #include <utility>
</span><span class="cx"> #include <wtf/Compiler.h>
</span><span class="cx">
</span><ins>+#if COMPILER(MSVC)
+#pragma warning(push)
+#pragma warning(disable:4245)
+#pragma warning(disable:4521)
+#pragma warning(disable:4522)
+#pragma warning(disable:4814)
+#endif
+
</ins><span class="cx"> namespace std {
</span><span class="cx"> namespace experimental {
</span><span class="cx">
</span><span class="cx"> #if COMPILER_SUPPORTS(EXCEPTIONS)
</span><del>-
</del><span class="cx"> #define __THROW_EXCEPTION(__exception) throw __exception;
</span><del>-#define __CONST_EXPR_THROW_EXCPETION_IF(__predicate, __exception) \
- do { \
- if ((__predicate)) { \
- throw __exception; \
- } \
- while (0); \
-
</del><ins>+#define __NOEXCEPT noexcept
+#define __NOEXCEPT_(__exception) noexcept(__exception)
</ins><span class="cx"> #else
</span><del>-
-static inline void __crash_helper(bool){
- CRASH();
-}
-static inline constexpr bool __constexpr_crash_if(bool test){
- return !test ? true : (__crash_helper(test), false);
-}
-
-#define __THROW_EXCEPTION(...) CRASH();
-#define __CONST_EXPR_THROW_EXCPETION_IF(__predicate, __exception) __constexpr_crash_if((__predicate));
</del><ins>+#define __THROW_EXCEPTION(__exception) do { (void)__exception; CRASH(); } while (0);
+#define __NOEXCEPT
+#define __NOEXCEPT_(...)
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> struct __in_place_private{
</span><span class="lines">@@ -117,6 +113,11 @@
</span><span class="cx"> {}
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+template<typename T>
+NO_RETURN_DUE_TO_CRASH inline T __throw_bad_variant_access(const char* what_arg){
+ __THROW_EXCEPTION(bad_variant_access(what_arg))
+}
+
</ins><span class="cx"> template<ptrdiff_t _Offset,typename _Type,typename ... _Types>
</span><span class="cx"> struct __type_index_helper;
</span><span class="cx">
</span><span class="lines">@@ -306,7 +307,7 @@
</span><span class="cx"> template<typename _Target,typename ... _Args>
</span><span class="cx"> struct __storage_nothrow_constructible{
</span><span class="cx"> static const bool __value=
</span><del>- noexcept(_Target(std::declval<_Args>()...));
</del><ins>+ std::is_nothrow_constructible<_Target, _Args...>::value;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<typename ... _Types>
</span><span class="lines">@@ -535,7 +536,7 @@
</span><span class="cx"> _Type& __get(in_place_index_t<0>){
</span><span class="cx"> return __variant_storage<_Type>::__get(__val);
</span><span class="cx"> }
</span><del>- constexpr _Type&& __get_rref(in_place_index_t<0>){
</del><ins>+ /*constexpr*/ _Type&& __get_rref(in_place_index_t<0>){
</ins><span class="cx"> return __variant_storage<_Type>::__get_rref(__val);
</span><span class="cx"> }
</span><span class="cx"> constexpr const _Type& __get(in_place_index_t<0>) const{
</span><span class="lines">@@ -626,7 +627,7 @@
</span><span class="cx"> return __head.__get(in_place<0>);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- constexpr _Head&& __get_rref(in_place_index_t<0>){
</del><ins>+ /*constexpr*/ _Head&& __get_rref(in_place_index_t<0>){
</ins><span class="cx"> return __head.__get_rref(in_place<0>);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -645,7 +646,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<size_t _Index>
</span><del>- constexpr typename __indexed_type<_Index-1,_Rest...>::__type&& __get_rref(
</del><ins>+ /*constexpr*/ typename __indexed_type<_Index-1,_Rest...>::__type&& __get_rref(
</ins><span class="cx"> in_place_index_t<_Index>){
</span><span class="cx"> return __rest.__get_rref(in_place<_Index-1>);
</span><span class="cx"> }
</span><span class="lines">@@ -1169,10 +1170,10 @@
</span><span class="cx">
</span><span class="cx"> template<ptrdiff_t _Index,typename _Storage>
</span><span class="cx"> struct __backup_storage_ops<_Index,_Index,_Storage>{
</span><del>- static void __move_construct_func(_Storage * __dest,_Storage& __source){
</del><ins>+ static void __move_construct_func(_Storage *,_Storage&){
</ins><span class="cx"> __THROW_EXCEPTION(std::bad_alloc());
</span><span class="cx"> };
</span><del>- static void __destroy_func(_Storage * __obj){
</del><ins>+ static void __destroy_func(_Storage *){
</ins><span class="cx"> __THROW_EXCEPTION(std::bad_alloc());
</span><span class="cx"> };
</span><span class="cx"> };
</span><span class="lines">@@ -1529,13 +1530,13 @@
</span><span class="cx">
</span><span class="cx"> public:
</span><span class="cx"> constexpr variant()
</span><del>- noexcept(noexcept(typename __indexed_type<0,_Types...>::__type())):
</del><ins>+ __NOEXCEPT_(noexcept(typename __indexed_type<0,_Types...>::__type())):
</ins><span class="cx"> __storage(in_place<0>),
</span><span class="cx"> __index(0)
</span><span class="cx"> {}
</span><span class="cx">
</span><span class="cx"> constexpr variant(typename std::conditional<__all_move_constructible<_Types...>::value,variant,__private_type>::type&& __other)
</span><del>- noexcept(__noexcept_variant_move_construct<_Types...>::value):
</del><ins>+ __NOEXCEPT_(__noexcept_variant_move_construct<_Types...>::value):
</ins><span class="cx"> __index(__move_construct(__other))
</span><span class="cx"> {}
</span><span class="cx">
</span><span class="lines">@@ -1542,7 +1543,7 @@
</span><span class="cx"> constexpr variant(typename std::conditional<!__all_move_constructible<_Types...>::value,variant,__private_type>::type&& __other)=delete;
</span><span class="cx">
</span><span class="cx"> constexpr variant(typename std::conditional<__all_copy_constructible<_Types...>::value,variant,__private_type>::type& __other)
</span><del>- noexcept(__noexcept_variant_non_const_copy_construct<_Types...>::value):
</del><ins>+ __NOEXCEPT_(__noexcept_variant_non_const_copy_construct<_Types...>::value):
</ins><span class="cx"> __index(__copy_construct(__other))
</span><span class="cx"> {}
</span><span class="cx">
</span><span class="lines">@@ -1549,7 +1550,7 @@
</span><span class="cx"> constexpr variant(typename std::conditional<!__all_copy_constructible<_Types...>::value,variant,__private_type>::type& __other)=delete;
</span><span class="cx">
</span><span class="cx"> constexpr variant(typename std::conditional<__all_copy_constructible<_Types...>::value,variant,__private_type>::type const& __other)
</span><del>- noexcept(__noexcept_variant_const_copy_construct<_Types...>::value):
</del><ins>+ __NOEXCEPT_(__noexcept_variant_const_copy_construct<_Types...>::value):
</ins><span class="cx"> __index(__copy_construct(__other))
</span><span class="cx"> {}
</span><span class="cx">
</span><span class="lines">@@ -1668,7 +1669,7 @@
</span><span class="cx"> typename std::conditional<__all_move_constructible<_Types...>::value &&
</span><span class="cx"> __all_move_assignable<_Types...>::value,
</span><span class="cx"> variant, __private_type>::type &&
</span><del>- __other) noexcept(__noexcept_variant_move_assign<_Types...>::value) {
</del><ins>+ __other) __NOEXCEPT_(__noexcept_variant_move_assign<_Types...>::value) {
</ins><span class="cx"> if (__other.valueless_by_exception()) {
</span><span class="cx"> __destroy_self();
</span><span class="cx"> }
</span><span class="lines">@@ -1694,10 +1695,10 @@
</span><span class="cx"> __direct_replace<_Index>(std::forward<_Args>(__args)...);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- constexpr bool valueless_by_exception() const noexcept{
</del><ins>+ constexpr bool valueless_by_exception() const __NOEXCEPT{
</ins><span class="cx"> return __index==-1;
</span><span class="cx"> }
</span><del>- constexpr ptrdiff_t index() const noexcept{
</del><ins>+ constexpr ptrdiff_t index() const __NOEXCEPT{
</ins><span class="cx"> return __index;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1706,7 +1707,7 @@
</span><span class="cx"> __all_swappable<_Types...>::value &&
</span><span class="cx"> __all_move_constructible<_Types...>::value,
</span><span class="cx"> variant, __private_type>::type
</span><del>- &__other) noexcept(__noexcept_variant_swap<_Types...>::value) {
</del><ins>+ &__other) __NOEXCEPT_(__noexcept_variant_swap<_Types...>::value) {
</ins><span class="cx"> if (__other.index() == index()) {
</span><span class="cx"> if(!valueless_by_exception())
</span><span class="cx"> __swap_op_table<variant>::__apply[index()](*this,__other);
</span><span class="lines">@@ -1724,10 +1725,10 @@
</span><span class="cx"> public:
</span><span class="cx"> variant()=delete;
</span><span class="cx">
</span><del>- constexpr bool valueless_by_exception() const noexcept{
</del><ins>+ constexpr bool valueless_by_exception() const __NOEXCEPT{
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><del>- constexpr ptrdiff_t index() const noexcept{
</del><ins>+ constexpr ptrdiff_t index() const __NOEXCEPT{
</ins><span class="cx"> return -1;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1738,7 +1739,7 @@
</span><span class="cx"> typename std::enable_if<__all_swappable<_Types...>::value &&
</span><span class="cx"> __all_move_constructible<_Types...>::value,
</span><span class="cx"> void>::type
</span><del>-swap(variant<_Types...> &__lhs, variant<_Types...> &__rhs) noexcept(
</del><ins>+swap(variant<_Types...> &__lhs, variant<_Types...> &__rhs) __NOEXCEPT_(
</ins><span class="cx"> __noexcept_variant_swap<_Types...>::value) {
</span><span class="cx"> __lhs.swap(__rhs);
</span><span class="cx"> }
</span><span class="lines">@@ -1783,26 +1784,34 @@
</span><span class="cx">
</span><span class="cx"> template<ptrdiff_t _Index,typename ... _Types>
</span><span class="cx"> constexpr typename __indexed_type<_Index,_Types...>::__type const& get(variant<_Types...> const& __v){
</span><del>- __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access("Bad variant index in get"));
- return *(&__variant_accessor<_Index,_Types...>::get(__v));
</del><ins>+ return *(
+ (_Index!=__v.index())
+ ? &__throw_bad_variant_access<typename __indexed_type<_Index,_Types...>::__type const&>("Bad variant index in get")
+ : &__variant_accessor<_Index,_Types...>::get(__v)
+ );
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<ptrdiff_t _Index,typename ... _Types>
</span><span class="cx"> constexpr typename __indexed_type<_Index,_Types...>::__type& get(variant<_Types...>& __v){
</span><del>- __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access("Bad variant index in get"));
- return *(&__variant_accessor<_Index,_Types...>::get(__v));
</del><ins>+ return *(
+ (_Index!=__v.index())
+ ? &__throw_bad_variant_access<typename __indexed_type<_Index,_Types...>::__type&>("Bad variant index in get")
+ : &__variant_accessor<_Index,_Types...>::get(__v)
+ );
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<ptrdiff_t _Index,typename ... _Types>
</span><span class="cx"> constexpr typename __indexed_type<_Index,_Types...>::__type&& get(variant<_Types...>&& __v){
</span><del>- __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access("Bad variant index in get"));
- return __variant_accessor<_Index,_Types...>::get(std::move(__v));
</del><ins>+ return __variant_accessor<_Index,_Types...>::get(
+ (((_Index!=__v.index()) ? __throw_bad_variant_access<int>("Bad variant index in get") : 0), std::move(__v))
+ );
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<ptrdiff_t _Index,typename ... _Types>
</span><span class="cx"> constexpr const typename __indexed_type<_Index,_Types...>::__type&& get(variant<_Types...> const&& __v){
</span><del>- __CONST_EXPR_THROW_EXCPETION_IF(_Index!=__v.index(), bad_variant_access("Bad variant index in get"));
- return __variant_accessor<_Index,_Types...>::get(std::move(__v));
</del><ins>+ return __variant_accessor<_Index,_Types...>::get(
+ (((_Index!=__v.index()) ? __throw_bad_variant_access<int>("Bad variant index in get") : 0), std::move(__v))
+ );
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename _Type,typename ... _Types>
</span><span class="lines">@@ -1829,7 +1838,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename _Type,typename ... _Types>
</span><del>-constexpr bool holds_alternative(variant<_Types...> const& __v) noexcept{
</del><ins>+constexpr bool holds_alternative(variant<_Types...> const& __v) __NOEXCEPT{
</ins><span class="cx"> return __v.index()==__type_index<_Type,_Types...>::__value;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1868,8 +1877,9 @@
</span><span class="cx"> template<typename _Visitor,typename ... _Types>
</span><span class="cx"> constexpr typename __visitor_return_type<_Visitor,_Types...>::__type
</span><span class="cx"> visit(_Visitor&& __visitor,variant<_Types...>& __v){
</span><del>- __CONST_EXPR_THROW_EXCPETION_IF(__v.valueless_by_exception(), bad_variant_access("Visiting of empty variant"));
- return __visitor_table<_Visitor,_Types...>::__trampoline[__v.index()](__visitor,__v);
</del><ins>+ return (__v.valueless_by_exception())
+ ? __throw_bad_variant_access<typename __visitor_return_type<_Visitor,_Types...>::__type>("Visiting of empty variant")
+ : __visitor_table<_Visitor,_Types...>::__trampoline[__v.index()](__visitor,__v);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename _Visitor,typename ... _Variants>
</span><span class="lines">@@ -1938,8 +1948,8 @@
</span><span class="cx"> struct __visit_helper2<-1,_VariantIndex,_Indices...>{
</span><span class="cx"> template<typename _Visitor,typename ... _Variants>
</span><span class="cx"> static constexpr typename __multi_visitor_return_type<_Visitor,_Variants...>::__type
</span><del>- __visit(_Visitor& __visitor,_Variants&& ... __v){
- __CONST_EXPR_THROW_EXCPETION_IF(true, bad_variant_access("Visiting of empty variant"));
</del><ins>+ __visit(_Visitor&,_Variants&& ...){
+ __throw_bad_variant_access<typename __multi_visitor_return_type<_Visitor,_Variants...>::__type>("Visiting of empty variant");
</ins><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><span class="lines">@@ -2040,7 +2050,7 @@
</span><span class="cx">
</span><span class="cx"> template<>
</span><span class="cx"> struct hash<experimental::monostate>{
</span><del>- size_t operator()(experimental::monostate) noexcept{
</del><ins>+ size_t operator()(experimental::monostate) __NOEXCEPT{
</ins><span class="cx"> return 42;
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="lines">@@ -2047,7 +2057,7 @@
</span><span class="cx">
</span><span class="cx"> template<typename ... _Types>
</span><span class="cx"> struct hash<experimental::variant<_Types...>>{
</span><del>- size_t operator()(experimental::variant<_Types...> const &v) noexcept {
</del><ins>+ size_t operator()(experimental::variant<_Types...> const &v) __NOEXCEPT {
</ins><span class="cx"> return std::hash<ptrdiff_t>()(v.index()) ^
</span><span class="cx"> experimental::visit(experimental::__hash_visitor(), v);
</span><span class="cx"> }
</span><span class="lines">@@ -2054,3 +2064,7 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace std
</span><ins>+
+#if COMPILER(MSVC)
+#pragma warning(pop)
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1487,7 +1487,6 @@
</span><span class="cx"> dom/Node.cpp
</span><span class="cx"> dom/NodeFilterCondition.cpp
</span><span class="cx"> dom/NodeIterator.cpp
</span><del>- dom/NodeOrString.cpp
</del><span class="cx"> dom/NodeRareData.cpp
</span><span class="cx"> dom/NodeTraversal.cpp
</span><span class="cx"> dom/OverflowEvent.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/ChangeLog        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2016-08-06 Sam Weinig <sam@webkit.org>
+
+ Replace NodeOrString with std::variant<Ref<Node>, String>
+ https://bugs.webkit.org/show_bug.cgi?id=160638
+
+ Reviewed by Anders Carlsson.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ Remove NodeOrString.h/cpp
+
+ * bindings/js/JSNodeOrString.cpp:
+ * bindings/js/JSNodeOrString.h:
+ * dom/ContainerNode.cpp:
+ (WebCore::ContainerNode::append):
+ (WebCore::ContainerNode::prepend):
+ * dom/ContainerNode.h:
+ * dom/Node.cpp:
+ (WebCore::nodeSetPreTransformedFromNodeOrStringVector):
+ (WebCore::firstFollowingSiblingNotInNodeSet):
+ (WebCore::Node::convertNodesOrStringsIntoNode):
+ (WebCore::Node::before):
+ (WebCore::Node::after):
+ (WebCore::Node::replaceWith):
+ * dom/Node.h:
+ Replace NodeOrString with std::variant<Ref<Node>, String> and move convertNodesOrStringsIntoNode
+ into Node.
+
+ * dom/NodeOrString.cpp: Removed.
+ * dom/NodeOrString.h: Removed.
+
</ins><span class="cx"> 2016-08-09 Chris Dumez <cdumez@apple.com>
</span><span class="cx">
</span><span class="cx"> It should be possible to re-initialize a CustomEvent after it's been dispatched
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -2844,8 +2844,6 @@
</span><span class="cx">                 7CE683471921821500F4D928 /* UserMessageHandlerDescriptorTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE683461921821500F4D928 /* UserMessageHandlerDescriptorTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7CE6CBFB187F370700D46BF5 /* FormatConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE6CBFA187F370700D46BF5 /* FormatConverter.h */; };
</span><span class="cx">                 7CE6CBFD187F394900D46BF5 /* FormatConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CE6CBFC187F394900D46BF5 /* FormatConverter.cpp */; };
</span><del>-                7CEAC1071B483D1D00334482 /* NodeOrString.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CEAC1061B483D1D00334482 /* NodeOrString.h */; };
-                7CEAC1091B483D7F00334482 /* NodeOrString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEAC1081B483D7F00334482 /* NodeOrString.cpp */; };
</del><span class="cx">                 7CFDC57C1AC1D80500E24A57 /* ContentExtensionError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CFDC57A1AC1D80500E24A57 /* ContentExtensionError.cpp */; };
</span><span class="cx">                 7CFDC57D1AC1D80500E24A57 /* ContentExtensionError.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CFDC57B1AC1D80500E24A57 /* ContentExtensionError.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7D4C96DC1AD4483500365A50 /* JSFetchHeaders.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7D4C96D81AD4483500365A50 /* JSFetchHeaders.cpp */; };
</span><span class="lines">@@ -10263,8 +10261,6 @@
</span><span class="cx">                 7CE683461921821500F4D928 /* UserMessageHandlerDescriptorTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMessageHandlerDescriptorTypes.h; sourceTree = "<group>"; };
</span><span class="cx">                 7CE6CBFA187F370700D46BF5 /* FormatConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatConverter.h; sourceTree = "<group>"; };
</span><span class="cx">                 7CE6CBFC187F394900D46BF5 /* FormatConverter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatConverter.cpp; sourceTree = "<group>"; };
</span><del>-                7CEAC1061B483D1D00334482 /* NodeOrString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeOrString.h; sourceTree = "<group>"; };
-                7CEAC1081B483D7F00334482 /* NodeOrString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodeOrString.cpp; sourceTree = "<group>"; };
</del><span class="cx">                 7CFDC57A1AC1D80500E24A57 /* ContentExtensionError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContentExtensionError.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 7CFDC57B1AC1D80500E24A57 /* ContentExtensionError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentExtensionError.h; sourceTree = "<group>"; };
</span><span class="cx">                 7D4C96D81AD4483500365A50 /* JSFetchHeaders.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSFetchHeaders.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -24132,8 +24128,6 @@
</span><span class="cx">                                 1A750D870A90E394000FF215 /* NodeIterator.idl */,
</span><span class="cx">                                 A81872100977D3C0005826D9 /* NodeList.h */,
</span><span class="cx">                                 85ACA9FA0A9B631000671E90 /* NodeList.idl */,
</span><del>-                                7CEAC1081B483D7F00334482 /* NodeOrString.cpp */,
-                                7CEAC1061B483D1D00334482 /* NodeOrString.h */,
</del><span class="cx">                                 4FAB48661643A67E00F70C07 /* NodeRareData.cpp */,
</span><span class="cx">                                 63189AE20E83A33300012E41 /* NodeRareData.h */,
</span><span class="cx">                                 63D7B32C0E78CD3F00F7617C /* NodeRenderStyle.h */,
</span><span class="lines">@@ -26892,7 +26886,6 @@
</span><span class="cx">                                 854FE7330A2297BE0058D7AD /* NodeFilterCondition.h in Headers */,
</span><span class="cx">                                 854FE7350A2297BE0058D7AD /* NodeIterator.h in Headers */,
</span><span class="cx">                                 A818721B0977D3C0005826D9 /* NodeList.h in Headers */,
</span><del>-                                7CEAC1071B483D1D00334482 /* NodeOrString.h in Headers */,
</del><span class="cx">                                 63189AE30E83A33300012E41 /* NodeRareData.h in Headers */,
</span><span class="cx">                                 63D7B32D0E78CD3F00F7617C /* NodeRenderStyle.h in Headers */,
</span><span class="cx">                                 E43105BB16750F1600DB2FB8 /* NodeTraversal.h in Headers */,
</span><span class="lines">@@ -30694,7 +30687,6 @@
</span><span class="cx">                                 A8C4A80009D563270003AC8D /* Node.cpp in Sources */,
</span><span class="cx">                                 854FE7320A2297BE0058D7AD /* NodeFilterCondition.cpp in Sources */,
</span><span class="cx">                                 854FE7340A2297BE0058D7AD /* NodeIterator.cpp in Sources */,
</span><del>-                                7CEAC1091B483D7F00334482 /* NodeOrString.cpp in Sources */,
</del><span class="cx">                                 4FFC022B1643B710004E1638 /* NodeRareData.cpp in Sources */,
</span><span class="cx">                                 E43105B816750F0C00DB2FB8 /* NodeTraversal.cpp in Sources */,
</span><span class="cx">                                 33503CC71017A1B1003B47E1 /* Notification.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSNodeOrStringcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/bindings/js/JSNodeOrString.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -33,17 +33,17 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-Vector<NodeOrString> toNodeOrStringVector(ExecState& state)
</del><ins>+Vector<std::variant<Ref<Node>, String>> toNodeOrStringVector(ExecState& state)
</ins><span class="cx"> {
</span><span class="cx"> size_t argumentCount = state.argumentCount();
</span><span class="cx">
</span><del>- Vector<NodeOrString> result;
</del><ins>+ Vector<std::variant<Ref<Node>, String>> result;
</ins><span class="cx"> result.reserveInitialCapacity(argumentCount);
</span><span class="cx">
</span><span class="cx"> for (size_t i = 0; i < argumentCount; ++i) {
</span><span class="cx"> JSValue value = state.uncheckedArgument(i);
</span><span class="cx"> if (auto* node = jsDynamicCast<JSNode*>(value))
</span><del>- result.uncheckedAppend(&node->wrapped());
</del><ins>+ result.uncheckedAppend(node->wrapped());
</ins><span class="cx"> else {
</span><span class="cx"> String string = value.toWTFString(&state);
</span><span class="cx"> if (state.hadException())
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSNodeOrStringh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSNodeOrString.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSNodeOrString.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/bindings/js/JSNodeOrString.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -26,7 +26,8 @@
</span><span class="cx"> #ifndef JSNodeOrString_h
</span><span class="cx"> #define JSNodeOrString_h
</span><span class="cx">
</span><del>-#include "NodeOrString.h"
</del><ins>+#include <wtf/Forward.h>
+#include <wtf/Variant.h>
</ins><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -35,8 +36,10 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-Vector<NodeOrString> toNodeOrStringVector(JSC::ExecState&);
</del><ins>+class Node;
</ins><span class="cx">
</span><ins>+Vector<std::variant<Ref<Node>, String>> toNodeOrStringVector(JSC::ExecState&);
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif // JSNodeOrStringVector_h
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/ContainerNode.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -44,7 +44,6 @@
</span><span class="cx"> #include "MutationEvent.h"
</span><span class="cx"> #include "NameNodeList.h"
</span><span class="cx"> #include "NoEventDispatchAssertion.h"
</span><del>-#include "NodeOrString.h"
</del><span class="cx"> #include "NodeRareData.h"
</span><span class="cx"> #include "NodeRenderStyle.h"
</span><span class="cx"> #include "RadioNodeList.h"
</span><span class="lines">@@ -873,9 +872,9 @@
</span><span class="cx"> return std::distance(children.begin(), children.end());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ContainerNode::append(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void ContainerNode::append(Vector<std::variant<Ref<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><del>- RefPtr<Node> node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+ RefPtr<Node> node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx"> if (ec || !node)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -882,9 +881,9 @@
</span><span class="cx"> appendChild(*node, ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ContainerNode::prepend(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void ContainerNode::prepend(Vector<std::variant<Ref<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><del>- RefPtr<Node> node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+ RefPtr<Node> node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx"> if (ec || !node)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoredomContainerNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ContainerNode.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ContainerNode.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/ContainerNode.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -99,8 +99,8 @@
</span><span class="cx"> Element* firstElementChild() const;
</span><span class="cx"> Element* lastElementChild() const;
</span><span class="cx"> unsigned childElementCount() const;
</span><del>- void append(Vector<NodeOrString>&&, ExceptionCode&);
- void prepend(Vector<NodeOrString>&&, ExceptionCode&);
</del><ins>+ void append(Vector<std::variant<Ref<Node>, String>>&&, ExceptionCode&);
+ void prepend(Vector<std::variant<Ref<Node>, String>>&&, ExceptionCode&);
</ins><span class="cx">
</span><span class="cx"> bool ensurePreInsertionValidity(Node& newChild, Node* refChild, ExceptionCode&);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoredomDOMAllInOnecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DOMAllInOne.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DOMAllInOne.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/DOMAllInOne.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -112,7 +112,6 @@
</span><span class="cx"> #include "Node.cpp"
</span><span class="cx"> #include "NodeFilterCondition.cpp"
</span><span class="cx"> #include "NodeIterator.cpp"
</span><del>-#include "NodeOrString.cpp"
</del><span class="cx"> #include "NodeRareData.cpp"
</span><span class="cx"> #include "NodeTraversal.cpp"
</span><span class="cx"> #include "OverflowEvent.cpp"
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/Node.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -53,7 +53,6 @@
</span><span class="cx"> #include "Logging.h"
</span><span class="cx"> #include "MutationEvent.h"
</span><span class="cx"> #include "NoEventDispatchAssertion.h"
</span><del>-#include "NodeOrString.h"
</del><span class="cx"> #include "NodeRenderStyle.h"
</span><span class="cx"> #include "ProcessingInstruction.h"
</span><span class="cx"> #include "ProgressEvent.h"
</span><span class="lines">@@ -438,19 +437,18 @@
</span><span class="cx"> return downcast<ContainerNode>(*this).appendChild(newChild, ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static HashSet<RefPtr<Node>> nodeSetPreTransformedFromNodeOrStringVector(const Vector<NodeOrString>& nodeOrStringVector)
</del><ins>+static HashSet<RefPtr<Node>> nodeSetPreTransformedFromNodeOrStringVector(const Vector<std::variant<Ref<Node>, String>>& vector)
</ins><span class="cx"> {
</span><span class="cx"> HashSet<RefPtr<Node>> nodeSet;
</span><del>- for (auto& nodeOrString : nodeOrStringVector) {
- switch (nodeOrString.type()) {
- case NodeOrString::Type::String:
- break;
- case NodeOrString::Type::Node:
- nodeSet.add(&nodeOrString.node());
- break;
- }
- }
</del><span class="cx">
</span><ins>+ auto visitor = WTF::makeVisitor(
+ [&](const Ref<Node>& node) { nodeSet.add(const_cast<Node*>(node.ptr())); },
+ [](const String&) { }
+ );
+
+ for (const auto& variant : vector)
+ std::visit(visitor, variant);
+
</ins><span class="cx"> return nodeSet;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -472,8 +470,35 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Node::before(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+RefPtr<Node> Node::convertNodesOrStringsIntoNode(Vector<std::variant<Ref<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><ins>+ if (nodeOrStringVector.isEmpty())
+ return nullptr;
+
+ Vector<Ref<Node>> nodes;
+ nodes.reserveInitialCapacity(nodeOrStringVector.size());
+
+ auto visitor = WTF::makeVisitor(
+ [&](Ref<Node>& node) { nodes.uncheckedAppend(node.copyRef()); },
+ [&](String& string) { nodes.uncheckedAppend(Text::create(document(), string)); }
+ );
+
+ for (auto& variant : nodeOrStringVector)
+ std::visit(visitor, variant);
+
+ if (nodes.size() == 1)
+ return WTFMove(nodes.first());
+
+ auto nodeToReturn = DocumentFragment::create(document());
+ for (auto& node : nodes) {
+ if (!nodeToReturn->appendChild(node, ec))
+ return nullptr;
+ }
+ return WTFMove(nodeToReturn);
+}
+
+void Node::before(Vector<std::variant<Ref<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
+{
</ins><span class="cx"> RefPtr<ContainerNode> parent = parentNode();
</span><span class="cx"> if (!parent)
</span><span class="cx"> return;
</span><span class="lines">@@ -481,7 +506,7 @@
</span><span class="cx"> auto nodeSet = nodeSetPreTransformedFromNodeOrStringVector(nodeOrStringVector);
</span><span class="cx"> auto viablePreviousSibling = firstPrecedingSiblingNotInNodeSet(*this, nodeSet);
</span><span class="cx">
</span><del>- auto node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+ auto node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx"> if (ec || !node)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -493,7 +518,7 @@
</span><span class="cx"> parent->insertBefore(*node, viablePreviousSibling.get(), ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Node::after(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void Node::after(Vector<std::variant<Ref<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<ContainerNode> parent = parentNode();
</span><span class="cx"> if (!parent)
</span><span class="lines">@@ -502,7 +527,7 @@
</span><span class="cx"> auto nodeSet = nodeSetPreTransformedFromNodeOrStringVector(nodeOrStringVector);
</span><span class="cx"> auto viableNextSibling = firstFollowingSiblingNotInNodeSet(*this, nodeSet);
</span><span class="cx">
</span><del>- auto node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+ auto node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx"> if (ec || !node)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -509,7 +534,7 @@
</span><span class="cx"> parent->insertBefore(*node, viableNextSibling.get(), ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void Node::replaceWith(Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
</del><ins>+void Node::replaceWith(Vector<std::variant<Ref<Node>, String>>&& nodeOrStringVector, ExceptionCode& ec)
</ins><span class="cx"> {
</span><span class="cx"> RefPtr<ContainerNode> parent = parentNode();
</span><span class="cx"> if (!parent)
</span><span class="lines">@@ -518,7 +543,7 @@
</span><span class="cx"> auto nodeSet = nodeSetPreTransformedFromNodeOrStringVector(nodeOrStringVector);
</span><span class="cx"> auto viableNextSibling = firstFollowingSiblingNotInNodeSet(*this, nodeSet);
</span><span class="cx">
</span><del>- auto node = convertNodesOrStringsIntoNode(*this, WTFMove(nodeOrStringVector), ec);
</del><ins>+ auto node = convertNodesOrStringsIntoNode(WTFMove(nodeOrStringVector), ec);
</ins><span class="cx"> if (ec)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Node.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Node.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/Node.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include <wtf/ListHashSet.h>
</span><span class="cx"> #include <wtf/MainThread.h>
</span><span class="cx"> #include <wtf/TypeCasts.h>
</span><ins>+#include <wtf/Variant.h>
</ins><span class="cx">
</span><span class="cx"> // This needs to be here because Document.h also depends on it.
</span><span class="cx"> #define DUMP_NODE_STATISTICS 0
</span><span class="lines">@@ -51,7 +52,6 @@
</span><span class="cx"> class NamedNodeMap;
</span><span class="cx"> class NodeList;
</span><span class="cx"> class NodeListsNodeData;
</span><del>-class NodeOrString;
</del><span class="cx"> class NodeRareData;
</span><span class="cx"> class QualifiedName;
</span><span class="cx"> class RenderBox;
</span><span class="lines">@@ -208,9 +208,9 @@
</span><span class="cx"> Element* nextElementSibling() const;
</span><span class="cx">
</span><span class="cx"> // From the ChildNode - https://dom.spec.whatwg.org/#childnode
</span><del>- void before(Vector<NodeOrString>&&, ExceptionCode&);
- void after(Vector<NodeOrString>&&, ExceptionCode&);
- void replaceWith(Vector<NodeOrString>&&, ExceptionCode&);
</del><ins>+ void before(Vector<std::variant<Ref<Node>, String>>&&, ExceptionCode&);
+ void after(Vector<std::variant<Ref<Node>, String>>&&, ExceptionCode&);
+ void replaceWith(Vector<std::variant<Ref<Node>, String>>&&, ExceptionCode&);
</ins><span class="cx"> WEBCORE_EXPORT void remove(ExceptionCode&);
</span><span class="cx">
</span><span class="cx"> // Other methods (not part of DOM)
</span><span class="lines">@@ -661,6 +661,8 @@
</span><span class="cx"> void setStyleChange(StyleChangeType changeType) { m_nodeFlags = (m_nodeFlags & ~StyleChangeMask) | changeType; }
</span><span class="cx"> void updateAncestorsForStyleRecalc();
</span><span class="cx">
</span><ins>+ RefPtr<Node> convertNodesOrStringsIntoNode(Vector<std::variant<Ref<Node>, String>>&&, ExceptionCode&);
+
</ins><span class="cx"> private:
</span><span class="cx"> virtual PseudoId customPseudoId() const
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoredomNodeOrStringcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/dom/NodeOrString.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/NodeOrString.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/NodeOrString.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,63 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "NodeOrString.h"
-
-#include "DocumentFragment.h"
-#include "Text.h"
-
-namespace WebCore {
-
-RefPtr<Node> convertNodesOrStringsIntoNode(Node& context, Vector<NodeOrString>&& nodeOrStringVector, ExceptionCode& ec)
-{
- if (nodeOrStringVector.isEmpty())
- return nullptr;
-
- Vector<Ref<Node>> nodes;
- nodes.reserveInitialCapacity(nodeOrStringVector.size());
- for (auto& nodeOrString : nodeOrStringVector) {
- switch (nodeOrString.type()) {
- case NodeOrString::Type::String:
- nodes.uncheckedAppend(Text::create(context.document(), nodeOrString.string()));
- break;
- case NodeOrString::Type::Node:
- nodes.uncheckedAppend(nodeOrString.node());
- break;
- }
- }
-
- if (nodes.size() == 1)
- return WTFMove(nodes.first());
-
- auto nodeToReturn = DocumentFragment::create(context.document());
- for (auto& node : nodes) {
- if (!nodeToReturn->appendChild(node, ec))
- return nullptr;
- }
- return WTFMove(nodeToReturn);
-}
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoredomNodeOrStringh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/dom/NodeOrString.h (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/NodeOrString.h        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Source/WebCore/dom/NodeOrString.h        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,163 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef NodeOrString_h
-#define NodeOrString_h
-
-#include "Node.h"
-#include <wtf/StdLibExtras.h>
-#include <wtf/Vector.h>
-#include <wtf/text/WTFString.h>
-
-namespace WebCore {
-
-class NodeOrString {
-public:
- enum class Type {
- String,
- Node
- };
-
- NodeOrString(const String& string)
- : m_type(Type::String)
- {
- m_data.string = string.impl();
- m_data.string->ref();
- }
-
- NodeOrString(Node* node)
- : m_type(Type::Node)
- {
- m_data.node = node;
- m_data.node->ref();
- }
-
- NodeOrString(const NodeOrString& other)
- : m_type(other.m_type)
- {
- switch (m_type) {
- case Type::String:
- m_data.string = other.m_data.string;
- m_data.string->ref();
- break;
- case Type::Node:
- m_data.node = other.m_data.node;
- m_data.node->ref();
- break;
- }
- }
-
- NodeOrString(NodeOrString&& other)
- : m_type(other.m_type)
- {
- switch (m_type) {
- case Type::String:
- m_data.string = std::exchange(other.m_data.string, nullptr);
- break;
- case Type::Node:
- m_data.node = std::exchange(other.m_data.node, nullptr);
- break;
- }
- }
-
- NodeOrString& operator=(const NodeOrString& other)
- {
- if (this == &other)
- return *this;
-
- derefData();
-
- m_type = other.m_type;
- switch (m_type) {
- case Type::String:
- m_data.string = other.m_data.string;
- m_data.string->ref();
- break;
- case Type::Node:
- m_data.node = other.m_data.node;
- m_data.node->ref();
- break;
- }
-
- return *this;
- }
-
- NodeOrString& operator=(NodeOrString&& other)
- {
- if (this == &other)
- return *this;
-
- derefData();
-
- m_type = other.m_type;
- switch (m_type) {
- case Type::String:
- m_data.string = std::exchange(other.m_data.string, nullptr);
- break;
- case Type::Node:
- m_data.node = std::exchange(other.m_data.node, nullptr);
- break;
- }
-
- return *this;
- }
-
- ~NodeOrString()
- {
- derefData();
- }
-
- Type type() const { return m_type; }
-
- Node& node() const { ASSERT(m_type == Type::Node); ASSERT(m_data.node); return *m_data.node; }
- StringImpl& string() const { ASSERT(m_type == Type::String); ASSERT(m_data.string); return *m_data.string; }
-
-private:
- void derefData()
- {
- switch (m_type) {
- case Type::String:
- if (m_data.string)
- m_data.string->deref();
- break;
- case Type::Node:
- if (m_data.node)
- m_data.node->deref();
- break;
- }
- }
-
- Type m_type;
- union {
- StringImpl* string;
- Node* node;
- } m_data;
-};
-
-RefPtr<Node> convertNodesOrStringsIntoNode(Node& context, Vector<NodeOrString>&&, ExceptionCode&);
-
-} // namespace WebCore
-
-#endif // NodeOrString_h
</del></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Tools/ChangeLog        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2016-08-06 Sam Weinig <sam@webkit.org>
+
+ Replace NodeOrString with std::variant<RefPtr<Node>, String>
+ https://bugs.webkit.org/show_bug.cgi?id=160638
+
+ Reviewed by Anders Carlsson.
+
+ * TestWebKitAPI/CMakeLists.txt:
+ * TestWebKitAPI/Tests/WTF/Variant.cpp:
+ Add additional tests for the initial state of std::variant and using
+ makeVisitor for visiting.
+
</ins><span class="cx"> 2016-08-09 Aakash Jain <aakash_jain@apple.com>
</span><span class="cx">
</span><span class="cx"> EWS logging should ensure the logging to file is stopped on queue termination
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPICMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/CMakeLists.txt (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/CMakeLists.txt        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Tools/TestWebKitAPI/CMakeLists.txt        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -76,6 +76,7 @@
</span><span class="cx"> ${TESTWEBKITAPI_DIR}/Tests/WTF/StringView.cpp
</span><span class="cx"> ${TESTWEBKITAPI_DIR}/Tests/WTF/TemporaryChange.cpp
</span><span class="cx"> ${TESTWEBKITAPI_DIR}/Tests/WTF/UniqueRef.cpp
</span><ins>+ ${TESTWEBKITAPI_DIR}/Tests/WTF/Variant.cpp
</ins><span class="cx"> ${TESTWEBKITAPI_DIR}/Tests/WTF/Vector.cpp
</span><span class="cx"> ${TESTWEBKITAPI_DIR}/Tests/WTF/WTFString.cpp
</span><span class="cx"> ${TESTWEBKITAPI_DIR}/Tests/WTF/WeakPtr.cpp
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFVariantcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp (204290 => 204291)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp        2016-08-09 19:57:24 UTC (rev 204290)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/Variant.cpp        2016-08-09 20:31:42 UTC (rev 204291)
</span><span class="lines">@@ -26,26 +26,52 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx">
</span><span class="cx"> #include "Counters.h"
</span><del>-#include "MoveOnly.h"
</del><span class="cx"> #include "RefLogger.h"
</span><span class="cx"> #include <wtf/Ref.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><ins>+#include <wtf/StdLibExtras.h>
</ins><span class="cx"> #include <wtf/Variant.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><span class="cx"> namespace TestWebKitAPI {
</span><span class="cx">
</span><ins>+TEST(WTF_Variant, Initial)
+{
+ std::variant<int, double> v1;
+ EXPECT_TRUE(v1.index() == 0);
+ EXPECT_TRUE(std::get<int>(v1) == 0);
+
+ struct T {
+ T() : value(15) { }
+ int value;
+ };
+
+ std::variant<T, int> v2;
+ EXPECT_TRUE(v2.index() == 0);
+ EXPECT_TRUE(std::get<T>(v2).value == 15);
+}
+
</ins><span class="cx"> TEST(WTF_Variant, Basic)
</span><span class="cx"> {
</span><del>- std::experimental::variant<int, double> variant = 1;
</del><ins>+ std::variant<int, double> variant = 1;
</ins><span class="cx"> EXPECT_TRUE(variant.index() == 0);
</span><del>- EXPECT_TRUE(std::experimental::get<int>(variant) == 1);
</del><ins>+ EXPECT_TRUE(std::get<int>(variant) == 1);
+ EXPECT_TRUE(*std::get_if<int>(variant) == 1);
+ EXPECT_TRUE(std::get_if<double>(variant) == nullptr);
+ EXPECT_TRUE(std::holds_alternative<int>(variant));
+ EXPECT_FALSE(std::holds_alternative<double>(variant));
+
+ variant = 1.0;
+ EXPECT_TRUE(variant.index() == 1);
+ EXPECT_TRUE(std::get<double>(variant) == 1);
+ EXPECT_TRUE(*std::get_if<double>(variant) == 1.0);
+ EXPECT_TRUE(std::get_if<int>(variant) == nullptr);
+ EXPECT_TRUE(std::holds_alternative<double>(variant));
+ EXPECT_FALSE(std::holds_alternative<int>(variant));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> TEST(WTF_Variant, BasicVisitor)
</span><span class="cx"> {
</span><del>- typedef std::experimental::variant<int, float, String> Variant;
-
</del><span class="cx"> enum class Type {
</span><span class="cx"> None,
</span><span class="cx"> Int,
</span><span class="lines">@@ -53,7 +79,6 @@
</span><span class="cx"> String,
</span><span class="cx"> };
</span><span class="cx">
</span><del>-
</del><span class="cx"> struct Visitor {
</span><span class="cx"> Visitor(Type& t)
</span><span class="cx"> : type(t)
</span><span class="lines">@@ -69,30 +94,60 @@
</span><span class="cx">
</span><span class="cx"> Type type = Type::None;
</span><span class="cx">
</span><del>- Variant variant = 8;
- std::experimental::visit(Visitor(type), variant);
</del><ins>+ std::variant<int, float, String> variant = 8;
+ std::visit(Visitor(type), variant);
</ins><span class="cx"> EXPECT_TRUE(Type::Int == type);
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> variant = 1.0f;
</span><del>- std::experimental::visit(Visitor(type), variant);
</del><ins>+ std::visit(Visitor(type), variant);
</ins><span class="cx"> EXPECT_TRUE(Type::Float == type);
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> variant = "hello";
</span><del>- std::experimental::visit(Visitor(type), variant);
</del><ins>+ std::visit(Visitor(type), variant);
</ins><span class="cx"> EXPECT_TRUE(Type::String == type);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+TEST(WTF_Variant, VisitorUsingMakeVisitor)
+{
+ enum class Type {
+ None,
+ Int,
+ Float,
+ String,
+ };
+
+ Type type = Type::None;
+
+ auto visitor = WTF::makeVisitor(
+ [&](int) { type = Type::Int; },
+ [&](float) { type = Type::Float; },
+ [&](String) { type = Type::String; }
+ );
+
+ std::variant<int, float, String> variant = 8;
+ std::visit(visitor, variant);
+ EXPECT_TRUE(Type::Int == type);
+
+
+ variant = 1.0f;
+ std::visit(visitor, variant);
+ EXPECT_TRUE(Type::Float == type);
+
+
+ variant = "hello";
+ std::visit(visitor, variant);
+ EXPECT_TRUE(Type::String == type);
+}
+
</ins><span class="cx"> TEST(WTF_Variant, ConstructorDestructor)
</span><span class="cx"> {
</span><del>- typedef std::experimental::variant<std::unique_ptr<ConstructorDestructorCounter>, int> Variant;
-
</del><span class="cx"> ConstructorDestructorCounter::TestingScope scope;
</span><span class="cx">
</span><span class="cx"> {
</span><span class="cx"> auto uniquePtr = std::make_unique<ConstructorDestructorCounter>();
</span><del>- Variant v = WTFMove(uniquePtr);
</del><ins>+ std::variant<std::unique_ptr<ConstructorDestructorCounter>, int> v = WTFMove(uniquePtr);
</ins><span class="cx">
</span><span class="cx"> EXPECT_EQ(1u, ConstructorDestructorCounter::constructionCount);
</span><span class="cx"> EXPECT_EQ(0u, ConstructorDestructorCounter::destructionCount);
</span><span class="lines">@@ -102,14 +157,12 @@
</span><span class="cx"> EXPECT_EQ(1u, ConstructorDestructorCounter::destructionCount);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-TEST(WTF_Variant, RefCounting)
</del><ins>+TEST(WTF_Variant, RefPtr)
</ins><span class="cx"> {
</span><del>- typedef std::experimental::variant<RefPtr<RefLogger>, int> Variant;
-
</del><span class="cx"> {
</span><span class="cx"> RefLogger a("a");
</span><span class="cx"> RefPtr<RefLogger> ref(&a);
</span><del>- Variant v = ref;
</del><ins>+ std::variant<RefPtr<RefLogger>, int> v = ref;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> ASSERT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
</span><span class="lines">@@ -117,10 +170,21 @@
</span><span class="cx"> {
</span><span class="cx"> RefLogger a("a");
</span><span class="cx"> RefPtr<RefLogger> ref(&a);
</span><del>- Variant v = WTFMove(ref);
</del><ins>+ std::variant<RefPtr<RefLogger>, int> v = WTFMove(ref);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+TEST(WTF_Variant, Ref)
+{
+ {
+ RefLogger a("a");
+ Ref<RefLogger> ref(a);
+ std::variant<Ref<RefLogger>, int> v = WTFMove(ref);
+ }
+
+ ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre>
</div>
</div>
</body>
</html>