package edu.neu.ccs.demeterf.demfgen;
import edu.neu.ccs.demeterf.*;
import edu.neu.ccs.demeterf.demfgen.classes.*;
import edu.neu.ccs.demeterf.lib.List;
import edu.neu.ccs.demeterf.lib.Option;
import edu.neu.ccs.demeterf.parallel.ParTraversal;
import edu.neu.ccs.demeterf.stackless.HeapTrav;
/** Represents a little traversal factory, so there's a central place to
* switch from reflective to static traversals. The traversal factories
* are placed in the following classes:
*
* edu.neu.ccs.demeterf.demfgen.Factory
* edu.neu.ccs.demeterf.demfgen.traversals.Travs
* edu.neu.ccs.demeterf.demfgen.dgp.traversals.Travs
*
*/
public abstract class Factory{
//** What kind of traversal...
static Factory fact = new DynFactory();
//static Factory fact = new StaticFactory();
//static Factory fact = new ParFactory();
//static Factory fact = new HeapFactory();
public static DFGTrav newTraversal(FC f){ return fact.newTrav(f); }
public static DFGTrav newTraversal(FC f, Control c){ return fact.newTrav(f, c); }
public static DFGTravC newTraversalCtx(FC f){ return fact.newTravCtx(f); }
public static DFGTravC newTraversalCtx(FC f, Control c){ return fact.newTravCtx(f, c); }
public abstract DFGTrav newTrav(FC f);
public abstract DFGTrav newTrav(FC f, Control c);
public abstract DFGTravC newTravCtx(FC f);
public abstract DFGTravC newTravCtx(FC f, Control c);
private static class DynFactory extends Factory{
public DFGTrav newTrav(FC f){ return new Trav(f); }
public DFGTrav newTrav(FC f, Control c){ return new Trav(f,c); }
public DFGTravC newTravCtx(FC f){ return new Trav(f); }
public DFGTravC newTravCtx(FC f, Control c){ return new Trav(f,c); }
}
private static class StaticFactory extends Factory{
public DFGTrav newTrav(FC f){ return new STrav(f); }
public DFGTrav newTrav(FC f, Control c){ return new STrav(f,c); }
public DFGTravC newTravCtx(FC f){ return new STravC(f); }
public DFGTravC newTravCtx(FC f, Control c){ return new STravC(f,c); }
}
private static class ParFactory extends Factory{
public DFGTrav newTrav(FC f){ return new PTrav(f); }
public DFGTrav newTrav(FC f, Control c){ return new PTrav(f,c); }
public DFGTravC newTravCtx(FC f){ return new PTrav(f); }
public DFGTravC newTravCtx(FC f, Control c){ return new PTrav(f,c); }
}
private static class HeapFactory extends Factory{
public DFGTrav newTrav(FC f){ return new HTrav(f); }
public DFGTrav newTrav(FC f, Control c){ return new HTrav(f,c); }
public DFGTravC newTravCtx(FC f){ return new HTrav(f); }
public DFGTravC newTravCtx(FC f, Control c){ return new HTrav(f,c); }
}
static class Trav implements DFGTrav,DFGTravC{
Traversal trav;
Trav(FC f){ this(new Traversal(f)); }
Trav(FC f, Control c){ this(new Traversal(f,c)); }
Trav(Traversal t){ trav = t; }
public Ret traverseList_CDFile_(List o){ return trav.traverse(o); }
public Ret traverseTypeDefParams(TypeDefParams o){ return trav.traverse(o); }
public Ret traverseTypeDefList(TypeDefList o){ return trav.traverse(o); }
public Ret traverseList_TypeDef_(List o){ return trav.traverse(o); }
public Ret traverseList_FieldOrSyntax_(List o){ return trav.traverse(o); }
public Ret traverseOption_List_TypeDef__(Option> o){ return trav.traverse(o); }
public Ret traverseTypeDef(TypeDef o){ return trav.traverse(o); }
public Ret traverseIncludeList(IncludeList o){ return trav.traverse(o); }
// Contexts...
public Ret traverseList_FieldOrSyntax_(List o, Object a){ return trav.traverse(o,a); }
public Ret traverseList_CDFile_(List o, Object a){ return trav.traverse(o,a); }
public Ret traverseTypeDefList(TypeDefList o, Object a){ return trav.traverse(o,a); }
public Ret traverseTypeDef(TypeDef o, Object a){ return trav.traverse(o,a); }
}
static class PTrav extends Trav{
PTrav(FC f){ super(new ParTraversal(f)); }
PTrav(FC f, Control c){ super(new ParTraversal(f,c)); }
}
static class HTrav extends Trav{
HTrav(FC f){ super(new HeapTrav(f)); }
HTrav(FC f, Control c){ super(new HeapTrav(f,c)); }
}
static class STrav extends StaticTrav implements DFGTrav{
STrav(FC f){ super(f); }
STrav(FC f, Control c){ super(f,c); }
}
static class STravC extends StaticTravCtx implements DFGTravC{
STravC(FC f){ super(f); }
STravC(FC f, Control c){ super(f,c); }
}
}