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:
Michael Bayne
2010-08-10 22:04:05 +00:00
parent 41ba838b20
commit 89dfe715d8
3 changed files with 36 additions and 57 deletions
+26 -49
View File
@@ -23,12 +23,14 @@ package com.threerings.io;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.RandomAccess;
import java.io.EOFException;
import java.io.IOException;
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,
@@ -36,55 +38,30 @@ import com.google.common.collect.Lists;
*/
public class BasicStreamers
{
/** An array of types for all of the basic streamers. */
public static Class<?>[] BSTREAMER_TYPES = {
Boolean.class,
Byte.class,
Short.class,
Character.class,
Integer.class,
Long.class,
Float.class,
Double.class,
Class.class,
String.class,
boolean[].class,
byte[].class,
short[].class,
char[].class,
int[].class,
long[].class,
float[].class,
double[].class,
Object[].class,
List.class,
ArrayList.class,
};
/** 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
};
public static Map<Class<?>, Streamer> BSTREAMERS = Maps.newLinkedHashMap();
static {
BSTREAMERS.put(Boolean.class, new BooleanStreamer());
BSTREAMERS.put(Byte.class, new ByteStreamer());
BSTREAMERS.put(Short.class, new ShortStreamer());
BSTREAMERS.put(Character.class, new CharacterStreamer());
BSTREAMERS.put(Integer.class, new IntegerStreamer());
BSTREAMERS.put(Long.class, new LongStreamer());
BSTREAMERS.put(Float.class, new FloatStreamer());
BSTREAMERS.put(Double.class, new DoubleStreamer());
BSTREAMERS.put(Class.class, new ClassStreamer());
BSTREAMERS.put(String.class, new StringStreamer());
BSTREAMERS.put(boolean[].class, new BooleanArrayStreamer());
BSTREAMERS.put(byte[].class, new ByteArrayStreamer());
BSTREAMERS.put(short[].class, new ShortArrayStreamer());
BSTREAMERS.put(char[].class, new CharArrayStreamer());
BSTREAMERS.put(int[].class, new IntArrayStreamer());
BSTREAMERS.put(long[].class, new LongArrayStreamer());
BSTREAMERS.put(float[].class, new FloatArrayStreamer());
BSTREAMERS.put(double[].class, new DoubleArrayStreamer());
BSTREAMERS.put(Object[].class, new ObjectArrayStreamer());
BSTREAMERS.put(List.class, new ListStreamer());
BSTREAMERS.put(ArrayList.class, new ListStreamer());
}
/** Streams {@link Boolean} instances. */
public static class BooleanStreamer extends BasicStreamer
@@ -27,6 +27,7 @@ import java.lang.reflect.ReflectPermission;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.google.common.collect.Maps;
@@ -126,6 +127,11 @@ public abstract class FieldMarshaller
fm = _marshallers.get(Streamable.class);
}
// sanity check
if (fm == null) {
throw new AssertionError("Requested to marshal unsupported field " + field);
}
return fm;
}
@@ -378,10 +384,8 @@ public abstract class FieldMarshaller
});
// create field marshallers for all of the basic types
int bscount = BasicStreamers.BSTREAMER_TYPES.length;
for (int ii = 0; ii < bscount; ii++) {
_marshallers.put(BasicStreamers.BSTREAMER_TYPES[ii],
new StreamerMarshaller(BasicStreamers.BSTREAMER_INSTANCES[ii]));
for (Map.Entry<Class<?>,Streamer> entry : BasicStreamers.BSTREAMERS.entrySet()) {
_marshallers.put(entry.getKey(), new StreamerMarshaller(entry.getValue()));
}
// create the field marshaller for pooled strings
+2 -4
View File
@@ -495,10 +495,8 @@ public class Streamer
_streamers = Maps.newHashMap();
// register all of the basic streamers
int bscount = BasicStreamers.BSTREAMER_TYPES.length;
for (int ii = 0; ii < bscount; ii++) {
_streamers.put(BasicStreamers.BSTREAMER_TYPES[ii],
BasicStreamers.BSTREAMER_INSTANCES[ii]);
for (Map.Entry<Class<?>,Streamer> entry : BasicStreamers.BSTREAMERS.entrySet()) {
_streamers.put(entry.getKey(), entry.getValue());
}
}