Re: How can I save a class use the RedBlackTree?
On Tuesday, May 03, 2016 13:26:22 Meta via Digitalmars-d-learn wrote: > On Tuesday, 3 May 2016 at 12:12:04 UTC, Jonathan M Davis wrote: > > On Tue, 3 May 2016 11:37:13 +0200 > > Steven Schveighoffer via Digitalmars-d-learn > > > > wrote: > >> bleh, Object.opCmp only works with mutable objects. Which > >> means RedBlackTree cannot work with objects because it uses > >> inout to ensure your objects are not modified (since 2.068) > >> > >> It doesn't work with const or immutable either, the only > >> possible solution is to go back to mutable only. > >> > >> So annoying, we need to fix Object.opCmp, or using > >> const/immutable comparisons with objects doesn't work. > > > > Hopefully someday... > > > > https://issues.dlang.org/show_bug.cgi?id=9770 > > > > - Jonathan M Davis > > What's stopping us right now from making opCmp a free function in > object.d? In general, the two big blockers for removing opEquals, opCmp, toString, and toHash from Object are 1. The built-in AAs either need to be fixed so that they don't need Object and use the actual type that you're telling them to use (e.g. by templatizing them internally), or using classes as keys in the built-in AAs needs to be deprecated. The first requires fixing the built-in AAs, which is a huge pain. There have been several attempts, but AFAIK, no one has ever succeeded (Martin was the last one to try from what I recall, but I don't know how far he got). The second requires that we have a proper replacement in Phobos so that folks would actually have an alternative when using classes as keys was deprecated. At some point here, we're going to need to decide whether it's actually feasible to fix the built-in AAs, or whether we should just reduce what they can do to the sane subset, but it doesn't necessarily matter much as long as we don't have a viable HashMap/HashTable implementation in Phobos. 2. One or more compiler devs have to be convinced to prioritize making the changes required to actually deprecate these functions without breaking code (which isn't exactly straightforward). And we haven't even worked out yet exactly how such deprecations would work. It would be trivial if we could just break code, and the changes required in programmers are likely to be minor, but immediately breaking code like that without a deprecation path is not acceptable. As for making opCmp a free function, that's not how operator overloading works. The fact that opEquals ends up using a free function to call the opEquals on your type is an anomally (it's required for opEquals because of communutativity concerns). It _might_ make sense for opCmp for the same reasons but only if opCmp is required to have strict ordering (which is a matter of some debate). But even if it did make sense to turn opCmp into a free function, making that work rather than just creating a free function called opCmp that never gets used by anything would likely require effort similar to (or worse than) what would be required to make it possible to cleanly deprecate opCmp on Object. The first concern is sorting out what we do with the built-in AAs, which is potentially blocked by Andrei's revamping of std.container so that we can have a proper HashMap/HashTable in Phobos. The second concern is then figuring out the best way to go about actually deprecating those 4 functions and getting someone to do it. I expect that it will happen, but it's blocked by some stuff that could take a while, and it hasn't been a high priority. - Jonathan M Davis
Re: How can I save a class use the RedBlackTree?
On Tuesday, 3 May 2016 at 12:12:04 UTC, Jonathan M Davis wrote: On Tue, 3 May 2016 11:37:13 +0200 Steven Schveighoffer via Digitalmars-d-learn wrote: bleh, Object.opCmp only works with mutable objects. Which means RedBlackTree cannot work with objects because it uses inout to ensure your objects are not modified (since 2.068) It doesn't work with const or immutable either, the only possible solution is to go back to mutable only. So annoying, we need to fix Object.opCmp, or using const/immutable comparisons with objects doesn't work. Hopefully someday... https://issues.dlang.org/show_bug.cgi?id=9770 - Jonathan M Davis What's stopping us right now from making opCmp a free function in object.d?
Re: How can I save a class use the RedBlackTree?
On Tue, 3 May 2016 11:37:13 +0200 Steven Schveighoffer via Digitalmars-d-learn wrote: > bleh, Object.opCmp only works with mutable objects. Which means > RedBlackTree cannot work with objects because it uses inout to ensure > your objects are not modified (since 2.068) > > It doesn't work with const or immutable either, the only possible > solution is to go back to mutable only. > > So annoying, we need to fix Object.opCmp, or using const/immutable > comparisons with objects doesn't work. Hopefully someday... https://issues.dlang.org/show_bug.cgi?id=9770 - Jonathan M Davis
Re: How can I save a class use the RedBlackTree?
On 5/3/16 5:10 AM, Dsby wrote: this is the test Code: import std.container.rbtree; import std.stdio; class TClass { int i; } void main() { RedBlackTree!(TClass) list = new RedBlackTree!(TClass)(); auto t = new TClass(); list.insert(t); writeln("The rbtree length is ",list.length()); list.removeKey(t); writeln("The rbtree length is ",list.length()); } and thisis erro : /usr/include/dlang/dmd-2.071.0/phobos/std/functional.d-mixin-206(206): Error: mutable method object.Object.opCmp is not callable using a inout object /usr/include/dlang/dmd-2.071.0/phobos/std/container/rbtree.d(871): Error: template instance std.functional.binaryFun!("a < b", "a", "b").binaryFun!(inout(TClass), TClass) error instantiating rbtree.d(11):instantiated from here: RedBlackTree!(TClass, "a < b", false) /usr/include/dlang/dmd-2.071.0/phobos/std/functional.d-mixin-206(206): Error: function object.Object.opCmp (Object o) is not callable using argument types (inout(TClass)) /usr/include/dlang/dmd-2.071.0/phobos/std/container/rbtree.d(873): Error: template instance std.functional.binaryFun!("a < b", "a", "b").binaryFun!(TClass, inout(TClass)) error instantiating rbtree.d(11):instantiated from here: RedBlackTree!(TClass, "a < b", false) bleh, Object.opCmp only works with mutable objects. Which means RedBlackTree cannot work with objects because it uses inout to ensure your objects are not modified (since 2.068) It doesn't work with const or immutable either, the only possible solution is to go back to mutable only. So annoying, we need to fix Object.opCmp, or using const/immutable comparisons with objects doesn't work. -Steve
How can I save a class use the RedBlackTree?
this is the test Code: import std.container.rbtree; import std.stdio; class TClass { int i; } void main() { RedBlackTree!(TClass) list = new RedBlackTree!(TClass)(); auto t = new TClass(); list.insert(t); writeln("The rbtree length is ",list.length()); list.removeKey(t); writeln("The rbtree length is ",list.length()); } and thisis erro : /usr/include/dlang/dmd-2.071.0/phobos/std/functional.d-mixin-206(206): Error: mutable method object.Object.opCmp is not callable using a inout object /usr/include/dlang/dmd-2.071.0/phobos/std/container/rbtree.d(871): Error: template instance std.functional.binaryFun!("a < b", "a", "b").binaryFun!(inout(TClass), TClass) error instantiating rbtree.d(11):instantiated from here: RedBlackTree!(TClass, "a < b", false) /usr/include/dlang/dmd-2.071.0/phobos/std/functional.d-mixin-206(206): Error: function object.Object.opCmp (Object o) is not callable using argument types (inout(TClass)) /usr/include/dlang/dmd-2.071.0/phobos/std/container/rbtree.d(873): Error: template instance std.functional.binaryFun!("a < b", "a", "b").binaryFun!(TClass, inout(TClass)) error instantiating rbtree.d(11):instantiated from here: RedBlackTree!(TClass, "a < b", false)