<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><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="">https://lists.swift.org/mailman/listinfo/swift-users<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=""></body></html>