AnyTuple.java :  » Web-Framework » anvil » anvil » core » Java Open Source

Java Open Source » Web Framework » anvil 
anvil » anvil » core » AnyTuple.java
/*
 * $Id: AnyTuple.java,v 1.11 2002/09/16 08:05:02 jkl Exp $
 *
 * Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
 *
 * Use is subject to license terms, as defined in
 * Anvil Sofware License, Version 1.1. See LICENSE 
 * file, or http://njet.org/license-1.1.txt
 */
package anvil.core;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Comparator;
import anvil.core.runtime.AnyFunction;
import anvil.script.Context;
import anvil.script.Function;
import anvil.java.util.BindingEnumeration;

/// @class tuple
/// Tuple is an immutable sequence of values.
///

/**
 * class AnyTuple
 *
 * @author: Jani Lehtimki
 */
public final class AnyTuple extends AnyList
{

  /// @constructor tuple
  /// Constructs tuple. Same as builtin <code>(elements, ...)</code> constructor.
  /// @synopsis tuple(object element, ...)
  public static final Any newInstance(Any[] list)
  {
    return new AnyTuple(list);
  }
  

  transient public static final anvil.script.compiler.NativeClass __class__ = 
    new anvil.script.compiler.NativeClass("tuple", AnyTuple.class, AnySequence.__class__,
    //DOC{{
    ""+
      " @class tuple\n" +
      " Tuple is an immutable sequence of values.\n" +
      "\n" +
      " @constructor tuple\n" +
      " Constructs tuple. Same as builtin <code>(elements, ...)</code> constructor.\n" +
      " @synopsis tuple(object element, ...)\n" 
    //}}DOC
    );



  public AnyTuple()
  {
    super();
  }


  public AnyTuple(Any[] array)
  {
    super(array);
  }


  public AnySequence getSlice(int start, int length)
  {
    Any[] b = new Any[length];
    System.arraycopy(_array, start, b, 0, length);
    return new AnyTuple(b);
  }

  
  public AnySequence createSequence(Any element)
  {
    return new AnyTuple(new Any[] { element });
  }
  

  public AnySequence createEmptySequence()
  {
    return new AnyTuple(ARRAY0);
  }  
  

  public AnySequence clear()
  {
    return new AnyTuple(new Any[0]);
  }
  

  public AnySequence setSize(int size)
  { 
    Any[] newarray = new Any[size];
    if (size > 0) {
      System.arraycopy(_array, 0, newarray, 0, size);
    }
    return new AnyTuple(newarray);
  }  
  
  
  public AnySequence deleteSlice(int start, int length)
  {
    Any[] array = _array;
    int size = _size;
    Any[] newarray = new Any[size - length];
    if (start > 0) {
      System.arraycopy(array, 0, newarray, 0, start);
    }
    if (start+length < size) {
      System.arraycopy(array, start+length, newarray, start, size-(start+length));
    }
    return new AnyTuple(newarray);
  }

  

  public AnySequence setSlice(int start, int length, Any element)
  {
    Any[] array = _array;
    int size = _size;
    Any[] newarray = new Any[ size - length + 1];
    if (start > 0) {
      System.arraycopy(array, 0, newarray, 0, start);
    }
    newarray[start] = element;
    if (start+length < size) {
      System.arraycopy(array, start+length, newarray, 
        start+1, size-(start+length));
    }
    return new AnyTuple(newarray);   
  }
  
  
  public AnySequence setSlice(int start, int length, AnySequence sequence)
  {
    Any[] seq = sequence.toList();
    int seq_length = sequence.getSize();
    Any[] array = _array;
    int size = _size;
    Any[] newarray = new Any[size - length + seq_length];
    if (start > 0) {
      System.arraycopy(array, 0, newarray, 0, start);
    }
    if (seq_length > 0) {
      System.arraycopy(seq, 0, newarray, start, seq_length);
    }
    if (start+length < size) {
      System.arraycopy(array, start+length, newarray, 
        start+seq_length, size-(start+length));
    }
    return new AnyTuple(newarray);
  }


  public AnySequence append(AnySequence sequence)
  {
    Any[] seq = sequence.toList();
    int seq_length = sequence.getSize();
    Any[] array = _array;
    int size = _size;
    Any[] newarray = new Any[size + seq_length];
    System.arraycopy(array, 0, newarray, 0, size);
    System.arraycopy(seq, 0, newarray, size, seq_length);
    return new AnyTuple(newarray);
  }

  
  public AnySequence append(Any element)
  {
    Any[] array = _array;
    int size = _size;
    Any[] newarray = new Any[size + 1];
    System.arraycopy(array, 0, newarray, 0, size);
    newarray[size] = element;
    return new AnyTuple(newarray);
  }
    


  public AnySequence crop(int start, int length)
  {
    Any[] newarray = new Any[length];
    if (length > 0) {
      System.arraycopy(_array, start, newarray, 0, length);
    }
    return new AnyTuple(newarray);
  }
    
    

  public AnySequence reverse(int start, int length)
  {
    Any[] newarray = new Any[length];
    for(int i=0; i<length; i++) {
      newarray[length - i - 1] = _array[start + i];
    }
    return new AnyTuple(newarray);
  }      
  
  

  public AnySequence sort(int start, int length, Comparator comparator)
  {
    Any[] newarray = new Any[_size];
    System.arraycopy(_array, 0, newarray, 0, _size);
    if (comparator != null) {
      java.util.Arrays.sort(newarray, start, start+length, comparator);
    } else {
      java.util.Arrays.sort(newarray, start, start+length);
    }
    return new AnyTuple(newarray);
  }
    

  public AnySequence swap(int index1, int index2)
  {
    Any[] newarray = new Any[_size];
    System.arraycopy(_array, 0, newarray, 0, _size);
    Any any = newarray[index1];
    newarray[index1] = newarray[index2];
    newarray[index2] = any;
    return new AnyTuple(newarray);
  }  
  
  

  public AnySequence fill(Any fill, int start, int length)
  {
    Any[] newarray = new Any[_size];
    System.arraycopy(_array, 0, newarray, 0, _size);
    java.util.Arrays.fill(newarray, start, start+length, fill);
    return new AnyTuple(newarray);
  }
  
  
  public anvil.script.ClassType classOf() {
    return __class__;
  }
  

  public int typeOf()
  {
    return IS_TUPLE;
  }

  
  public boolean isMutable()
  {
    Any[] array = _array;
    int n = _size;
    for(int i=0; i<n; i++) {
      if (array[i].isMutable()) {
        return true;
      }
    }
    return false;
  }  
  

  public boolean isTuple()
  {
    return true;
  }


  public int hashCode() 
  {
    Any[] array = _array;
    int n = _size;
    int h = 0;
    for(int i=0; i<n; i++) {
      h += (i+1) * array[i].hashCode();
    }
    return h;
  }  


  public String toString()
  {
    StringBuffer buffer = new StringBuffer();
    buffer.append('(');
    int n = _size;
    for(int i=0; i<n; i++) {
      if (i>0) {
        buffer.append(',');
        buffer.append(' ');
      }
      buffer.append(_array[i].toString());
    }
    buffer.append(')');
    return buffer.toString();
  }


  public Writer toAnvil(Writer writer) throws IOException
  {
    Any[] array = _array;
    final int n = _size;
    writer.write("(");
    for(int i=0; i<n; i++) {
      if (i>0) {
        writer.write(',');
        writer.write(' ');
      }
      array[i].toAnvil(writer);
    }
    writer.write(')');
    return writer;
  }
  

  public Writer toJava(Writer writer) throws IOException
  {
    Any[] array = _array;
    final int n = _size;
    writer.write("new anvil.core.AnyTuple(new Any[]{");
    for(int i=0; i<n; i++) {
      if (i>0) {
        writer.write(',');
        writer.write(' ');
      }
      array[i].toJava(writer);
    }
    writer.write('}');
    writer.write(')');
    return writer;
  }  
  
  
  public anvil.codec.Code toCode(anvil.codec.Code code)
  {
    anvil.codec.ConstantPool pool = code.getPool();
    int clazz = pool.addClass("anvil/core/AnyTuple");
    code.anew(clazz);
    code.dup();
    Any[] array = _array;
    final int n = _size;
    code.iconst(n);
    code.anewarray(pool.addClass("anvil/core/Any"));
    for(int i=0; i<n; i++) {
      code.dup();
      code.iconst(i);
      _array[i].toCode(code);
      code.aastore();
    }
    code.invokespecial(pool.addMethodRef(clazz, "<init>", "([Lanvil/core/Any;)V"));
    return code;
  }  
  
  
    
  public Object clone()
  {
    return this;
  }
  
  
  public Any copy()
  {
    int length = _size;
    if (length == 0) {
      return this;
    }
    Any[] array = new Any[length];
    for(int i=0; i<length; i++) {
      array[i] = _array[i].copy();
    }
    return new AnyTuple(array);
  }


  public void serialize(Serializer serializer) throws IOException 
  {
    if (serializer.register(this)) {
      return;
    }
    Any[] array = _array;
    final int n = _size;
    serializer.write('l');
    serializer.write(n);
    serializer.write(':');
    for(int i=0; i<n; i++) {
      _array[i].serialize(serializer);
    }
  }


  public static AnyList unserialize(Unserializer unserializer) 
      throws UnserializationException
  {
    int length = (int)unserializer.getLong();
    if (length < 0) {
      throw new UnserializationException();
    }
    AnyTuple list = new AnyTuple();
    unserializer.register(list);
    if (length > 0) {
      Any[] array = new Any[length];
      for(int i=0; i<length; i++) {
        array[i] = unserializer.unserialize();
      }
      list._array = array;
      list._size = length;
    }
    return list;
  }


  public boolean deleteReference(Context context, Any index)
  {
    throw context.ReferenceError("Tuple is immutable");
  }
  

  public Any setReference(Context context, Any index, Any value)
  {
    throw context.ReferenceError("Tuple is immutable");
  }
  

  public Any setReference(Context context, Any value)
  {
    throw context.ReferenceError("Tuple is immutable");
  }


  public Any m_set(Context context)
  {
    throw context.TypeError("tuple is immutable");
  }
  
  

}


java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.