> > I think at the least we should offer a #[deriving(Basics)] for use on > public > > types so that people aren't forced to memorize "Eq Ord TotalOrd TotalEq > > IterBytes Clone" (unless we can find a silly SFINAE-esque acronym... > > http://www.wordsmith.org/anagram/anagram.cgi?anagram=eottic ). > > Plenty of types can't actually be ordered, and in *many* cases not all > fields should be considered for equality/ordering and they may or may > not be listed in the order the comparison should try. > > The only two that rarely require any extra consideration are > `Clone`/`DeepClone`, since they should be on almost every type without > a destructor. > > I just had a random thought.
I once implemented a data structure for .NET called a VList ( http://www.codeproject.com/Articles/26171/VList-data-structures-in-C) which provided a "SmartSelect" pseudo-LINQ method. If you had a list of numbers, you could ensure they are all positive like this: list.SmartSelect(x => Math.Max(x, 1)) The reason it's called SmartSelect is that it returns a changed list only if the select operation *changes* any of the values (and even then it may still be able to re-use the tail of the list). The tricky part is detecting when there has been any changes. Ideally I would have liked to simply do a bitwise equality test because it would be very fast and requires no special support from the data type, but .NET doesn't have a bitwise equality test. So I ended up having to use a test that always requires dynamic method invocation, which I have heard is fantastically slow in the general case of structs that don't implement IEquatable<T>. I wonder if Rust could, in the general case, allow my bitwise equality test. I realize that bitwise equality isn't "real" equality, but in this case it's good enough. For instance if the selector changes -0.0 to +0.0, which is value-equal but bitwise-different, the effect is fairly harmless--a partially new list is allocated instead of re-using the old list. Of course, if the list contains references (~T, @T), the bitwise test should compare the references themselves, without dereferencing.
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
