lemme take a crack at it..

_boundedStack: {
  _max: 500,
  _stack: [],
  _current: 0,   // next position to be written
  _overfly: false,
  push: function(obj) {
    var current = this._current;        // minor optimization
    this._stack[current] = obj;
    if (current >= this._max) {
      this._current = 0;
      this._overfly = true;
    }
  },
  length: function() { return this._stack.length; },    // note_1
  item: function(idx) {         // note_2
    if (this._overfly) {
      idx += this._current;
      if (idx >= this._max) { idx -= this._max; }
    }
    return this._stack[idx];
  }
}

note_1: it'll probably be a little faster to call myStack._stack.length directly

note_2: caller needs to bound-check. this can be done implicitly: get the length first, then only ask for elements within that length.


logic check: _current points to next field to write into. when getting an element by index, _current points to oldest element iff there was an overflow.


By the way, never skimp on the curly braces {}: for some reason Fx 1.0 favors the code with lots of {}s, by a slight margin (or so my testing showed).






also, does it have to be an array? what if you just use a linked list of objects? it may work faster if you keep retrieving the whole list each time, not just a certain item

_boundedStack: {
  first: null,
  last: null,
  len: 0,
  max: 500,
  push: function(obj) {
    if (null == this.last) { this.last = obj; }
    else {
      this.last.next = obj;
      this.last = obj;
    }
    this.len++;
    if (null == first) { first = obj; }
    else if (this.len >= this.max) {
        this.first = this.first.next;
        this.len--;
    }
  }
}

obj should be fairly easy to implement, i think..
to get the length of your stack, just grab the len variable
to get the list, get the first element then .next until .next == null


disclaimer: i didn't test either implementation, may i messed it up =)

~Fry-kun
_______________________________________________
Project_owners mailing list
[email protected]
http://mozdev.org/mailman/listinfo/project_owners

Reply via email to