package com.github.davidmoten.rtree.fbs;
import java.util.List;
import com.github.davidmoten.rtree.Context;
import com.github.davidmoten.rtree.Entries;
import com.github.davidmoten.rtree.Entry;
import com.github.davidmoten.rtree.Factory;
import com.github.davidmoten.rtree.Leaf;
import com.github.davidmoten.rtree.Node;
import com.github.davidmoten.rtree.NonLeaf;
import com.github.davidmoten.rtree.geometry.Geometry;
import com.github.davidmoten.rtree.internal.FactoryDefault;
import com.github.davidmoten.rtree.internal.NonLeafDefault;
import com.github.davidmoten.util.Preconditions;
import rx.functions.Func1;
/**
* Conserves memory in comparison to {@link FactoryDefault} especially for
* larger {@code maxChildren} by saving Leaf objects to byte arrays and using
* FlatBuffers to access the byte array.
*
* @param <T>
* the object type
* @param <S>
* the geometry type
*/
public final class FactoryFlatBuffers<T, S extends Geometry> implements Factory<T, S> {
private final Func1<? super T, byte[]> serializer;
private final Func1<byte[], ? extends T> deserializer;
public FactoryFlatBuffers(Func1<? super T, byte[]> serializer, Func1<byte[], ? extends T> deserializer) {
Preconditions.checkNotNull(serializer);
Preconditions.checkNotNull(deserializer);
this.serializer = serializer;
this.deserializer = deserializer;
}
@Override
public Leaf<T, S> createLeaf(List<Entry<T, S>> entries, Context<T, S> context) {
return new LeafFlatBuffers<T, S>(entries, context, serializer, deserializer);
}
@Override
public NonLeaf<T, S> createNonLeaf(List<? extends Node<T, S>> children, Context<T, S> context) {
return new NonLeafDefault<T, S>(children, context);
}
@Override
public Entry<T, S> createEntry(T value, S geometry) {
return Entries.entry(value, geometry);
}
public Func1<? super T, byte[]> serializer() {
return serializer;
}
public Func1<byte[], ? extends T> deserializer() {
return deserializer;
}
}