package jp.ac.kobe_u.cs.prolog.lang;
import java.io.Serializable;
/**
 * Choice point frame.<br>
 *
 * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
 * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
 * @version 1.0
 */
class CPFEntry implements Serializable {
    public long timeStamp;
    public Operation cont;  // continuation goal
    public Operation bp;    // next clause
    public int tr;          // trail pointer
    public int b0;          // cut point

    static CPFEntry S0(Operation cont) {
      CPFEntry r = new CPFEntry();
      r.cont = cont;
      return r;
    }

    void restore(Prolog engine) {
      engine.cont = this.cont;
    }

    public String toString() {
	String t = " time:" + timeStamp + "\n" ;
	t = t + " cont:" + cont + "\n";
	t = t + " bp:" + bp + "\n";
	t = t + " tr:" + tr + "\n";
	t = t + " b0:" + b0 + "\n";
	return t;
    }

    static final class S1 extends CPFEntry {
      private Term areg1;

      S1(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
      }
    }

    static final class S2 extends CPFEntry {
      private Term areg1, areg2;

      S2(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
        this.areg2 = engine.areg2;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
        engine.areg2 = this.areg2;
      }
    }

    static final class S3 extends CPFEntry {
      private Term areg1, areg2, areg3;

      S3(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
        this.areg2 = engine.areg2;
        this.areg3 = engine.areg3;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
        engine.areg2 = this.areg2;
        engine.areg3 = this.areg3;
      }
    }

    static final class S4 extends CPFEntry {
      private Term areg1, areg2, areg3, areg4;

      S4(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
        this.areg2 = engine.areg2;
        this.areg3 = engine.areg3;
        this.areg4 = engine.areg4;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
        engine.areg2 = this.areg2;
        engine.areg3 = this.areg3;
        engine.areg4 = this.areg4;
      }
    }

    static final class S5 extends CPFEntry {
      private Term areg1, areg2, areg3, areg4, areg5;

      S5(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
        this.areg2 = engine.areg2;
        this.areg3 = engine.areg3;
        this.areg4 = engine.areg4;
        this.areg5 = engine.areg5;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
        engine.areg2 = this.areg2;
        engine.areg3 = this.areg3;
        engine.areg4 = this.areg4;
        engine.areg5 = this.areg5;
      }
    }

    static final class S6 extends CPFEntry {
      private Term areg1, areg2, areg3, areg4, areg5, areg6;

      S6(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
        this.areg2 = engine.areg2;
        this.areg3 = engine.areg3;
        this.areg4 = engine.areg4;
        this.areg5 = engine.areg5;
        this.areg6 = engine.areg6;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
        engine.areg2 = this.areg2;
        engine.areg3 = this.areg3;
        engine.areg4 = this.areg4;
        engine.areg5 = this.areg5;
        engine.areg6 = this.areg6;
      }
    }

    static final class S7 extends CPFEntry {
      private Term areg1, areg2, areg3, areg4, areg5, areg6, areg7;

      S7(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
        this.areg2 = engine.areg2;
        this.areg3 = engine.areg3;
        this.areg4 = engine.areg4;
        this.areg5 = engine.areg5;
        this.areg6 = engine.areg6;
        this.areg7 = engine.areg7;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
        engine.areg2 = this.areg2;
        engine.areg3 = this.areg3;
        engine.areg4 = this.areg4;
        engine.areg5 = this.areg5;
        engine.areg6 = this.areg6;
        engine.areg7 = this.areg7;
      }
    }

    static class S8 extends CPFEntry {
      private Term areg1, areg2, areg3, areg4, areg5, areg6, areg7, areg8;

      S8(Prolog engine) {
        this.cont = engine.cont;
        this.areg1 = engine.areg1;
        this.areg2 = engine.areg2;
        this.areg3 = engine.areg3;
        this.areg4 = engine.areg4;
        this.areg5 = engine.areg5;
        this.areg6 = engine.areg6;
        this.areg7 = engine.areg7;
        this.areg8 = engine.areg8;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.areg1 = this.areg1;
        engine.areg2 = this.areg2;
        engine.areg3 = this.areg3;
        engine.areg4 = this.areg4;
        engine.areg5 = this.areg5;
        engine.areg6 = this.areg6;
        engine.areg7 = this.areg7;
        engine.areg8 = this.areg8;
      }
    }

    static final class S9 extends S8 {
      private Term[] aregs;

      S9(int arity, Prolog engine) {
        super(engine);
        aregs = new Term[arity - 8];
        System.arraycopy(engine.aregs, 0, aregs, 0, aregs.length);
      }

      void restore(Prolog engine) {
        System.arraycopy(aregs, 0, engine.aregs, 0, aregs.length);
        super.restore(engine);
      }
    }
}

/**
 * Choice point frame stack.<br>
 * The <code>CPFStack</code> class represents a stack
 * of choice point frames.<br>
 * Each choice point frame has the following fields:
 * <ul>
 * <li><em>arguments</em>
 * <li><em>continuation goal</em>
 * <li><em>next clause</em>
 * <li><em>trail pointer</em>
 * <li><em>cut point</em>
 * <li><em>time stamp</em>
 * </ul>
 *
 * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
 * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
 * @version 1.0
 */
public class CPFStack implements Serializable {
    /** Maximum size of enties. Initial size is <code>20000</code>. */
    protected int maxContents = 20000;

    /** An array of choice point frames. */
    protected CPFEntry[] buffer;

    /** the top index of this <code>CPFStack</code>. */
    protected int top;

    /** Holds the Prolog engine that this <code>CPFStack</code> belongs to. */
    protected Prolog engine;
	
    /** Constructs a new choice point frame stack. */
    public CPFStack(Prolog _engine) {
	engine = _engine;
	buffer = new CPFEntry[maxContents];
	top = -1;
    }

    /** Constructs a new choice point frame stack with the given size. */
    public CPFStack(Prolog _engine, int n) {
	engine = _engine;
	maxContents = n;
	buffer = new CPFEntry[maxContents];
	top = -1;
    }

    /** Create a new choice point frame.
     * @param entry <em>entry to save</em>
     */
    void push(CPFEntry entry){
	try {
	    buffer[++top] = entry;
	} catch (ArrayIndexOutOfBoundsException e) {
	    System.out.println("{expanding choice point stack...}");
	    int len = buffer.length;
	    CPFEntry[] new_buffer = new CPFEntry[len+10000];
	    for(int i=0; i<len; i++) {
		new_buffer[i] = buffer[i];
	    }
	    buffer = new_buffer;
	    buffer[top] = entry;
	    maxContents = len+10000;
	}
    }

    /** Discards all choice points. */
    public void deleteAll() { 
	while (! empty()) {
	    buffer[top--] = null;
	}
    }

    /** Discards all choice points after the value of <code>i</code>. */
    public void cut(int i) {
	while (top > i) {
	    buffer[top--] = null;
	}
    }

    /** Discards the top of choice points. */
    public void delete() { buffer[top--] = null; }

    /** Discards all choice points. */
    public void init() { deleteAll(); }

    /** Tests if this stack has no entry. */
    public boolean empty() { return top == -1; }

    /** Returns the value of <code>top</code>. 
     * @see #top
     */
    public int top() { return top; }

    /** Returns the value of <code>maxContents</code>. 
     * @see #maxContents
     */
    public int max() { return maxContents; }

    CPFEntry topEntry() { return buffer[top]; }
    void restore() { buffer[top].restore(engine); }

    /** Returns the <em>time stamp</em> of current choice point frame. */
    public long getTimeStamp() { return buffer[top].timeStamp; }
    
    /** Shows the contents of this <code>CPFStack</code>. */
    public void show() {
	if (empty()) {
	    System.out.println("{choice point stack is empty!}");
	    return;
	}
	for (int i=0; i<=top; i++) {
	    System.out.print("stack[" + i + "]: ");
	    System.out.println(buffer[i]);
	}
    }
}
