package net.nullschool.grains.msgpack;
import net.nullschool.collect.ConstSortedSet;
import org.msgpack.packer.Packer;
import org.msgpack.template.Template;
import org.msgpack.unpacker.Unpacker;
import java.io.IOException;
import java.util.Objects;
import static net.nullschool.collect.basic.BasicCollections.*;
/**
* 2013-06-06<p/>
*
* @author Cameron Beccario
*/
public class BasicConstSortedSetTemplate extends AbstractNullableTemplate<ConstSortedSet> {
private final Template<Object> elementTemplate;
public BasicConstSortedSetTemplate(Template<?> elementTemplate) {
@SuppressWarnings("unchecked") Template<Object> et = (Template<Object>)elementTemplate;
this.elementTemplate = Objects.requireNonNull(et);
}
@Override protected void writeValue(Packer packer, ConstSortedSet set) throws IOException {
packer.writeArrayBegin(set.size());
for (Object element : set) {
elementTemplate.write(packer, element, false);
}
packer.writeArrayEnd();
}
@Override protected ConstSortedSet readValue(Unpacker unpacker, ConstSortedSet to) throws IOException {
ConstSortedSet<?> result;
final int size = unpacker.readArrayBegin();
switch (size) {
case 0:
result = emptySortedSet(null);
break;
case 1:
result = sortedSetOf(null, elementTemplate.read(unpacker, null, false));
break;
default:
Object[] elements = new Object[size];
for (int i = 0; i < size; i++) {
elements[i] = elementTemplate.read(unpacker, null, false);
}
result = asSortedSet(null, elements);
}
unpacker.readArrayEnd();
return result;
}
@Override public String toString() {
return String.format("%s<%s>", getClass().getSimpleName(), elementTemplate);
}
}