arrayvalue.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,663 行 · 第 1/3 页

JAVA
1,663
字号
    printDepth(out, 2 * depth);    out.print("}");  }  protected void varDumpEntry(Env env,                              WriteStream out,                              int depth,                              IdentityHashMap<Value, String> valueSet,                              Map.Entry<Value, Value> mapEntry)    throws IOException  {    ArrayValue.Entry entry = (ArrayValue.Entry) mapEntry;    entry.varDumpImpl(env, out, depth, valueSet);  }    @Override  protected void printRImpl(Env env,                            WriteStream out,                            int depth,                            IdentityHashMap<Value, String> valueSet)    throws IOException  {    out.println("Array");    printDepth(out, 8 * depth);    out.println("(");        for (Map.Entry<Value,Value> mapEntry : entrySet()) {      ArrayValue.Entry entry = (ArrayValue.Entry) mapEntry;            entry.printRImpl(env, out, depth, valueSet);    }    printDepth(out, 8 * depth);    out.println(")");  }    protected void printREntry(Env env,                             WriteStream out,                             int depth,                             IdentityHashMap<Value, String> valueSet,                             Map.Entry<Value, Value> mapEntry)    throws IOException  {    ArrayValue.Entry entry = (ArrayValue.Entry) mapEntry;    entry.printRImpl(env, out, depth, valueSet);  }  public static class Entry    implements Map.Entry<Value,Value>, Serializable    {    final Value _key;    Value _value;    Entry _prev;    Entry _next;    Entry _prevHash;    Entry _nextHash;    int _index;    public Entry(Value key)    {      _key = key;      _value = NullValue.NULL;    }    public Entry(Value key, Value value)    {      _key = key;      _value = value;    }    public Entry getNext()    {      return _next;    }    public Value getRawValue()    {      return _value;    }    public Value getValue()    {      return _value.toValue();    }    public Value getKey()    {      return _key;    }    public Value toValue()    {      // The value may be a var      // XXX: need test      return _value.toValue();    }    /**     * Argument used/declared as a ref.     */    public Var toRefVar()    {      // php/376a      Value val = _value;      if (val instanceof Var)        return (Var) val;      else {        Var var = new Var(val);        _value = var;        return var;      }    }    /**     * Converts to an argument value.     */    public Value toArgValue()    {      return _value.toValue();    }    public Value setValue(Value value)    {      Value oldValue = _value;      _value = value;      return oldValue;    }    /**     * Converts to a variable reference (for function  arguments)     */    public Value toRef()    {      Value value = _value;      if (value instanceof Var)        return new RefVar((Var) value);      else {        _value = new Var(value);        return new RefVar((Var) _value);      }    }    /**     * Converts to a variable reference (for function  arguments)     */    public Value toArgRef()    {      Value value = _value;      if (value instanceof Var)        return new RefVar((Var) value);      else {        _value = new Var(_value);        return new RefVar((Var) _value);      }    }    public Value toArg()    {      // php/39a4      Value value = _value;      // php/39aj      if (value instanceof Var)        return value;      else {        _value = new Var(value);        return _value;      }    }    public void varDumpImpl(Env env,                            WriteStream out,                            int depth,                            IdentityHashMap<Value, String> valueSet)      throws IOException    {      printDepth(out, 2 * depth);      out.print("[");      if (_key instanceof StringValue)        out.print("\"" + _key + "\"");      else        out.print(_key);      out.println("]=>");      printDepth(out, 2 * depth);      _value.varDump(env, out, depth, valueSet);    }    protected void printRImpl(Env env,                              WriteStream out,                              int depth,                              IdentityHashMap<Value, String> valueSet)      throws IOException    {      printDepth(out, 8 * depth);      out.print("    [");      out.print(_key);      out.print("] => ");      if (_value != null)        _value.printR(env, out, depth + 1, valueSet);      out.println();    }    private void printDepth(WriteStream out, int depth)      throws java.io.IOException    {      for (int i = depth; i > 0; i--)        out.print(' ');    }    @Override    public String toString()    {      return "ArrayValue.Entry[" + getKey() + "]";    }  }  /**   * Returns the field keys.   */  public Value []getKeyArray(Env env)  {    int len = getSize();    Value []keys = new Value[len];    Iterator<Value> iter = getKeyIterator(env);        for (int i = 0; i < len; i++) {      keys[i] = iter.next();    }        return keys;  }    /**   * Returns the field values.   */  public Value []getValueArray(Env env)  {    int len = getSize();    Value []values = new Value[len];    Iterator<Value> iter = getValueIterator(env);        for (int i = 0; i < len; i++) {      values[i] = iter.next();    }        return values;  }    /**   * Takes the values of this array and puts them in a java array   */  public Value[] valuesToArray()  {    Value[] values = new Value[getSize()];    int i = 0;    for (Entry ptr = getHead(); ptr != null; ptr = ptr.getNext()) {      values[i++] = ptr.getValue();    }    return values;  }  /**   * Takes the values of this array, unmarshals them to objects of type   * <i>elementType</i>, and puts them in a java array.   */  @Override  public Object valuesToArray(Env env, Class elementType)  {    int size = getSize();    Object array = Array.newInstance(elementType, size);    MarshalFactory factory = env.getModuleContext().getMarshalFactory();    Marshal elementMarshal = factory.create(elementType);    int i = 0;    for (Entry ptr = getHead(); ptr != null; ptr = ptr.getNext()) {      Array.set(array, i++, elementMarshal.marshal(env,                                                   ptr.getValue(),                                                   elementType));    }    return array;  }  public class EntrySet extends AbstractSet<Map.Entry<Value,Value>> {    EntrySet()    {    }    @Override    public int size()    {      return ArrayValue.this.getSize();    }    @Override    public Iterator<Map.Entry<Value,Value>> iterator()    {      return new EntryIterator(getHead());    }  }  public class KeySet extends AbstractSet<Value> {    KeySet()    {    }    @Override    public int size()    {      return ArrayValue.this.getSize();    }    @Override    public Iterator<Value> iterator()    {      return new KeyIterator(getHead());    }  }  public class ValueCollection extends AbstractCollection<Value> {    ValueCollection()    {    }    @Override    public int size()    {      return ArrayValue.this.getSize();    }    @Override    public Iterator<Value> iterator()    {      return new ValueIterator(getHead());    }  }  public static class EntryIterator    implements Iterator<Map.Entry<Value,Value>> {    private Entry _current;    EntryIterator(Entry head)    {      _current = head;    }    public boolean hasNext()    {      return _current != null;    }    public Map.Entry<Value,Value> next()    {      if (_current != null) {        Map.Entry<Value,Value> next = _current;        _current = _current._next;        return next;      }      else        return null;    }    public void remove()    {      throw new UnsupportedOperationException();    }  }  public static class KeyIterator    implements Iterator<Value> {    private Entry _current;    KeyIterator(Entry head)    {      _current = head;    }    public boolean hasNext()    {      return _current != null;    }    public Value next()    {      if (_current != null) {        Value next = _current.getKey();        _current = _current._next;        return next;      }      else        return null;    }    public void remove()    {      throw new UnsupportedOperationException();    }  }  public static class ValueIterator    implements Iterator<Value> {    private Entry _current;    ValueIterator(Entry head)    {      _current = head;    }    public boolean hasNext()    {      return _current != null;    }    public Value next()    {      if (_current != null) {        Value next = _current.getValue();        _current = _current._next;        return next;      }      else        return null;    }    public void remove()    {      throw new UnsupportedOperationException();    }  }  public static class ValueComparator    implements Comparator<Map.Entry<Value,Value>>  {    public static final ValueComparator CMP = new ValueComparator();        private ValueComparator()    {    }        public int compare(Map.Entry<Value,Value> aEntry,                       Map.Entry<Value,Value> bEntry)    {      try {        Value aValue = aEntry.getValue();        Value bValue = bEntry.getValue();        if (aValue.eq(bValue))          return 0;        else if (aValue.lt(bValue))          return -1;        else          return 1;      } catch (Throwable e) {        throw new RuntimeException(e);      }    }  }  public static class KeyComparator    implements Comparator<Map.Entry<Value,Value>>  {    public static final KeyComparator CMP = new KeyComparator();        private KeyComparator()    {    }        public int compare(Map.Entry<Value,Value> aEntry,                       Map.Entry<Value,Value> bEntry)    {      try {        Value aKey = aEntry.getKey();        Value bKey = bEntry.getKey();        if (aKey.eq(bKey))          return 0;        else if (aKey.lt(bKey))          return -1;        else          return 1;      } catch (Throwable e) {        throw new RuntimeException(e);      }    }  }  public static abstract class AbstractGet {    public abstract Value get(Map.Entry<Value, Value> entry);  }  public static class GetKey extends AbstractGet  {    public static final GetKey GET = new GetKey();        private GetKey()    {    }    @Override    public Value get(Map.Entry<Value, Value> entry)    {      return entry.getKey();    }  }  public static class GetValue extends AbstractGet {    public static final GetValue GET = new GetValue();        private GetValue()    {    }    @Override    public Value get(Map.Entry<Value, Value> entry)    {      return entry.getValue();    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?