/*
* Copyright (c) 2013-2014, Parallel Universe Software Co. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 3.0
* as published by the Free Software Foundation.
*/
package co.paralleluniverse.data.record;
import co.paralleluniverse.common.util.DelegatingEquals;
import co.paralleluniverse.data.record.Field.ArrayField;
import co.paralleluniverse.data.record.Field.BooleanArrayField;
import co.paralleluniverse.data.record.Field.BooleanField;
import co.paralleluniverse.data.record.Field.ByteArrayField;
import co.paralleluniverse.data.record.Field.ByteField;
import co.paralleluniverse.data.record.Field.CharArrayField;
import co.paralleluniverse.data.record.Field.CharField;
import co.paralleluniverse.data.record.Field.DoubleArrayField;
import co.paralleluniverse.data.record.Field.DoubleField;
import co.paralleluniverse.data.record.Field.FloatArrayField;
import co.paralleluniverse.data.record.Field.FloatField;
import co.paralleluniverse.data.record.Field.IntArrayField;
import co.paralleluniverse.data.record.Field.IntField;
import co.paralleluniverse.data.record.Field.LongArrayField;
import co.paralleluniverse.data.record.Field.LongField;
import co.paralleluniverse.data.record.Field.ObjectArrayField;
import co.paralleluniverse.data.record.Field.ObjectField;
import co.paralleluniverse.data.record.Field.ShortArrayField;
import co.paralleluniverse.data.record.Field.ShortField;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Set;
/**
*
* @author pron
*/
final class RecordDelegate<R> implements Record<R>, DelegatingEquals {
private final Object owner;
private volatile Record<R> r;
public RecordDelegate(Object owner, Record<R> delegate) {
this.owner = owner;
this.r = delegate;
}
void setDelegate(Object owner, Record<R> delegate) {
if (this.owner == null || this.owner != owner)
throw new IllegalAccessError("Object " + owner + " is not this record's owner");
this.r = delegate;
}
Record<R> getDelegate(Object owner) {
if (this.owner == null || this.owner != owner)
throw new IllegalAccessError("Object " + owner + " is not this record's owner");
return r;
}
@Override
public SealedRecordType<R> type() {
return r.type();
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if(obj == this)
return true;
if(r == null)
return false;
return obj instanceof DelegatingEquals ? obj.equals(r) : r.equals(obj);
}
@Override
public String toString() {
return r.toString();
}
@Override
public Set<Field<? super R, ?>> fields() {
return r.fields();
}
@Override
public void write(ObjectOutput out) throws IOException {
r.write(out);
}
@Override
public void read(ObjectInput in) throws IOException {
r.read(in);
}
@Override
public void read(ObjectInput in, int numFields) throws IOException {
r.read(in, numFields);
}
@Override
public boolean get(BooleanField<? super R> field) {
return r.get(field);
}
@Override
public void set(BooleanField<? super R> field, boolean value) {
r.set(field, value);
}
@Override
public byte get(ByteField<? super R> field) {
return r.get(field);
}
@Override
public void set(ByteField<? super R> field, byte value) {
r.set(field, value);
}
@Override
public short get(ShortField<? super R> field) {
return r.get(field);
}
@Override
public void set(ShortField<? super R> field, short value) {
r.set(field, value);
}
@Override
public int get(IntField<? super R> field) {
return r.get(field);
}
@Override
public void set(IntField<? super R> field, int value) {
r.set(field, value);
}
@Override
public long get(LongField<? super R> field) {
return r.get(field);
}
@Override
public void set(LongField<? super R> field, long value) {
r.set(field, value);
}
@Override
public float get(FloatField<? super R> field) {
return r.get(field);
}
@Override
public void set(FloatField<? super R> field, float value) {
r.set(field, value);
}
@Override
public double get(DoubleField<? super R> field) {
return r.get(field);
}
@Override
public void set(DoubleField<? super R> field, double value) {
r.set(field, value);
}
@Override
public char get(CharField<? super R> field) {
return r.get(field);
}
@Override
public void set(CharField<? super R> field, char value) {
r.set(field, value);
}
@Override
public <V> V get(ObjectField<? super R, V> field) {
return r.get(field);
}
@Override
public <V> void set(ObjectField<? super R, V> field, V value) {
r.set(field, value);
}
@Override
public boolean get(BooleanArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(BooleanArrayField<? super R> field, int index, boolean value) {
r.set(field, index, value);
}
@Override
public void get(BooleanArrayField<? super R> field, boolean[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(BooleanArrayField<? super R> field, boolean[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(BooleanArrayField<? super R> field, Record<S> source, BooleanArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public byte get(ByteArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(ByteArrayField<? super R> field, int index, byte value) {
r.set(field, index, value);
}
@Override
public void get(ByteArrayField<? super R> field, byte[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(ByteArrayField<? super R> field, byte[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(ByteArrayField<? super R> field, Record<S> source, ByteArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public short get(ShortArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(ShortArrayField<? super R> field, int index, short value) {
r.set(field, index, value);
}
@Override
public void get(ShortArrayField<? super R> field, short[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(ShortArrayField<? super R> field, short[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(ShortArrayField<? super R> field, Record<S> source, ShortArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public int get(IntArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(IntArrayField<? super R> field, int index, int value) {
r.set(field, index, value);
}
@Override
public void get(IntArrayField<? super R> field, int[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(IntArrayField<? super R> field, int[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(IntArrayField<? super R> field, Record<S> source, IntArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public long get(LongArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(LongArrayField<? super R> field, int index, long value) {
r.set(field, index, value);
}
@Override
public void get(LongArrayField<? super R> field, long[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(LongArrayField<? super R> field, long[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(LongArrayField<? super R> field, Record<S> source, LongArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public float get(FloatArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(FloatArrayField<? super R> field, int index, float value) {
r.set(field, index, value);
}
@Override
public void get(FloatArrayField<? super R> field, float[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(FloatArrayField<? super R> field, float[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(FloatArrayField<? super R> field, Record<S> source, FloatArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public double get(DoubleArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(DoubleArrayField<? super R> field, int index, double value) {
r.set(field, index, value);
}
@Override
public void get(DoubleArrayField<? super R> field, double[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(DoubleArrayField<? super R> field, double[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(DoubleArrayField<? super R> field, Record<S> source, DoubleArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public char get(CharArrayField<? super R> field, int index) {
return r.get(field, index);
}
@Override
public void set(CharArrayField<? super R> field, int index, char value) {
r.set(field, index, value);
}
@Override
public void get(CharArrayField<? super R> field, char[] target, int offset) {
r.get(field, target, offset);
}
@Override
public void set(CharArrayField<? super R> field, char[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S> void set(CharArrayField<? super R> field, Record<S> source, CharArrayField<? super S> sourceField) {
r.set(field, source, sourceField);
}
@Override
public <V> V get(ObjectArrayField<? super R, V> field, int index) {
return r.get(field, index);
}
@Override
public <V> void set(ObjectArrayField<? super R, V> field, int index, V value) {
r.set(field, index, value);
}
@Override
public <V> void get(ObjectArrayField<? super R, V> field, V[] target, int offset) {
r.get(field, target, offset);
}
@Override
public <V> void set(ObjectArrayField<? super R, V> field, V[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S, V> void set(ObjectArrayField<? super R, V> field, Record<S> source, ObjectArrayField<? super S, V> sourceField) {
r.set(field, source, sourceField);
}
@Override
public <V> V get(Field<? super R, V> field) {
return r.get(field);
}
@Override
public <V> void set(Field<? super R, V> field, V value) {
r.set(field, value);
}
@Override
public <V> V get(ArrayField<? super R, V> field, int index) {
return r.get(field, index);
}
@Override
public <V> void set(ArrayField<? super R, V> field, int index, V value) {
r.set(field, index, value);
}
@Override
public <V> void get(ArrayField<? super R, V> field, V[] target, int offset) {
r.get(field, target, offset);
}
@Override
public <V> void set(ArrayField<? super R, V> field, V[] source, int offset) {
r.set(field, source, offset);
}
@Override
public <S, V> void set(ArrayField<? super R, V> field, Record<S> source, ArrayField<? super S, V> sourceField) {
r.set(field, source, sourceField);
}
}