// Copyright 2002, SLAC, Stanford University, U.S.A.
package org.freehep.aid;
import org.freehep.rtti.IType;
/**
* @author Mark Donszelmann
* @version $Id: ObjectArrayToObjectVector.java 8584 2006-08-10 23:06:37Z duns $
*/
public class ObjectArrayToObjectVector extends JNITypeConversion {
public ObjectArrayToObjectVector(String indent, String cr) {
super(indent, cr);
}
public String convertToJava(JNITypeConverter converter, int scope, IType type, int dimension, String nameSpace, String src, String dst) {
StringBuffer s = new StringBuffer();
s.append(indent(scope));
s.append("// convert vector<objects> into Objects[]");
s.append(cr);
s.append(indent(scope));
s.append("jclass cls");
s.append(scope);
s.append(" = env->FindClass(\"");
// FIXME, we need the package name here, via the RTTI?
s.append(converter.getSignature(type, dimension-1, "dummypackagename"));
s.append("\");");
s.append(cr);
s.append(indent(scope));
s.append(dst);
s.append(" = env->NewObjectArray(");
s.append(src);
s.append(".size(), cls");
s.append(scope);
s.append(", NULL);");
s.append(cr);
s.append(indent(scope));
s.append("for (int i");
s.append(scope);
s.append("=0; i");
s.append(scope);
s.append("<");
s.append(src);
s.append(".size(); i");
s.append(scope);
s.append("++) {");
s.append(cr);
s.append(indent(scope+1));
s.append(converter.jniType(type, dimension-1));
s.append(" v");
s.append(scope+1);
s.append(";");
s.append(cr);
s.append(converter.convertToJava(scope+1, type,
dimension-1, nameSpace, src+"[i"+scope+"]", "v"+(scope+1)));
s.append(indent(scope+1));
s.append("env->SetObjectArrayElement(");
s.append(dst);
s.append(", i");
s.append(scope);
s.append(", v");
s.append(scope+1);
s.append(");");
s.append(cr);
s.append(indent(scope));
s.append("}");
s.append(cr);
return s.toString();
}
public String convertToCPP(JNITypeConverter converter, int scope, IType type, int dimension, String nameSpace, String src, String dst) {
StringBuffer s = new StringBuffer();
s.append(indent(scope));
s.append("// convert Objects[] into vector<objects>");
s.append(cr);
s.append(indent(scope));
s.append("unsigned int len");
s.append(scope);
s.append(" = env->GetArrayLength(");
s.append(src);
s.append(");");
s.append(cr);
s.append(indent(scope));
s.append("for (unsigned int i");
s.append(scope);
s.append("=0; i");
s.append(scope);
s.append("<len");
s.append(scope);
s.append("; i");
s.append(scope);
s.append("++) {");
s.append(cr);
s.append(indent(scope+1));
s.append(converter.jniType(type, dimension-1));
s.append(" o");
s.append(scope+1);
s.append(" = (");
s.append(converter.jniType(type, dimension-1));
s.append(")env->GetObjectArrayElement(");
s.append(src);
s.append(", i");
s.append(scope);
s.append(");");
s.append(cr);
s.append(indent(scope+1));
s.append(converter.basicType(type, dimension-1, nameSpace));
s.append(" d");
s.append(scope+1);
s.append(";");
s.append(cr);
s.append(converter.convertToCPP(scope+1, type, dimension-1, nameSpace, "o"+(scope+1), "d"+(scope+1)));
s.append(indent(scope+1));
s.append(dst);
s.append(".push_back(d");
s.append(scope+1);
s.append(");");
s.append(cr);
// post.append(freeStringToCharStar(2, "s", "c"));
s.append(indent);
s.append("}");
s.append(cr);
return s.toString();
}
}