Hi,

I have some questions and proposals around the JsArray-classes because
they are handy when working with JSNI but I believe they could be
improved a bit.

a) Why are not all native methods provided through the wrapper.
Missing methods are:
* concat
* pop
* reverse
* slice
* splice
* sort

b) It would be nice if one could use them in a for-loop but because an
interface can only be implemented by one native class it can't
implement Iterable directly but provide a method like iterable().

An implementation for JsArrayString would look like this:

### Eclipse Workspace Patch 1.0
#P gwt-toolkit
Index: user/src/com/google/gwt/core/client/JsArrayString.java
===================================================================
--- user/src/com/google/gwt/core/client/JsArrayString.java      (revision
7519)
+++ user/src/com/google/gwt/core/client/JsArrayString.java      (working
copy)
@@ -15,6 +15,11 @@
  */
 package com.google.gwt.core.client;

+import java.util.Iterator;
+
+import com.google.gwt.emul.java.util.AbstractList;
+import com.google.gwt.emul.java.util.NoSuchElementException;
+
 /**
  * A simple wrapper around a homogeneous native array of string
values.
  *
@@ -116,4 +121,92 @@
   public final native void unshift(String value) /*-{
     this.unshift(value);
   }-*/;
+
+  /**
+   * Concatenate the receiver and parameter arrays and returns the
resulting array
+   *
+   * @param concat the array to append
+   * @return the concatenated array
+   */
+  public final native JsArrayString concat(JsArrayString concat) /*-{
+       return this.concat(concat);
+  }-*/;
+
+  /**
+   * Removes the last element in the array
+   *
+   * @return the remove value
+   */
+  public final native String pop() /*-{
+       return this.pop();
+  }-*/;
+
+  /**
+   * Extracts items starting from the given index to the end of the
array
+   *
+   * @param startIndex the start index
+   * @return the resulting array
+   */
+  public final native JsArrayString slice(int startIndex) /*-{
+       return this.slice(startIndex);
+  }-*/;
+
+  /**
+   * Extracts items starting from the startIndex (inclusive) to the
endIndex (exclusive)
+   *
+   * @param startIndex the startIndex
+   * @param endIndex the endIndex (negative values also allowed)
+   * @return the resulting array
+   */
+  public final native void slice(int startIndex, int endIndex) /*-{
+       this.slice(startIndex, endIndex);
+  }-*/;
+
+  /**
+   * Removes a given amount of items from the array starting with the
given index
+   *
+   * @param startIndex the start index
+   * @param removedItems the number of items to remove
+   */
+  public final native void splice(int startIndex, int removedItems) /
*-{
+         this.splice(startIndex,removedItems);
+  }-*/;
+
+  public final Iterable<String> iterable() {
+         return new Iterable<String>() {
+
+               public Iterator<String> iterator() {
+                       return new IteratorImpl();
+               }
+       };
+  }
+
+  private class IteratorImpl implements Iterator<String> {
+           /*
+            * i is the index of the item that will be returned on the next
call to
+            * next() last is the index of the item that was returned on the
previous
+            * call to next() or previous (for ListIterator), -1 if no such
item exists.
+            */
+           int i = 0, last = -1;
+
+           public boolean hasNext() {
+             return i < JsArrayString.this.length();
+           }
+
+           public String next() {
+             if (!hasNext()) {
+               throw new NoSuchElementException();
+             }
+             return JsArrayString.this.get(last = i++);
+           }
+
+           public void remove() {
+             if (last < 0) {
+               throw new IllegalStateException();
+             }
+             JsArrayString.this.splice(last, 1);
+             i = last;
+             last = -1;
+           }
+         }
 }

I don't know if it is a good idea to implement the iterable directly
and whether it's making sense for the 2 JsArray with primitive values
(Integer,Number) but that's why I'm posting here before filing an
enhancement request.

Tom

-- 
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to