// Copyright 2011 Google Inc. All Rights Reserved.

package com.googlecode.prolog_cafe.lang;

/**
 * Choice point frame.
 *
 * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
 * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
 * @version 1.0
 */
class ChoicePointFrame {
    ChoicePointFrame prior;

    long timeStamp;
    Operation cont;  // continuation goal
    Operation bp;    // next clause
    int tr;          // trail pointer
    int b0;          // cut point

    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 ChoicePointFrame {
      private final Term r1;

      S1(Prolog engine) {
        this.r1 = engine.r1;
      }

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

    static final class S2 extends ChoicePointFrame {
      private final Term r1, r2;

      S2(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
      }

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

    static final class S3 extends ChoicePointFrame {
      private final Term r1, r2, r3;

      S3(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
      }

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

    static final class S4 extends ChoicePointFrame {
      private final Term r1, r2, r3, r4;

      S4(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
        this.r4 = engine.r4;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.r1 = this.r1;
        engine.r2 = this.r2;
        engine.r3 = this.r3;
        engine.r4 = this.r4;
      }
    }

    static final class S5 extends ChoicePointFrame {
      private final Term r1, r2, r3, r4, r5;

      S5(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
        this.r4 = engine.r4;
        this.r5 = engine.r5;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.r1 = this.r1;
        engine.r2 = this.r2;
        engine.r3 = this.r3;
        engine.r4 = this.r4;
        engine.r5 = this.r5;
      }
    }

    static final class S6 extends ChoicePointFrame {
      private final Term r1, r2, r3, r4, r5, r6;

      S6(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
        this.r4 = engine.r4;
        this.r5 = engine.r5;
        this.r6 = engine.r6;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.r1 = this.r1;
        engine.r2 = this.r2;
        engine.r3 = this.r3;
        engine.r4 = this.r4;
        engine.r5 = this.r5;
        engine.r6 = this.r6;
      }
    }

    static final class S7 extends ChoicePointFrame {
      private final Term r1, r2, r3, r4, r5, r6, r7;

      S7(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
        this.r4 = engine.r4;
        this.r5 = engine.r5;
        this.r6 = engine.r6;
        this.r7 = engine.r7;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.r1 = this.r1;
        engine.r2 = this.r2;
        engine.r3 = this.r3;
        engine.r4 = this.r4;
        engine.r5 = this.r5;
        engine.r6 = this.r6;
        engine.r7 = this.r7;
      }
    }

    static class S8 extends ChoicePointFrame {
      private final Term r1, r2, r3, r4, r5, r6, r7, r8;

      S8(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
        this.r4 = engine.r4;
        this.r5 = engine.r5;
        this.r6 = engine.r6;
        this.r7 = engine.r7;
        this.r8 = engine.r8;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.r1 = this.r1;
        engine.r2 = this.r2;
        engine.r3 = this.r3;
        engine.r4 = this.r4;
        engine.r5 = this.r5;
        engine.r6 = this.r6;
        engine.r7 = this.r7;
        engine.r8 = this.r8;
      }
    }

    static class S9 extends ChoicePointFrame {
      private final Term r1, r2, r3, r4, r5, r6, r7, r8, r9;

      S9(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
        this.r4 = engine.r4;
        this.r5 = engine.r5;
        this.r6 = engine.r6;
        this.r7 = engine.r7;
        this.r8 = engine.r8;
        this.r9 = engine.r9;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.r1 = this.r1;
        engine.r2 = this.r2;
        engine.r3 = this.r3;
        engine.r4 = this.r4;
        engine.r5 = this.r5;
        engine.r6 = this.r6;
        engine.r7 = this.r7;
        engine.r8 = this.r8;
        engine.r9 = this.r9;
      }
    }

    static class S10 extends ChoicePointFrame {
      private final Term r1, r2, r3, r4, r5, r6, r7, r8, r9, r10;

      S10(Prolog engine) {
        this.r1 = engine.r1;
        this.r2 = engine.r2;
        this.r3 = engine.r3;
        this.r4 = engine.r4;
        this.r5 = engine.r5;
        this.r6 = engine.r6;
        this.r7 = engine.r7;
        this.r8 = engine.r8;
        this.r9 = engine.r9;
        this.r10 = engine.r10;
      }

      void restore(Prolog engine) {
        engine.cont = this.cont;
        engine.r1 = this.r1;
        engine.r2 = this.r2;
        engine.r3 = this.r3;
        engine.r4 = this.r4;
        engine.r5 = this.r5;
        engine.r6 = this.r6;
        engine.r7 = this.r7;
        engine.r8 = this.r8;
        engine.r9 = this.r9;
        engine.r10 = this.r10;
      }
    }
}
