// -*- mode: c++ -*-
// $Id: objinst.g++,v 1.10 2001/10/09 23:52:37 doug Exp $
// http://www.bagley.org/~doug/shootout/


// benchmark results (amd 2400+ "barton", n=1000000):
//        java: ~ 0.08s
// visualc++-6: ~ 0.40s
// java(nojit): ~ 0.74s (to my suprise the -Xint option had a serious impact on the object instanciation rate)
//         g++: ~ 1,01s
//    tkscript: ~ 2,3s
//      python: ~ 4.7s
//        perl: ~13,10s
//
// python2.3 for win32, perl5.8.0 for cygwin, tks 0.8.7.3 (compiled with optimizing MSVC)
//
// benchmark results (g4 800, apple macosX 10.33, 768MB RAM, n=1000000)
//    tkscript: ~9s


class Toggle {
  init(int start_state) { state=start_state; }
  value() { return state; }
  activate() {
    state = !state;
    return this;
  }
  int state;
}

class NthToggle : Toggle {
  init(int start_state, int max_counter) {
    Toggle::init(start_state);
    count_max=max_counter;
    counter=0;
  }
  activate() {
    if (++counter >= count_max) {
      state = !state;
      counter = 0;
    }
    return this;
  }

    int count_max;
    int counter;
}

function main() {
    int i,n = (Arguments.numElements==1) ? Arguments[0] : 1000000;

    Toggle toggle1 <= new Toggle; toggle1.init(true);
    loop(5) {
      print ((toggle1.activate().value()) ? "true" : "false");
    }
    toggle1<=null;

    loop(n) {
	Toggle toggle <= new Toggle; toggle.init(true);
    }

    print "";
    
    NthToggle ntoggle1 <= new NthToggle; ntoggle1.init(true, 3);
    loop(8) {
      print ((ntoggle1.activate().value()) ? "true" : "false");
    }
    ntoggle1<=null;

    loop(n) {
      NthToggle ntoggle <= new NthToggle; ntoggle.init(true, 3);
    }
}