Mercurial > hg > RemoteEditor > REPSessionManager
view rep/optimizers/DeleteInsertOptimizer.java @ 331:f9fa876d3539
Optimizer test
author | kono |
---|---|
date | Sun, 12 Oct 2008 09:43:17 +0900 |
parents | 5b7abc22e61a |
children | 1bc132a6b879 |
line wrap: on
line source
package rep.optimizers; import java.util.LinkedList; import java.util.List; import rep.REP; import rep.REPCommand; /** * * @author Takano * */ public class DeleteInsertOptimizer implements REPCommandOptimizer { public List<REPCommand> optimize(List<REPCommand> cmdlist){ List<REPCommand> output = new LinkedList<REPCommand>(); for (REPCommand cmd: cmdlist){ if (cmd.cmd==REP.REPCMD_NOP) continue; output.add(0,new REPCommand(cmd)); } for(int i = 0; i < output.size(); i++){ REPCommand r = output.get(i); switch(r.cmd){ case REPCMD_INSERT: break; case REPCMD_DELETE: optimizedAdd(output,r,i); break; } } java.util.Collections.reverse(output); return output; } private void optimizedAdd(List<REPCommand> output, REPCommand r, int ln) { int lineno = r.lineno; int minln = output.size(); for(int i = ln; i < output.size(); i++){ REPCommand s = output.get(i); if(s.cmd==REP.REPCMD_INSERT) { if(s.lineno < lineno){ lineno --; }else if(s.lineno == lineno){ if(s.lineno < minln){ minln = s.lineno; } lineNumberCorrection(output,minln,i,ln); output.remove(r); output.remove(s); ln--; break; } }else if(s.cmd==REP.REPCMD_DELETE){ if(s.lineno < lineno){ lineno ++; } }else if(s.cmd==REP.REPCMD_NOP){ output.remove(s); }else{ System.out.println("There are no such commands."); } } } private void lineNumberCorrection(List<REPCommand> opt, int ln, int count, int r){ for(int i = r; i < count; i++){ REPCommand o = opt.get(i); if(ln < o.lineno) o.lineno -= 1; } } }