Sottoclassi indirette conosciute Bfloat16Layout , BoolLayout , BooleanDataLayout <S estende DataBuffer <?>>, ByteDataLayout <S estende DataBuffer <?>>, DoubleDataLayout <S estende DataBuffer <?>>, Float16Layout , FloatDataLayout <S estende DataBuffer <?>>, IntDataLayout <S estende DataBuffer <?>>, LongDataLayout <S estende DataBuffer <?>>, ShortDataLayout <S estende DataBuffer <?>>, StringLayout |
Converte i dati archiviati in un buffer in un determinato tipo.
Le istanze DataLayout
vengono utilizzate per definire un formato personalizzato per l'archiviazione e la lettura dei dati di un DataBuffer
. Forniscono uno strato di segregazione tra il tipo di dati archiviati nel buffer (il tipo di buffer ) e il tipo di dati manipolati dall'utente finale (il tipo di utente ).
Poiché i metodi di conversione vengono invocati per ogni valore che viene scritto o letto, lavorare con i layout dei dati può avere un impatto negativo sulle prestazioni, quindi l'utilizzo diretto dei tipi primitivi dovrebbe essere preferito quando possibile.
Si consiglia inoltre di implementare layout di dati immutabili in modo che possano essere riapplicati a più buffer senza riallocare una nuova istanza per ciascuno di essi. Per esempio:
class BigIntegerBufferAllocator { public DataBuffer<BigInteger> allocate(long size) { return LAYOUT.applyTo(DataBuffers.ofLongs(size * LAYOUT.scale())); // scale is 1 by default } private static final DataLayout<LongDataBuffer, BigInteger> LAYOUT = new DataLayout<LongDataBuffer, BigInteger>() { @Override public void writeObject(LongDataBuffer buffer, BigInteger value, long index) { buffer.setLong(value.longValue(), index); } @Override public BigInteger readObject(LongDataBuffer buffer, long index) { return BigInteger.valueOf(buffer.getLong(index)); } }; }
Metodi pubblici
buffer dati astratto <T> | applicaA (buffer S) Applica questo layout al buffer fornito. |
astratto T | readObject (buffer S, indice lungo) Legge n = scale() valori dal buffer in corrispondenza dell'indice specificato e li restituisce come un singolo valore nel tipo utente. |
astratto int | scala () Indica il numero di valori buffer necessari per rappresentare un singolo valore utente, il valore predefinito è 1. |
vuoto astratto | writeObject (buffer S, valore T, indice lungo) Scrive un valore utente nel buffer in corrispondenza dell'indice specificato dopo averlo convertito nel tipo di buffer. |
Metodi pubblici
public abstract DataBuffer <T> applyTo (buffer S)
Applica questo layout al buffer fornito.
L'istanza DataBuffer
restituita è semplicemente un wrapper per il buffer originale e non dispone di un proprio spazio di archiviazione di backup.
Parametri
respingente | il buffer di destinazione a cui applicare questo layout |
---|
Ritorni
- un buffer con questo layout
public abstract T readObject (buffer S, indice lungo)
Legge n = scale()
valori dal buffer in corrispondenza dell'indice specificato e li restituisce come un singolo valore nel tipo utente.
È responsabilità degli implementatori di questa interfaccia leggere il valore da convertire dal buffer fornito, utilizzando il metodo più appropriato. Ad esempio, per un layout che converte un singolo long
in un BigInteger
,
@Override public BigInteger readObject(LongDataBuffer buffer, long index) { return BigInteger.valueOf(buffer.getLong(index)); }Se un singolo valore utente viene scalato su più valori del buffer,
index
indica la posizione iniziale della sequenza da leggere dal buffer. Parametri
respingente | il buffer da cui leggere |
---|---|
indice | posizione del buffer da leggere nel buffer |
Ritorni
- il valore convertito
public abstract int scala ()
Indica il numero di valori buffer necessari per rappresentare un singolo valore utente, il valore predefinito è 1.
La scala deve essere positiva e deve essere un numero intero, il che significa che un singolo valore di buffer in un buffer non può essere utilizzato per rappresentare più di un valore utente.
public abstract void writeObject (buffer S, valore T, indice lungo)
Scrive un valore utente nel buffer in corrispondenza dell'indice specificato dopo averlo convertito nel tipo di buffer.
È responsabilità degli implementatori di questa interfaccia scrivere il valore convertito nel buffer specificato prima che questa chiamata ritorni, utilizzando il metodo più appropriato. Ad esempio, per un layout che converte un BigInteger
in un singolo long
,
@Override public void writeObject(LongDataBuffer buffer, BigInteger value, long index) { buffer.setLong(value.longValue(), index); }Se un singolo valore utente viene scalato su più valori del buffer,
index
indica la posizione iniziale della sequenza da scrivere nel buffer. Parametri
respingente | il buffer su cui scrivere |
---|---|
valore | il valore nel tipo utente da convertire e scrivere |
indice | indice nel buffer in cui deve essere scritto il valore convertito |