/*
** 2015 November 23
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
*/
package info.ata4.junity.serialize.typetree;
import info.ata4.io.DataReader;
import info.ata4.io.DataWriter;
import info.ata4.util.collection.Node;
import java.io.IOException;
/**
*
* @author Nico Bergemann <barracuda415 at yahoo.de>
*/
public class TypeTreeV1<T extends TypeV1> extends TypeTree<T> {
public TypeTreeV1(Class<T> elementFactory) {
super(elementFactory);
}
@Override
public void read(DataReader in) throws IOException {
int numBaseClasses = in.readInt();
for (int i = 0; i < numBaseClasses; i++) {
int classID = in.readInt();
TypeRoot baseClass = new TypeRoot();
baseClass.classID(classID);
Node<T> node = new Node<>();
readNode(in, node);
baseClass.nodes(node);
typeMap.put(classID, baseClass);
}
embedded = numBaseClasses > 0;
}
private void readNode(DataReader in, Node<T> node) throws IOException {
T type = createElement();
in.readStruct(type);
node.data(type);
int numChildren = in.readInt();
for (int i = 0; i < numChildren; i++) {
Node<T> childNode = new Node<>();
readNode(in, childNode);
node.add(childNode);
}
}
@Override
public void write(DataWriter out) throws IOException {
// write empty type tree if types are not embedded
if (!embedded) {
out.writeInt(0);
return;
}
int numBaseClasses = typeMap.size();
out.writeInt(numBaseClasses);
for (TypeRoot bc : typeMap.values()) {
int classID = bc.classID();
out.writeInt(classID);
Node<T> node = bc.nodes();
writeNode(out, node);
}
}
private void writeNode(DataWriter out, Node<T> node) throws IOException {
T type = node.data();
out.writeStruct(type);
int numChildren = node.size();
out.writeInt(numChildren);
for (Node child : node) {
writeNode(out, child);
}
}
}