/*
* $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");
}
}
|