Skip to content
This repository has been archived by the owner on Jan 31, 2020. It is now read-only.

Commit

Permalink
Merge branch 'feature/5702' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
weierophinney committed Mar 4, 2014
228 parents d59cfa4 + bc15a3d + dc63637 + 29ea285 + c9418a6 + fdeb27b + c382628 + ee15e76 + 5f29760 + 714d1a8 + 84b0297 + cbc5f03 + 76361f8 + e7209df + 87630e0 + df43daf + f7d6cbb + 7e2b798 + 3ed1ead + 87505b6 + c229265 + eb61c8f + efcb00e + 0a0842f + b6d0c88 + 7edee62 + 60ea64c + a08bcca + b40ec3e + 63172ed + 448f428 + 92a516a + 5ecbc99 + a2df21b + 4de87f2 + 7c259ec + a22bdcb + 084ad9f + 9414e5a + 489be93 + cb39e7e + 54a28dc + c9c769e + dda791d + 70d382a + 8bbad0e + 9321185 + 7ab35a6 + b93694e + 3ea7087 + 0fe3d3a + bd5e189 + d1cba17 + 8d75392 + 3fb5b55 + 6cb0ccb + 30aa565 + 8409977 + 8074ba0 + 8f92486 + 94860d1 + 05d33c4 + 425826b + f0e91f0 + e31468f + 7d2af87 + 2e4dc80 + 19d128f + 1b9e4b2 + 1c46483 + fdda3f2 + 595fcd1 + 213395c + 8e514a8 + 2f30186 + bb4ed65 + 132d5b6 + 030ff33 + f2f20f3 + a50e133 + 4c554ee + dbfb1b8 + ccab83f + 00b350f + 78945d0 + f0e5f4b + ceb7d8c + 9e124d1 + 3de5912 + b6a974a + 10a6438 + cb6c1e7 + 18afd6c + 3baf1bd + c800904 + f52dcb8 + 126ccb2 + e7d6206 + e2d24ab + ec1abfc + 290ea90 + 9f4ca1b + edaa760 + c4c0c95 + d21f055 + 5b18029 + e6b97af + 010fb36 + 64c7b8d + 636523e + 4cc2cd6 + e34098a + 16367cd + 943c77f + 8226e5b + 0b47726 + 3cd8a03 + cc4782c + 9c653a6 + 656dbe5 + 9bce1ba + 7dc18ca + 861130d + 2d2ffbd + 4f413a5 + 2e1067a + 1d082e4 + e8aeb79 + b562091 + ff2fdc3 + 4aa72c0 + 1bb67ac + cd015c8 + 5e89910 + 0c21258 + dd54faf + 57f9063 + b88ce2e + af68643 + 06cd3b4 + 2c71b71 + ee02c35 + 9456314 + 5a77a7b + e98a077 + 738f2e6 + cb1e63c + 736df07 + d0a0154 + 990523c + 78687de + a5b6e79 + 6e9dfe9 + e201a1c + d9b45ef + 76222ad + 16d67da + 1ab2258 + b81d711 + ed2e9bc + 61efe82 + f353ea5 + 1f02519 + 58c1fe8 + ed502d9 + 2defba6 + 4885013 + 06a8384 + 17d9eed + 3b21b5d + c62101c + 909ef34 + 13d376a + 8a75367 + 98a3cf5 + 270f2c4 + 3038cfa + 1112202 + c8fb359 + 8d37cd0 + 4d868a7 + 555cb91 + 7ac5858 + 8103f1f + 9fe9c96 + a3ecac6 + 10e77c1 + e0d3e13 + 19ad608 + e0d665c + 1a5b402 + 56ae12a + 9073fc1 + 2d5b32f + a8e6198 + 83e8f34 + 30eb247 + 6204c2f + c3855a9 + 543aa17 + f1fa08d + 3750c0c + d0aa8c2 + 9d1f331 + 759b848 + 9c877e4 + ce5f388 + e314683 + 6963d1a + fab8999 + ddcee37 + 7ec8299 + e82ce3a + d0404ad + 4d959cc + e8630f2 + 1538989 + 296eaf1 + e641cb1 + 323c1d3 + 9533f1f + ef57787 + 8ae0a38 + 6657060 + 4a48121 + bcf90f8 + d3c1fcd + c779528 commit 7691387
Show file tree
Hide file tree
Showing 2 changed files with 461 additions and 0 deletions.
263 changes: 263 additions & 0 deletions src/PriorityList.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\Stdlib;

use Countable;
use Iterator;

/**
* Priority list
*/
class PriorityList implements Iterator, Countable
{
const EXTR_DATA = 0x00000001;
const EXTR_PRIORITY = 0x00000002;
const EXTR_BOTH = 0x00000003;
/**
* Internal list of all items.
*
* @var array
*/
protected $items = array();

/**
* Serial assigned to items to preserve LIFO.
*
* @var int
*/
protected $serial = 0;

/**
* Serial order mode
* @var integer
*/
protected $isLIFO = 1;

/**
* Internal counter to avoid usage of count().
*
* @var int
*/
protected $count = 0;

/**
* Whether the list was already sorted.
*
* @var bool
*/
protected $sorted = false;

/**
* Insert a new item.
*
* @param string $name
* @param mixed $value
* @param int $priority
* @return void
*/
public function insert($name, $value, $priority = 0)
{
$this->sorted = false;
$this->count++;

$this->items[$name] = array(
'data' => $value,
'priority' => (int) $priority,
'serial' => $this->serial++,
);
}

public function setPriority($name, $priority)
{
if (!isset($this->items[$name])) {
throw new \Exception("item $name not found");
}
$this->items[$name]['priority'] = (int) $priority;
$this->sorted = false;
return $this;
}

/**
* Remove a item.
*
* @param string $name
* @return void
*/
public function remove($name)
{
if (!isset($this->items[$name])) {
return;
}

$this->count--;
unset($this->items[$name]);
}

/**
* Remove all items.
*
* @return void
*/
public function clear()
{
$this->items = array();
$this->serial = 0;
$this->count = 0;
$this->sorted = false;
}

/**
* Get a item.
*
* @param string $name
* @return mixed
*/
public function get($name)
{
if (!isset($this->items[$name])) {
return null;
}

return $this->items[$name]['data'];
}

/**
* Sort all items.
*
* @return void
*/
protected function sort()
{
if (!$this->sorted) {
uasort($this->items, array($this, 'compare'));
$this->sorted = true;
}
}

/**
* Compare the priority of two items.
*
* @param array $item1,
* @param array $item2
* @return int
*/
protected function compare(array $item1, array $item2)
{
return ($item1['priority'] === $item2['priority'])
? ($item1['serial'] > $item2['serial'] ? -1 : 1) * $this->isLIFO
: ($item1['priority'] > $item2['priority'] ? -1 : 1);
}

/**
* Get/Set serial order mode
*
* @param bool $flag
* @return bool
*/
public function isLIFO($flag = null)
{
if ($flag !== null) {
if (($flag = ($flag === true ? 1 : -1)) !== $this->isLIFO) {
$this->isLIFO = $flag;
$this->sorted = false;
}
}
return $this->isLIFO === 1;
}

/**
* rewind(): defined by Iterator interface.
*
* @see Iterator::rewind()
* @return void
*/
public function rewind()
{
$this->sort();
reset($this->items);
}

/**
* current(): defined by Iterator interface.
*
* @see Iterator::current()
* @return mixed
*/
public function current()
{
$node = current($this->items);
return ($node !== false ? $node['data'] : false);
}

/**
* key(): defined by Iterator interface.
*
* @see Iterator::key()
* @return string
*/
public function key()
{
return key($this->items);
}

/**
* next(): defined by Iterator interface.
*
* @see Iterator::next()
* @return mixed
*/
public function next()
{
$node = next($this->items);
return ($node !== false ? $node['data'] : false);
}

/**
* valid(): defined by Iterator interface.
*
* @see Iterator::valid()
* @return bool
*/
public function valid()
{
return ($this->current() !== false);
}

/**
* count(): defined by Countable interface.
*
* @see Countable::count()
* @return int
*/
public function count()
{
return $this->count;
}

/**
* Return list as array
*
* @param type $raw
* @return array
*/
public function toArray($flag = self::EXTR_DATA)
{
$this->sort();
if ($flag == self::EXTR_BOTH) {
return $this->items;
}
return array_map(
($flag == self::EXTR_PRIORITY)
? function ($item) { return $item['priority']; }
: function ($item) { return $item['data']; },
$this->items
);
}
}
Loading

0 comments on commit 7691387

Please # to comment.