pike.git / lib / modules / ADT.pmod / Stack.pike

version» Context lines:

pike.git/lib/modules/ADT.pmod/Stack.pike:1:   #pike __REAL_VERSION__    - // $Id: Stack.pike,v 1.9 2002/11/29 00:30:03 nilsson Exp $ + // $Id: Stack.pike,v 1.10 2003/08/22 14:23:13 nilsson Exp $      //! This class implements a simple stack. Instead of adding and removing   //! elements to an array, and thus making it vary in size for every push   //! and pop operation, this stack tries to keep the stack size constant.   //! If however the stack risks to overflow, it will allocate double its   //! current size, i.e. pushing an element on an full 32 slot stack will   //! result in a 64 slot stack with 33 elements.      int ptr;   array arr;
pike.git/lib/modules/ADT.pmod/Stack.pike:21:    arr[ptr++] = val;   }      //! Returns the top element from the stack, without   //! popping it.   //! @throws   //! Throws an error if called on an empty stack.   mixed top()   {    if (ptr) { -  return(arr[ptr-1]); +  return arr[ptr-1];    }    error("Stack underflow\n");   }      //! Pops @[val] entries from the stack, or one entry   //! if no value is given. The popped entries are not   //! actually freed, only the stack pointer is moved.   void quick_pop(void|int val)   {    if (val) {
pike.git/lib/modules/ADT.pmod/Stack.pike:50:    }    }   }      //! Pops and returns entry @[val] from the stack, counting   //! from the top. If no value is given the top element is   //! popped and returned. All popped entries are freed from   //! the stack.   mixed pop(void|int val)   { -  mixed foo; +  mixed ret;       if (val) {    if (ptr <= 0) {    error("Stack underflow\n");    }       if (ptr < val) {    val = ptr;    }    ptr -= val; -  foo = arr[ptr..ptr + val - 1]; +  ret = arr[ptr..ptr + val - 1];       for (int i=0; i < val; i++) {    arr[ptr + i] = 0; /* Don't waste references */    }    } else {    if(--ptr < 0)    error("Stack underflow\n");    -  foo=arr[ptr]; +  ret = arr[ptr];    arr[ptr]=0; /* Don't waste references */    } -  return foo; +  return ret;   }      //! Empties the stack, resets the stack pointer   //! and shrinks the stack size to the given value   //! or 32 if none is given.   //! @seealso   //! @[create]   void reset(int|void initial_size)   {    arr = allocate(initial_size || 32);