/* * 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 java.util.Set; /** * A record made of some {@link Field}s with values. * Field values are read and set with the {@code get(field}} and {@code set(field, value)} methods, respectively. * * @author pron */ public interface Record<R> { /** * Returns the record's {@link RecordType}. * * @return the record's {@link RecordType} */ SealedRecordType<R> type(); /** * Returns the record's fields. * * @return the record's fields. */ Set<Field<? super R, ?>> fields(); /** * Serializes the record out to an {@link java.io.ObjectOutput} * * @param out * @throws java.io.IOException */ void write(java.io.ObjectOutput out) throws java.io.IOException; /** * Reads the record's contents from a serialized form in an {@link java.io.ObjectInput}. * * @param in * @throws java.io.IOException */ void read(java.io.ObjectInput in) throws java.io.IOException; /** * Reads the record's contents from a serialized form in an {@link java.io.ObjectInput}, only reading the first {@code numFields} * fields from the stream. This is useful when dealing with reading a serialized form of a different version of the record, which has * fields added. * * @param in * @param numFields the number of fields to read from the stream * @throws java.io.IOException */ void read(java.io.ObjectInput in, int numFields) throws java.io.IOException; <V> V get(Field<? super R, V> field); <V> void set(Field<? super R, V> field, V value); <V> V get(Field.ArrayField<? super R, V> field, int index); <V> void set(Field.ArrayField<? super R, V> field, int index, V value); <V> void get(Field.ArrayField<? super R, V> field, V[] target, int offset); <V> void set(Field.ArrayField<? super R, V> field, V[] source, int offset); <S, V> void set(Field.ArrayField<? super R, V> field, Record<S> source, Field.ArrayField<? super S, V> sourceField); boolean get(Field.BooleanField<? super R> field); void set(Field.BooleanField<? super R> field, boolean value); byte get(Field.ByteField<? super R> field); void set(Field.ByteField<? super R> field, byte value); short get(Field.ShortField<? super R> field); void set(Field.ShortField<? super R> field, short value); int get(Field.IntField<? super R> field); void set(Field.IntField<? super R> field, int value); long get(Field.LongField<? super R> field); void set(Field.LongField<? super R> field, long value); float get(Field.FloatField<? super R> field); void set(Field.FloatField<? super R> field, float value); double get(Field.DoubleField<? super R> field); void set(Field.DoubleField<? super R> field, double value); char get(Field.CharField<? super R> field); void set(Field.CharField<? super R> field, char value); <V> V get(Field.ObjectField<? super R, V> field); <V> void set(Field.ObjectField<? super R, V> field, V value); boolean get(Field.BooleanArrayField<? super R> field, int index); void set(Field.BooleanArrayField<? super R> field, int index, boolean value); void get(Field.BooleanArrayField<? super R> field, boolean[] target, int offset); void set(Field.BooleanArrayField<? super R> field, boolean[] source, int offset); <S> void set(Field.BooleanArrayField<? super R> field, Record<S> source, Field.BooleanArrayField<? super S> sourceField); byte get(Field.ByteArrayField<? super R> field, int index); void set(Field.ByteArrayField<? super R> field, int index, byte value); void get(Field.ByteArrayField<? super R> field, byte[] target, int offset); void set(Field.ByteArrayField<? super R> field, byte[] source, int offset); <S> void set(Field.ByteArrayField<? super R> field, Record<S> source, Field.ByteArrayField<? super S> sourceField); short get(Field.ShortArrayField<? super R> field, int index); void set(Field.ShortArrayField<? super R> field, int index, short value); void get(Field.ShortArrayField<? super R> field, short[] target, int offset); void set(Field.ShortArrayField<? super R> field, short[] source, int offset); <S> void set(Field.ShortArrayField<? super R> field, Record<S> source, Field.ShortArrayField<? super S> sourceField); int get(Field.IntArrayField<? super R> field, int index); void set(Field.IntArrayField<? super R> field, int index, int value); void get(Field.IntArrayField<? super R> field, int[] target, int offset); void set(Field.IntArrayField<? super R> field, int[] source, int offset); <S> void set(Field.IntArrayField<? super R> field, Record<S> source, Field.IntArrayField<? super S> sourceField); long get(Field.LongArrayField<? super R> field, int index); void set(Field.LongArrayField<? super R> field, int index, long value); void get(Field.LongArrayField<? super R> field, long[] target, int offset); void set(Field.LongArrayField<? super R> field, long[] source, int offset); <S> void set(Field.LongArrayField<? super R> field, Record<S> source, Field.LongArrayField<? super S> sourceField); float get(Field.FloatArrayField<? super R> field, int index); void set(Field.FloatArrayField<? super R> field, int index, float value); void get(Field.FloatArrayField<? super R> field, float[] target, int offset); void set(Field.FloatArrayField<? super R> field, float[] source, int offset); <S> void set(Field.FloatArrayField<? super R> field, Record<S> source, Field.FloatArrayField<? super S> sourceField); double get(Field.DoubleArrayField<? super R> field, int index); void set(Field.DoubleArrayField<? super R> field, int index, double value); void get(Field.DoubleArrayField<? super R> field, double[] target, int offset); void set(Field.DoubleArrayField<? super R> field, double[] source, int offset); <S> void set(Field.DoubleArrayField<? super R> field, Record<S> source, Field.DoubleArrayField<? super S> sourceField); char get(Field.CharArrayField<? super R> field, int index); void set(Field.CharArrayField<? super R> field, int index, char value); void get(Field.CharArrayField<? super R> field, char[] target, int offset); void set(Field.CharArrayField<? super R> field, char[] source, int offset); <S> void set(Field.CharArrayField<? super R> field, Record<S> source, Field.CharArrayField<? super S> sourceField); <V> V get(Field.ObjectArrayField<? super R, V> field, int index); <V> void set(Field.ObjectArrayField<? super R, V> field, int index, V value); <V> void get(Field.ObjectArrayField<? super R, V> field, V[] target, int offset); <V> void set(Field.ObjectArrayField<? super R, V> field, V[] source, int offset); <S, V> void set(Field.ObjectArrayField<? super R, V> field, Record<S> source, Field.ObjectArrayField<? super S, V> sourceField); }