Hi Alex, I can do that for you ....
-Patrick Am 31.07.2018 um 21:08 schrieb Alex Foster: > Sure, I don't mind. I would have done that myself but I don't think I have > access to upload to cr.openjdk.java.net. > > > Alex > > ________________________________ > From: Stuart Marks <stuart.ma...@oracle.com> > Sent: July 31, 2018 2:40 PM > To: Alex Foster > Cc: core-libs-dev@openjdk.java.net > Subject: Re: 8143850: retrofit ArrayDeque to implement List > > > OK, great. > > > It looks like a heavily modified version of ArrayDeque.java. This makes it a > bit difficult to understand what the changes are. Would you mind if I > rehosted this to cr.openjdk.java.net and generated a webrev for it? > > > Thanks, > > > s'marks > > On 7/28/18 11:05 PM, Alex Foster wrote: > > Hi, > > > Here's my current proposal: https://pastebin.com/EABgwLYS > > > Alex > > > ________________________________ > From: Stuart Marks <stuart.ma...@oracle.com><mailto:stuart.ma...@oracle.com> > Sent: July 28, 2018 8:11 PM > To: Martin Buchholz; Alex Foster > Cc: Doug Lea; > core-libs-dev@openjdk.java.net<mailto:core-libs-dev@openjdk.java.net> > Subject: Re: 8143850: retrofit ArrayDeque to implement List > > Hi, I finally got some time to get my head around this. > > Conceptually, I like the idea of a List that's stored in a circular array, > like > ArrayDeque. The best way to manifest this in the API isn't obvious though. I > filed the bug as "retrofit ArrayDeque to implement List" but of course it > doesn't have to be this way. > > I also think we want to reuse an existing implementation as much as possible. > There's already too much duplication between ArrayList and ArrayDeque; we > don't > want a third similar implementation that will need to be maintained in > parallel. > > To Martin's points: > > * Adding List-like methods to ArrayDeque without it implementing List is > indeed > odd, but not necessarily fatal. It does seem to raise the question "Isn't > there > a better way?" though. > > * I don't want to have to add null support if at all possible, for the reasons > Martin mentioned. Also, it's an implementation and maintenance headache. Of > course the implementations like ArrayList and HashMap are proof that it can be > done. But each time HashMap has been enhanced significantly, there's been a > bug > tail where null checking was missed in certain cases. > > * Growth policy. The shared null array setup for ArrayList was added when we > observed that a significant number of ArrayLists are created with the default > constructor and then never populated. Allocating the backing array lazily > resulted in a considerable space savings. I think this would be a good idea to > do for ArrayDeque, but this is somewhat orthogonal to the current "retrofit > List" discussion. > > * Regarding nestmates, I don't think the use of nestmates has any advantage or > disadvantage over package-level access between top-level classes in the same > package. I think we should decide what we want the API to look like first, and > then figure out how to factor things so that we can get the code sharing and > coupling that we want. We might not be forced into contorting the API in order > to get better sharing/coupling, but let's wait to cross that bridge if we come > to it. > > -- > > Alex, I'm not sure where your current proposal stands. Have you sent an update > since the head of the thread? If you had included something as an attachment, > it > has likely been stripped. > > Thanks, > > s'marks > > > > > > On 7/23/18 8:46 PM, Martin Buchholz wrote: >> (As usual, I don't have enough time to devote to this at the moment) >> >> I sort of like the idea of adding all of those List methods to ArrayDeque, >> but >> it's __weird__ for java code to do that, and remove(int) is a problem when >> you >> have ArrayDeque<Integer>, so it will probably end up rejected. >> >> --- >> >> Similarly, the idea of an ArrayDeque subclass that accepts nulls will be >> unpopular - null elements have fallen out of favor. >> >> While|Deque|implementations are not strictly required to prohibit the >> insertion >> of null elements, they are strongly encouraged to do so. Users of >> any|Deque|implementations that do allow null elements are strongly >> encouraged/not/to take advantage of the ability to insert nulls. This is so >> because|null|is used as a special return value by various methods to indicate >> that the deque is empty. >> >> --- >> >> It makes some sense for ArrayDeque's growth policy to be very similar to >> ArrayList's - that should be done as an independent change. Are there any >> lessons to be learned from ArrayList's experience? Is the world filled with >> empty ArrayDeques that could share a common backing array? >> >> --- >> >> I do like the idea of having ArrayDeque's List-implementing subclass be a >> nestmate of ArrayDeque, to share implementation details and to help discovery >> and naming. I'm not thrilled with reusing "List" in ArrayDeque.List but I >> don't >> have a great alternative to suggest. >> >> >> On Mon, Jul 16, 2018 at 10:36 AM, Alex Foster >> <alexfos...@hotmail.ca<mailto:alexfos...@hotmail.ca> >> <mailto:alexfos...@hotmail.ca>> wrote: >> >> Hi again, >> >> I updated ArrayDeque with your last idea (adding all list methods but not >> implementing List) and added a subclass ArrayDeque.List which overrides >> equals and hashcode and implements List. There is also a subclass >> ArrayDeque.WithNulls that accepts null elements. ArrayDeque has >> removeAt(int >> index) instead of remove(index) to avoid overloading remove(Object). >> >> I also added shared empty arrays similar to Arraylist, and a reallocate >> method which can do the same things as trimToSize and ensure capacity in >> Arraylist. It also allows you to trim to a specific capacity other than >> the >> size or skip trimming if the capacity is within a specified distance of >> the >> target capacity. >> >> Also the bulk add methods call collection.toArray, then check the array >> for >> illegal elements, then add the array, which means that a collection could >> keep the array it returns from toArray and modify it from another thread >> after it has been checked but before it has been added which could lead >> to >> illegal elements being added to the ArrayDeque. We could maybe avoid >> this by >> cloning the array or checking the elements after adding them but I'm not >> sure if it's worth it... >> >> What do you think? >> >> I also changed the WhiteBox test a bit: >> >> --- a/test/jdk/java/util/ArrayDeque/WhiteBox.java >> +++ b/test/jdk/java/util/ArrayDeque/WhiteBox.java >> @@ -88,7 +88,10 @@ >> >> @Test >> public void defaultConstructor() { >> - checkCapacity(new ArrayDeque(), 16); >> + ArrayDeque d = new ArrayDeque(); >> + d.add(new Object()); >> + d.clear(); >> + checkCapacity(d, 16); >> } >> >> @Test >> @@ -131,7 +134,7 @@ >> if (rnd.nextBoolean()) d.add(99); >> ArrayDeque clone = serialClone(d); >> assertInvariants(clone); >> - assertNotSame(elements(d), elements(clone)); >> + assertTrue(d.isEmpty() || elements(d) != elements(clone)); >> assertEquals(d, clone); >> } >> } >> >> Alex >> >>