This repository has been archived by the owner on Jan 31, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 75
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'feature/5702' into develop
- Loading branch information
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
Showing
2 changed files
with
461 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
); | ||
} | ||
} |
Oops, something went wrong.