package oop;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.File;
import java.io.FileWriter;
import java.util.HashSet;
public class vTableAddressLine{
//String vTableClass;
String methodname;
boolean typecast;
String classname;
String vTableLine;
//String parameters;
boolean overloaded;
HashSet<String> overrides;
//for typecasting
String returntype;
String parameters;
vTableClass parent;
vTableLayoutLine matchinglayout;
vTableMethodLayoutLine matchingmethod;
public vTableAddressLine(vTableClass parentable){
parent = parentable;
overloaded = false;
typecast = false;
overrides = new HashSet<String>();
}
public void setMethodName(String methodnamable){
methodname = methodnamable;
}
public void setTypeCast(String returntype, String parameters){
typecast = true;
this.returntype = returntype;
if(parameters != null)
this.parameters = parameters;
else{
this.parameters = " \b";
}
//currentaddress.setTypeCast("(" + currentmethod.returntype + "(*)("
// + this.classname + currentmethod.parameters + "))");
}
public void setOverride(String s){
overrides.add(s);
}
public void setClassName(String classnamable){
classname = classnamable;
}
public void setOverload(){
overloaded = true;
//parameters = parameterssource;
}
public void setMatching(vTableLayoutLine layout, vTableMethodLayoutLine method){
matchinglayout = layout;
matchingmethod = method;
}
/*
//obsolete
public void setVTableClass(String classable){
vTableClass = classable;
}
public void createVTableLine(){
//methodname((anyspecialcasting)&class::methodname);
if(methodname.equals("__isa")){
vTableLine = methodname + "(";
vTableLine = vTableLine + "&" + "__" + classname + "::" + "__class()" + ")";
}
else{
vTableLine = ", \r" + methodname + "(";
if(!(typecast == null)){
vTableLine = vTableLine + "(" + typecast + ")";
}
vTableLine = vTableLine + "&" + classname + "::" + methodname + ")";
}
}
*/
public void writeFile(BufferedWriter writer, vTableClass currentclass){
if(methodname.equals("__isa")){
vTableLine = methodname + "(";
vTableLine = vTableLine + "__" + currentclass.classname + "::" + "__class()" + ")";
}
else if(methodname.equals("__delete")){
vTableLine = ", \r" + methodname + "(";
vTableLine = vTableLine + "&__" + currentclass.classname + "::" + "__delete" + ")";
}
else{
if(overloaded == true){
vTableLine = ", \r" + methodname + matchingmethod.parameters.replace(",", "_") + "(";
}
else{
vTableLine = ", \r" + methodname + "(";
}
if(!this.classname.equals(currentclass.classname)){
//if(!overrides.contains(currentclass.classname)){
if(typecast == true){
vTableLine = vTableLine + "(" + returntype + "(*)("
+ currentclass.classname + parameters + "))";
}
else{
vTableLine = vTableLine + "(" + matchingmethod.returntype + "(*)("
+ currentclass.classname + matchingmethod.parameters + "))";
}
//}
//else{
// }
//currentaddress.setTypeCast("(" + currentmethod.returntype + "(*)("
// + this.classname + currentmethod.parameters + "))");
}
if(overloaded == true){
if(!overrides.contains(currentclass.classname)){
vTableLine = vTableLine + "&__" + classname + "::" + methodname //+ "_"
+ matchingmethod.parameters.replace(",", "_") + ")";
}
else{
vTableLine = vTableLine + "&__" + currentclass.classname + "::" + methodname //+ "_"
+ matchingmethod.parameters.replace(",", "_") + ")";
}
}
else{
if(!overrides.contains(currentclass.classname)){
vTableLine = vTableLine + "&__" + classname + "::" + methodname + ")";
}
else{
vTableLine = vTableLine + "&__" + currentclass.classname + "::" + methodname + ")";
}
}
//vTableLine = vTableLine + "&__" + classname + "::" + methodname + ")";
}
try {
//FileWriter writee = new FileWriter(file);
//BufferedWriter writer = new BufferedWriter(writee);
writer.write(vTableLine);
writer.flush();
//writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void printLine(){
if(methodname.equals("__isa")){
vTableLine = methodname + "(";
vTableLine = vTableLine + "__" + classname + "::" + "__class()" + ")";
}
else{
if(overloaded == true){
vTableLine = ", \r" + methodname + "_" + matchingmethod.parameters.replace(",", "_") + "(";
}
else{
vTableLine = ", \r" + methodname + "(";
}
if(!(typecast == true)){
vTableLine = vTableLine + "(" + typecast + ")";
}
if(overloaded == true){
vTableLine = vTableLine + "&__" + classname + "::" + methodname + "_"
+ matchingmethod.parameters.replace(",", "_") + ")";
}
else{
vTableLine = vTableLine + "&__" + classname + "::" + methodname + ")";
}
//vTableLine = vTableLine + "&__" + classname + "::" + methodname + ")";
}
System.out.print(vTableLine);
}
}