<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><div style="direction: inherit;">or could the problem be flip on its head and implemented with a normal reference type, dealing with threading issues instead of having to optimise CoW and still perhaps being open to spikes in memory bandwidth at the wrong time when the copy is actually performed?</div><br>Sent from my iPhone</div><div><br>On 19 Sep 2016, at 22:46, Andrew Trick via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=utf-8"><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 19, 2016, at 3:18 AM, Adrian Zubarev via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);"><p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">I think I just found a solution to my problem:</p><pre style="margin: 15px 0px; font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">/// - Parameter child: The new `child` to add to the `children` array.
public mutating func add(_ child: Element) {

   let clonedChildReference = Reference(cloning: child.reference)
   let index = self.reference.children.endIndex
             
   self.mutableInsert(clonedChildReference, at: index, isNotOwnReference: child.reference !== self.reference)
}
         
/// Warning: Pass only clonded nodes of type Element to this function!
private mutating func mutableInsert(_ node: XML.Node, at index: Int, isNotOwnReference: Bool) {

   // * If `self.reference` is NOT uniquely referenced and `node` is a String,
   //   we should rebuilt own reference.
   // * If `self.reference` is NOT uniquely referenced and `node` is a Reference
   //   `isNotOwnReference` is true, we should rebuilt own reference.
   // * If `self.reference` is NOT uniquely referenced and `node` is a clone  
   //   reference to `self.reference` where is `isNotOwnReference` is false, we
   //   should check if there are more than **two** strong references to rebuild
   //   own reference, otherwise it's an implementation artifact and we can keep
   //   old reference (any `node` of type Reference is cloned before it's added  
   //   to the child array).
   let isNotKnownUniquelyReferenced = !isKnownUniquelyReferenced(&amp;self.reference)
             
   var shouldRebuildReference = false
             
   switch node.kind {
                 
   case .element(_):
      let hasMoreThanTwoStrongReferences = (CFGetRetainCount(self.reference) - 1) &gt; 2
      shouldRebuildReference = (isNotKnownUniquelyReferenced &amp;&amp; isNotOwnReference) || hasMoreThanTwoStrongReferences
                 
   case .text(_):
      shouldRebuildReference = isNotKnownUniquelyReferenced
   }
             
   if shouldRebuildReference {
                 
      self.reference = Reference(cloning: self.reference, wholeTree: true)
   }

   self.reference.insert(node, at: index)
}
</code></pre><p style="margin: 15px 0px;" class="">I’m using<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">CFGetRetainCount(self.reference)</code><span class="Apple-converted-space">&nbsp;</span>to catch that implementation artifact.</p></div></div></blockquote><div>If people are resorting to CFGetRetainCount, then we have a problem. The optimizer is not under any obligation to bump the refcount to 2.</div><div><br class=""></div><div>There must be a better way to handle this. Rather than passing an</div><div>'isNotOwnReference' flag, I think you should determine whether a clone</div><div>is needed before passing the node into mutableInsert.</div><div><br class=""></div><div>You effectively want an API like root.addSelf().</div><div class=""><br class=""></div><div class="">-Andy</div><blockquote type="cite" class=""><div class=""><div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);"><div style="margin: 15px 0px;" class=""><br class="webkit-block-placeholder"></div></div><div class="bloop_original_html" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);"><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><br class=""><div id="bloop_sign_1474279558626446848" class="bloop_sign"><div style="font-family: helvetica, arial; font-size: 13px;" class="">--&nbsp;<br class="">Adrian Zubarev<br class="">Sent with Airmail</div></div><br class=""><p class="airmail_on" style="margin: 15px 0px;">Am 19. September 2016 um 09:59:24, Adrian Zubarev (<a href="mailto:adrian.zubarev@devandartist.com" style="color: rgb(65, 131, 196); background-color: inherit; text-decoration: none;" class="">adrian.zubarev@devandartist.com</a>) schrieb:</p><blockquote type="cite" class="clean_bq" style="margin: 15px 0px;"><span style="margin-top: 0px; margin-bottom: 0px;" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""></div><div class=""><div class="bloop_markdown"><p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">Hello Dave,</p><p style="margin: 15px 0px;" class="">thank you for trying to help me. I’ll try to explain the issue with some more details.</p><p style="margin: 15px 0px;" class="">First here is some code:</p><pre style="margin: 15px 0px; font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">extension XML {
      
    public struct Element {

        // public for testing   
        public var reference: Reference

        public var name: String { return self.reference.name }

        public var children: [Element] {
              
            return self.reference.children.flatMap {
                  
                guard case .element(let element) = $0.kind else { return nil }
                return Element(wrapping: element)
            }
        }
          
        public init(name: String) {
              
            self.reference = Reference(name: name)
        }

        public mutating func add(_ child: Element) {
              
            self.mutableInsert(Reference(cloning: child.reference), at: self.reference.children.endIndex)
        }
          
        // Ignore XML.Node, it's a String or Reference
        // Parameter `Node` is assumed to be a clone of a reference passed to `add` or `insert` method.
        private mutating func mutableInsert(_ node: XML.Node, at index: Int) {
              
            // Clone own reference all way up to the root
            if !isKnownUniquelyReferenced(&amp;self.reference) {
                  
                self.reference = Reference(cloning: self.reference, wholeTree: true)
            }
              
            // Extract a reference or just insert a string as a child
            guard case .element(let nodeReference) = node.kind else {
                  
                self.reference.insert(node, at: index)
                return
            }
              
            // Check for possible debelopment bug
            if nodeReference === self.reference {
                  
                fatalError("wrong usage of `mutableInsert` function")
            }
              
            self.reference.insert(nodeReference, at: index)
        }
          
        ...
    }
}

extension XML.Element {
      
    // public for testing
    public class Reference : XML.Node {
          
        let name: String

        private(set) weak var parent: Reference?

        private(set) var children: [XML.Node]

        var kind: XML.Node.Kind { return .element(self) }

        ...
    }
}
</code></pre><p style="margin: 15px 0px;" class="">Now lets focus on the problem.</p><p style="margin: 15px 0px;" class="">Every<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">Element</code><span class="Apple-converted-space">&nbsp;</span>is baked with it’s own<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">Reference</code><span class="Apple-converted-space">&nbsp;</span>to be able to traverse the tree from any of it’s node all way up to the root for example.</p><p style="margin: 15px 0px;" class="">Lets look again at the scenario I already described:</p><pre style="margin: 15px 0px; font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">var root = XML.Element(name: "root")
var elem = XML.Element(name: "elem")

ObjectIdentifier(root.reference) // 0x000060000026ab40
ObjectIdentifier(elem.reference) // 0x000060800026bb00

isKnownUniquelyReferenced(&amp;root.reference) // true
isKnownUniquelyReferenced(&amp;elem.reference) // true

root.add(elem)

isKnownUniquelyReferenced(&amp;root.reference) // true

root.add(root)

// The reference of root has changed even if the second child   
// was cloned and added as a new object to the reference.
// 0x000060000026ab40 &lt;-- was thrown away
isKnownUniquelyReferenced(&amp;root.reference) // true

ObjectIdentifier(root.reference) // 0x000060000026c680 &lt;— new one
</code></pre><p style="margin: 15px 0px;" class="">The way I’m adding children to the tree is that every passed element of type<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">XML.Element</code><span class="Apple-converted-space">&nbsp;</span>stores a<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">Reference</code>, which will be cloned and added as a new standalone object to the children array.</p><p style="margin: 15px 0px;" class="">The same happens when we try adding<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">root</code><span class="Apple-converted-space">&nbsp;</span>as it’s own child. We copy<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root</code><span class="Apple-converted-space">&nbsp;</span>struct which contains the same reference, then we clone it inside<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">add</code><span class="Apple-converted-space">&nbsp;</span>method, then we pass the new object to the<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">mutableInsert</code><span class="Apple-converted-space">&nbsp;</span>function. At that point we don’t need the old reference anymore, I’m speaking of<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root.add(root)</code>. The problem here is that at that time<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root.reference</code><span class="Apple-converted-space">&nbsp;</span>has 2 strong references which I cannot escape.</p><p style="margin: 15px 0px;" class="">I could workaround the problem if I knew the reference counter value, because I could check if the passed<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">Element</code><span class="Apple-converted-space">&nbsp;</span>contains the same reference first. And if it does and we have exactly 2 strong references, I don’t need to recreate<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root.reference</code><span class="Apple-converted-space">&nbsp;</span>here.</p><p style="margin: 15px 0px;" class="">But I couldn’t find any API for that. :/</p></div><div class="bloop_original_html"><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><br class=""><div id="bloop_sign_1474267770105763840" class="bloop_sign"><div style="font-family: helvetica, arial; font-size: 13px;" class="">--&nbsp;<br class="">Adrian Zubarev<br class="">Sent with Airmail</div></div><br class=""><p class="airmail_on" style="margin: 15px 0px;">Am 19. September 2016 um 05:50:57, Dave Abrahams via swift-users (<a href="mailto:swift-users@swift.org" style="color: rgb(65, 131, 196); background-color: inherit; text-decoration: none;" class="">swift-users@swift.org</a>) schrieb:</p><blockquote type="cite" class="clean_bq" style="margin: 15px 0px;"><div style="margin-top: 0px; margin-bottom: 0px;" class=""><div class=""><span class=""><br class="">on Sun Sep 18 2016, Adrian Zubarev &lt;<a href="http://swift-users-AT-swift.org" class="">swift-users-AT-swift.org</a>&gt; wrote:<br class=""><br class="">&gt; Dear Swift community,<br class="">&gt;<br class="">&gt; currently I’m building a value type XML library which is baked behind<br class="">&gt; the scene with a reference type to manage graph traversing between<br class="">&gt; nodes. I also like to COW optimize the xml graph, but I run into one<br class="">&gt; single problem atm.<br class="">&gt;<br class="">&gt; Image this xml tree:<br class="">&gt;<br class="">&gt; &lt;root&gt;<br class="">&gt; &lt;item/&gt;<br class="">&gt; &lt;/root&gt;<br class="">&gt; It’s just a root element with one single child. As for value types it<br class="">&gt; should be totally fine to do something like this:<br class="">&gt;<br class="">&gt; // The given xml tree<br class="">&gt; var root = XML.Element(name: "root")<br class="">&gt; let item = XML.Element(name: "item")<br class="">&gt; root.add(item)<br class="">&gt;<br class="">&gt; // The problematic behavior<br class="">&gt; root.add(root)<br class="">&gt; If this would be a simple value type without any references behind the<br class="">&gt; scenes you could imagine that the result of the last code line will<br class="">&gt; look like this:<br class="">&gt;<br class="">&gt; &lt;root&gt;<br class="">&gt; &lt;item/&gt;<br class="">&gt; &lt;root&gt;<br class="">&gt; &lt;item/&gt;<br class="">&gt; &lt;/root&gt;<br class="">&gt; &lt;/root&gt;<br class=""><br class="">Yep, that's exactly the right answer for a tree with value semantics.<br class="">The simplest way to implement this tree is to use an Array for the child<br class="">nodes.<br class=""><br class="">&gt; Basically we copied the whole tree and added it as the second child<br class="">&gt; into the original root element.<br class="">&gt;<br class="">&gt; As for COW optimization this is a problem, just because the passed<br class="">&gt; root is a copy of a struct that contains the exact same reference as<br class="">&gt; the original root element.<br class=""><br class="">I don't understand why that's a problem.<br class=""><br class="">&gt; isKnownUniquelyReferenced(&amp;self.reference) will result in false inside<br class="">&gt; the add method.<br class=""><br class="">...as it should.<br class=""><br class="">&gt; Is there any chance I could force my program to decrease the reference<br class="">&gt; counter of that last item after I’m sure I don’t need it?!<br class=""><br class="">Which last item? When are you sure you don't need it? What result do<br class="">you hope for?<br class=""><br class="">&gt; A few more details: inside the add method I’m always cloning the<br class="">&gt; passed reference just because graphs aren’t that trivial and otherwise<br class="">&gt; I could possibly end up with a cycle graph, which would be really<br class="">&gt; bad. After that job I’m sure that I don’t need the passed reference<br class="">&gt; anymore and I need a way to escape from it.<br class="">&gt;<br class="">&gt; I’d appreciate any suggestions and help. :)<br class=""><br class="">It's not clear what you want to acheive nor can I picture the code<br class="">you're using to acheive it, so it's hard to give useful feedback.<br class=""><br class="">Sorry,<br class=""><br class="">--<br class="">-Dave<br class=""><br class="">_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-users">https://lists.swift.org/mailman/listinfo/swift-users</a><br class=""></span></div></div></blockquote></div><div class="bloop_markdown"></div></div></div></span></blockquote></div><div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);"><div style="margin: 15px 0px; -webkit-margin-before: 0px;" class=""><br class="webkit-block-placeholder"></div></div><span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class=""><span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class=""><span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class=""><span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class=""></div></blockquote></div><br class=""></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></body></html>