| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- <?php
- /**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category Zend
- * @package Zend_EventManager
- * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- */
- if (version_compare(PHP_VERSION, '5.3.0', '<')) {
- class SplStack implements Iterator, ArrayAccess, Countable
- {
- /**
- * Delete items during iteration
- */
- const IT_MODE_DELETE = 1;
- /**
- * Keep items during iteration
- */
- const IT_MODE_KEEP = 0;
- /**
- * Mode used when iterating
- * @var int
- */
- protected $mode = self::IT_MODE_KEEP;
- /**
- * Count of elements in the stack
- *
- * @var int
- */
- protected $count = 0;
- /**
- * Data represented by this stack
- *
- * @var array
- */
- protected $data = array();
- /**
- * Sorted stack of values
- *
- * @var false|array
- */
- protected $stack = false;
- /**
- * Set the iterator mode
- *
- * Must be set to one of IT_MODE_DELETE or IT_MODE_KEEP
- *
- * @todo Currently, IteratorMode is ignored, as we use the default (keep); should this be implemented?
- * @param int $mode
- * @return void
- * @throws InvalidArgumentException
- */
- public function setIteratorMode($mode)
- {
- $expected = array(
- self::IT_MODE_DELETE => true,
- self::IT_MODE_KEEP => true,
- );
- if (!isset($expected[$mode])) {
- throw new InvalidArgumentException(sprintf('Invalid iterator mode specified ("%s")', $mode));
- }
- $this->mode = $mode;
- }
- /**
- * Return last element in the stack
- *
- * @return mixed
- */
- public function bottom()
- {
- $this->rewind();
- $value = array_pop($this->stack);
- array_push($this->stack, $value);
- return $value;
- }
- /**
- * Countable: return count of items in the stack
- *
- * @return int
- */
- public function count()
- {
- return $this->count;
- }
- /**
- * Iterator: return current item in the stack
- *
- * @return mixed
- */
- public function current()
- {
- if (!$this->stack) {
- $this->rewind();
- }
- return current($this->stack);
- }
- /**
- * Get iteration mode
- *
- * @return int
- */
- public function getIteratorMode()
- {
- return $this->mode;
- }
- /**
- * Is the stack empty?
- *
- * @return bool
- */
- public function isEmpty()
- {
- return ($this->count === 0);
- }
- /**
- * Iterator: return key of current item in the stack
- *
- * @return mixed
- */
- public function key()
- {
- if (!$this->stack) {
- $this->rewind();
- }
- return key($this->stack);
- }
- /**
- * Iterator: advance pointer to next item in the stack
- *
- * @return void
- */
- public function next()
- {
- if (!$this->stack) {
- $this->rewind();
- }
- return next($this->stack);
- }
- /**
- * ArrayAccess: does an item exist at the specified offset?
- *
- * @param mixed $index
- * @return bool
- */
- public function offsetExists($index)
- {
- return array_key_exists($index, $this->data);
- }
- /**
- * ArrayAccess: get the item at the specified offset
- *
- * @param mixed $index
- * @return mixed
- * @throws OutOfRangeException
- */
- public function offsetGet($index)
- {
- if (!$this->offsetExists($index)) {
- throw OutOfRangeException(sprintf('Invalid index ("%s") specified', $index));
- }
- return $this->data[$index];
- }
- /**
- * ArrayAccess: add an item at the specified offset
- *
- * @param mixed $index
- * @param mixed $newval
- * @return void
- */
- public function offsetSet($index, $newval)
- {
- $this->data[$index] = $newval;
- $this->stack = false;
- $this->count++;
- }
- /**
- * ArrayAccess: unset the item at the specified offset
- *
- * @param mixed $index
- * @return void
- * @throws OutOfRangeException
- */
- public function offsetUnset($index)
- {
- if (!$this->offsetExists($index)) {
- throw OutOfRangeException(sprintf('Invalid index ("%s") specified', $index));
- }
- unset($this->data[$index]);
- $this->stack = false;
- $this->count--;
- }
- /**
- * Pop a node from the end of the stack
- *
- * @return mixed
- * @throws RuntimeException
- */
- public function pop()
- {
- $val = array_pop($this->data);
- $this->stack = false;
- $this->count--;
- return $val;
- }
- /**
- * Move the iterator to the previous node
- *
- * @todo Does this need to be implemented?
- * @return void
- */
- public function prev()
- {
- }
- /**
- * Push an element to the list
- *
- * @param mixed $value
- * @return void
- */
- public function push($value)
- {
- array_push($this->data, $value);
- $this->count++;
- $this->stack = false;
- }
- /**
- * Iterator: rewind to beginning of stack
- *
- * @return void
- */
- public function rewind()
- {
- if (is_array($this->stack)) {
- return reset($this->stack);
- }
- $this->stack = array_reverse($this->data, true);
- }
- /**
- * Serialize the storage
- *
- * @return string
- */
- public function serialize()
- {
- return serialize($this->data);
- }
- /**
- * Shifts a node from the beginning of the list
- *
- * @return mixed
- * @throws RuntimeException
- */
- public function shift()
- {
- $val = array_shift($this->data);
- $this->stack = false;
- $this->count--;
- return $val;
- }
- /**
- * Peek at the top node of the stack
- *
- * @return mixed
- */
- public function top()
- {
- $this->rewind();
- $value = array_shift($this->stack);
- array_unshift($this->stack, $value);
- return $value;
- }
- /**
- * Unserialize the storage
- *
- * @param string
- * @return void
- */
- public function unserialize($serialized)
- {
- $this->data = unserialize($serialized);
- $this->stack = false;
- }
- /**
- * Unshift a node onto the beginning of the list
- *
- * @param mixed $value
- * @return void
- */
- public function unshift($value)
- {
- array_unshift($this->data, $value);
- $this->count++;
- $this->stack = false;
- }
-
- /**
- * Iterator: is the current pointer valid?
- *
- * @return bool
- */
- public function valid()
- {
- $key = key($this->stack);
- $var = ($key !== null && $key !== false);
- return $var;
- }
- }
- }
- /**
- * Collection of signal handler return values
- *
- * @category Zend
- * @package Zend_EventManager
- * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- */
- class Zend_EventManager_ResponseCollection extends SplStack
- {
- protected $stopped = false;
- /**
- * Did the last response provided trigger a short circuit of the stack?
- *
- * @return bool
- */
- public function stopped()
- {
- return $this->stopped;
- }
- /**
- * Mark the collection as stopped (or its opposite)
- *
- * @param bool $flag
- * @return Zend_EventManager_ResponseCollection
- */
- public function setStopped($flag)
- {
- $this->stopped = (bool) $flag;
- return $this;
- }
- /**
- * Convenient access to the first handler return value.
- *
- * @return mixed The first handler return value
- */
- public function first()
- {
- return parent::bottom();
- }
- /**
- * Convenient access to the last handler return value.
- *
- * If the collection is empty, returns null. Otherwise, returns value
- * returned by last handler.
- *
- * @return mixed The last handler return value
- */
- public function last()
- {
- if (count($this) === 0) {
- return null;
- }
- return parent::top();
- }
- /**
- * Check if any of the responses match the given value.
- *
- * @param mixed $value The value to look for among responses
- */
- public function contains($value)
- {
- foreach ($this as $response) {
- if ($response === $value) {
- return true;
- }
- }
- return false;
- }
- }
|