On Aug 24, 2013, at 6:31 PM, Mike Duigou <mike.dui...@oracle.com> wrote:
> I will need to spend more time reviewing the HashMap/LinkedHashMap > implementations but here are some initial comments. > OK, thanks. > Mike > > HashMap:: > > - The "Sorry if you don't like..." comment can be omitted. > Or we could tweak: * The concurrent-programming-like SSA-based coding style helps avoid aliasing errors * amid all of the twisty pointer operations. > > SpliteratorCharacteristics:: > > - style comment : I always define my assertXXX in the (value, expected, > message) form as well as the (value, expected). Being able to pass the test > case name for message is often useful context. It is a little more > boilerplate. > That's a good point. I am terribely lazy about that aspect. > - void assertNullComparator(Collection<?> c) { > 210 assertNullComparator(c.spliterator()); > 211 } > > intentionally throws NPE if c is null? Why not instead assertNull or > assertNonNull? > No, the collection c is never null, the comparator of the spliterator of the collection is asserted to be null. > > MapBinToFromTreeTest:: > > - thank you for using "hg move" to preserve history. :-) > That was a happy accident on my part :-) > - I try to encourage @DataProvider methods to return Iterator<Object[]> > rather than Object[][]. I haven't made an incremental data provider which > generates cases in next() yet.... but I could someday. > > - getCollector(), put(), remove() could all be static > I don't have a strong preferences regarding the above. I may tweak the data provider since the logging does not identify the hash map implementation. > - put(SIZE, m, (i, s) -> { }); could be put(SIZE, m, (i, s) -> { > assertEquals(i + 1,s); }); or some other check in put that the construction > was expected. > Note that the reuse here is just a convenience to fill up the map. Also there is no real dependence that i + 1 = s. The only constraint is that there are up to but not including s elements, but we don't need to know about the order (and in fact we could add different orders later on as i suspect it might affect the tree shape). > On Aug 21 2013, at 05:25 , Paul Sandoz wrote: > >> Hi, >> >> Here are Doug's Linked/HashMap changes, discussed in a previous thread, as a >> webrev: >> >> http://cr.openjdk.java.net/~psandoz/tl/JDK-8023463-Linked-HashMap-bin-and-tree/webrev/ >> >> I also added some tests related to characteristics associated with fixing >> another bug. >> >> Looking at the diffs will be tricky given there are so many changes. >> >> >> I fixed unchecked warnings in LinkedHashMap, but have not done so for >> HashMap, where there are many more casts from Node to TreeNode. One way to >> solve that is with a static method: >> >> @SuppressWarnings("unchecked") >> static <K, V> TreeNode<K, V> asTreeNode(Node<K, V> n) { >> return (TreeNode<K, V>) n; >> } >> >> but i dunno what the performance implications are. Perhaps it's best to >> simply stuff @SuppressWarnings on methods of TreeNode rather than trying to >> modify code just for the sake of reducing the scope. > > Always a tough spot. I've favoured adding annotations to variables wherever > possible but when it becomes necessary to suppress for entire methods it does > feel like shot > > The alternative approach of using a method would almost certainly be inlined > and as a result would have little (if any) impact on performance. > > I still lean towards suppressing on variables and then see what's left. > It's kind of awkward, i already tried it and it seemed marginally oppressive in some cases. I should take another swing at it. Paul.