view rep/optimizers/DeleteInsertOptimizer.java @ 271:5b7abc22e61a

enum
author kono
date Thu, 11 Sep 2008 17:23:27 +0900
parents 3680d8357429
children f9fa876d3539
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 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 REPCMD_INSERT:
				break;
			case 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;
		}
	}


}