Mercurial > hg > RemoteEditor > REPSessionManager
changeset 223:3680d8357429
Optimizer of REPCommand
originated from tkaito
created by kent
author | kent |
---|---|
date | Sun, 31 Aug 2008 13:06:36 +0900 |
parents | 18d6a7140fa3 |
children | 6b0dd92b8e45 |
files | rep/optimizers/DeleteInsertOptimizer.java rep/optimizers/NullOptimizer.java rep/optimizers/REPCommandOptimizer.java |
diffstat | 3 files changed, 114 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rep/optimizers/DeleteInsertOptimizer.java Sun Aug 31 13:06:36 2008 +0900 @@ -0,0 +1,78 @@ +package rep.optimizers; + +import java.util.LinkedList; +import java.util.List; + +import rep.REP; +import rep.REPCommand; + +/** + * + * @author Takano + * + */ +public class DeleteInsertOptimizer extends REPCommandOptimizer { + + // optimize メソッドから呼ばれます + protected List<REPCommand> optimize0(List<REPCommand> inp){ + List<REPCommand> output; + output = reverse(inp); + + for(int i = 0; i < output.size(); i++){ + REPCommand r = output.get(i); + switch(r.cmd){ + case REP.REPCMD_INSERT: + break; + case REP.REPCMD_DELETE: + optimizedAdd(output,r,i); + break; + } + } + return reverse(output); + + } + + private List<REPCommand> reverse(List<REPCommand> outp) { + LinkedList<REPCommand> reverse = new LinkedList<REPCommand>(); + for(REPCommand r : outp){ + reverse.addFirst(r); + } + return reverse; + } + 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{ + 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; + } + } + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rep/optimizers/NullOptimizer.java Sun Aug 31 13:06:36 2008 +0900 @@ -0,0 +1,13 @@ +package rep.optimizers; + +import java.util.List; + +import rep.REPCommand; + +public class NullOptimizer extends REPCommandOptimizer { + + protected List<REPCommand> optimize0(List<REPCommand> cmdlist){ + return cmdlist; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rep/optimizers/REPCommandOptimizer.java Sun Aug 31 13:06:36 2008 +0900 @@ -0,0 +1,23 @@ +package rep.optimizers; + +import java.util.LinkedList; +import java.util.List; + +import rep.REPCommand; + +public abstract class REPCommandOptimizer { + + // リストとその中身のREPCommandをコピーするため. finalでよい? + public final List<REPCommand> optimize(List<REPCommand> cmdlist){ + List<REPCommand> copied = new LinkedList<REPCommand>(); + for (REPCommand cmd: cmdlist){ + // ちゃんと new しないといけません! + copied.add(new REPCommand(cmd)); + } + return optimize0(copied); + } + + // 継承したクラスでこれを実装してください 直接cmdlistを返すのもあり. + abstract protected List<REPCommand> optimize0(List<REPCommand> cmdlist); + +}