Switch class to streamer mapping to a Map. Whoa! I used a linked hash map to
preserve the registration order, in case that's significant. It would be nice if Guava had an ImmutableLinkedHashMap, but I don't see such a thing. Thanks to my newly added unit tests, I'm pretty confident that I didn't just fuck something up. Woo. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6113 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -23,12 +23,14 @@ package com.threerings.io;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.RandomAccess;
|
import java.util.RandomAccess;
|
||||||
|
|
||||||
import java.io.EOFException;
|
import java.io.EOFException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Code to read and write basic object types (like arrays of primitives, {@link Integer} instances,
|
* Code to read and write basic object types (like arrays of primitives, {@link Integer} instances,
|
||||||
@@ -36,55 +38,30 @@ import com.google.common.collect.Lists;
|
|||||||
*/
|
*/
|
||||||
public class BasicStreamers
|
public class BasicStreamers
|
||||||
{
|
{
|
||||||
/** An array of types for all of the basic streamers. */
|
public static Map<Class<?>, Streamer> BSTREAMERS = Maps.newLinkedHashMap();
|
||||||
public static Class<?>[] BSTREAMER_TYPES = {
|
static {
|
||||||
Boolean.class,
|
BSTREAMERS.put(Boolean.class, new BooleanStreamer());
|
||||||
Byte.class,
|
BSTREAMERS.put(Byte.class, new ByteStreamer());
|
||||||
Short.class,
|
BSTREAMERS.put(Short.class, new ShortStreamer());
|
||||||
Character.class,
|
BSTREAMERS.put(Character.class, new CharacterStreamer());
|
||||||
Integer.class,
|
BSTREAMERS.put(Integer.class, new IntegerStreamer());
|
||||||
Long.class,
|
BSTREAMERS.put(Long.class, new LongStreamer());
|
||||||
Float.class,
|
BSTREAMERS.put(Float.class, new FloatStreamer());
|
||||||
Double.class,
|
BSTREAMERS.put(Double.class, new DoubleStreamer());
|
||||||
Class.class,
|
BSTREAMERS.put(Class.class, new ClassStreamer());
|
||||||
String.class,
|
BSTREAMERS.put(String.class, new StringStreamer());
|
||||||
boolean[].class,
|
BSTREAMERS.put(boolean[].class, new BooleanArrayStreamer());
|
||||||
byte[].class,
|
BSTREAMERS.put(byte[].class, new ByteArrayStreamer());
|
||||||
short[].class,
|
BSTREAMERS.put(short[].class, new ShortArrayStreamer());
|
||||||
char[].class,
|
BSTREAMERS.put(char[].class, new CharArrayStreamer());
|
||||||
int[].class,
|
BSTREAMERS.put(int[].class, new IntArrayStreamer());
|
||||||
long[].class,
|
BSTREAMERS.put(long[].class, new LongArrayStreamer());
|
||||||
float[].class,
|
BSTREAMERS.put(float[].class, new FloatArrayStreamer());
|
||||||
double[].class,
|
BSTREAMERS.put(double[].class, new DoubleArrayStreamer());
|
||||||
Object[].class,
|
BSTREAMERS.put(Object[].class, new ObjectArrayStreamer());
|
||||||
List.class,
|
BSTREAMERS.put(List.class, new ListStreamer());
|
||||||
ArrayList.class,
|
BSTREAMERS.put(ArrayList.class, new ListStreamer());
|
||||||
};
|
}
|
||||||
|
|
||||||
/** An array of instances of all of the basic streamers. */
|
|
||||||
public static Streamer[] BSTREAMER_INSTANCES = {
|
|
||||||
new BooleanStreamer(),
|
|
||||||
new ByteStreamer(),
|
|
||||||
new ShortStreamer(),
|
|
||||||
new CharacterStreamer(),
|
|
||||||
new IntegerStreamer(),
|
|
||||||
new LongStreamer(),
|
|
||||||
new FloatStreamer(),
|
|
||||||
new DoubleStreamer(),
|
|
||||||
new ClassStreamer(),
|
|
||||||
new StringStreamer(),
|
|
||||||
new BooleanArrayStreamer(),
|
|
||||||
new ByteArrayStreamer(),
|
|
||||||
new ShortArrayStreamer(),
|
|
||||||
new CharArrayStreamer(),
|
|
||||||
new IntArrayStreamer(),
|
|
||||||
new LongArrayStreamer(),
|
|
||||||
new FloatArrayStreamer(),
|
|
||||||
new DoubleArrayStreamer(),
|
|
||||||
new ObjectArrayStreamer(),
|
|
||||||
new ListStreamer(),
|
|
||||||
new ListStreamer(),// Second ListStreamer lines up with ArrayList above
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Streams {@link Boolean} instances. */
|
/** Streams {@link Boolean} instances. */
|
||||||
public static class BooleanStreamer extends BasicStreamer
|
public static class BooleanStreamer extends BasicStreamer
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import java.lang.reflect.ReflectPermission;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
@@ -126,6 +127,11 @@ public abstract class FieldMarshaller
|
|||||||
fm = _marshallers.get(Streamable.class);
|
fm = _marshallers.get(Streamable.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sanity check
|
||||||
|
if (fm == null) {
|
||||||
|
throw new AssertionError("Requested to marshal unsupported field " + field);
|
||||||
|
}
|
||||||
|
|
||||||
return fm;
|
return fm;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,10 +384,8 @@ public abstract class FieldMarshaller
|
|||||||
});
|
});
|
||||||
|
|
||||||
// create field marshallers for all of the basic types
|
// create field marshallers for all of the basic types
|
||||||
int bscount = BasicStreamers.BSTREAMER_TYPES.length;
|
for (Map.Entry<Class<?>,Streamer> entry : BasicStreamers.BSTREAMERS.entrySet()) {
|
||||||
for (int ii = 0; ii < bscount; ii++) {
|
_marshallers.put(entry.getKey(), new StreamerMarshaller(entry.getValue()));
|
||||||
_marshallers.put(BasicStreamers.BSTREAMER_TYPES[ii],
|
|
||||||
new StreamerMarshaller(BasicStreamers.BSTREAMER_INSTANCES[ii]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// create the field marshaller for pooled strings
|
// create the field marshaller for pooled strings
|
||||||
|
|||||||
@@ -495,10 +495,8 @@ public class Streamer
|
|||||||
_streamers = Maps.newHashMap();
|
_streamers = Maps.newHashMap();
|
||||||
|
|
||||||
// register all of the basic streamers
|
// register all of the basic streamers
|
||||||
int bscount = BasicStreamers.BSTREAMER_TYPES.length;
|
for (Map.Entry<Class<?>,Streamer> entry : BasicStreamers.BSTREAMERS.entrySet()) {
|
||||||
for (int ii = 0; ii < bscount; ii++) {
|
_streamers.put(entry.getKey(), entry.getValue());
|
||||||
_streamers.put(BasicStreamers.BSTREAMER_TYPES[ii],
|
|
||||||
BasicStreamers.BSTREAMER_INSTANCES[ii]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user