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;
		}
	}


}