on Sun Sep 18 2016, Adrian Zubarev <swift-users-AT-swift.org> wrote:
> Dear Swift community, > > currently I’m building a value type XML library which is baked behind > the scene with a reference type to manage graph traversing between > nodes. I also like to COW optimize the xml graph, but I run into one > single problem atm. > > Image this xml tree: > > <root> > <item/> > </root> > It’s just a root element with one single child. As for value types it > should be totally fine to do something like this: > > // The given xml tree > var root = XML.Element(name: "root") > let item = XML.Element(name: "item") > root.add(item) > > // The problematic behavior > root.add(root) > If this would be a simple value type without any references behind the > scenes you could imagine that the result of the last code line will > look like this: > > <root> > <item/> > <root> > <item/> > </root> > </root> Yep, that's exactly the right answer for a tree with value semantics. The simplest way to implement this tree is to use an Array for the child nodes. > Basically we copied the whole tree and added it as the second child > into the original root element. > > As for COW optimization this is a problem, just because the passed > root is a copy of a struct that contains the exact same reference as > the original root element. I don't understand why that's a problem. > isKnownUniquelyReferenced(&self.reference) will result in false inside > the add method. ...as it should. > Is there any chance I could force my program to decrease the reference > counter of that last item after I’m sure I don’t need it?! Which last item? When are you sure you don't need it? What result do you hope for? > A few more details: inside the add method I’m always cloning the > passed reference just because graphs aren’t that trivial and otherwise > I could possibly end up with a cycle graph, which would be really > bad. After that job I’m sure that I don’t need the passed reference > anymore and I need a way to escape from it. > > I’d appreciate any suggestions and help. :) It's not clear what you want to acheive nor can I picture the code you're using to acheive it, so it's hard to give useful feedback. Sorry, -- -Dave _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users