1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202:
<?php
/**
* @author stev leibelt <artodeto@bazzline.net>
* @since 2015-08-29
*/
namespace Net\Bazzline\Propel\Behavior\EntityInstantiator;
use ArrayAccess;
use Countable;
use Iterator;
use InvalidArgumentException;
class EntityCollection implements ArrayAccess, Countable, Iterator
{
/** @var array */
private $entityCollection;
/** @var array */
private $hashCollection;
public function __construct()
{
$this->entityCollection = [];
$this->hashCollection = [];
}
/**
* @param AbstractEntity $entity
* @throws InvalidArgumentException
*/
public function add(
AbstractEntity $entity
) {
$this->throwInvalidArgumentExceptionIfEntityWasAlreadyAdded($entity);
$this->entityCollection[] = $entity;
}
/**
* @param AbstractEntity $entity
* @throws InvalidArgumentException
*/
private function throwInvalidArgumentExceptionIfEntityWasAlreadyAdded(
AbstractEntity $entity
) {
$hash = sha1($entity->databaseName() . '_' . $entity->className());
if (isset($this->hashCollection[$hash])) {
throw new InvalidArgumentException(
'you are trying to add "' . $entity->className() .
'" twice for the database "' . $entity->databaseName() . '"'
);
}
$this->hashCollection[$hash] = $entity;
}
//begin of ArrayAccess
/**
* Whether a offset exists
* @link http://php.net/manual/en/arrayaccess.offsetexists.php
* @param mixed $offset <p>
* An offset to check for.
* </p>
* @return boolean true on success or false on failure.
* </p>
* <p>
* The return value will be casted to boolean if non-boolean was returned.
* @since 5.0.0
*/
public function offsetExists($offset)
{
return isset($this->entityCollection[$offset]);
}
/**
* Offset to retrieve
* @link http://php.net/manual/en/arrayaccess.offsetget.php
* @param mixed|AbstractEntity $offset <p>
* The offset to retrieve.
* </p>
* @return mixed Can return all value types.
* @since 5.0.0
*/
public function offsetGet($offset)
{
return ($this->offsetExists($offset))
? $this->entityCollection[$offset]
: null;
}
/**
* Offset to set
* @link http://php.net/manual/en/arrayaccess.offsetset.php
* @param mixed $offset <p>
* The offset to assign the value to.
* </p>
* @param mixed|AbstractEntity $value <p>
* The value to set.
* </p>
* @return void
* @since 5.0.0
*/
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->entityCollection[] = $value;
} else {
$this->entityCollection[$offset] = $value;
}
}
/**
* Offset to unset
* @link http://php.net/manual/en/arrayaccess.offsetunset.php
* @param mixed $offset <p>
* The offset to unset.
* </p>
* @return void
* @since 5.0.0
*/
public function offsetUnset($offset)
{
unset($this->entityCollection[$offset]);
}
//end of ArrayAccess
//begin of Countable
/**
* Count elements of an object
* @link http://php.net/manual/en/countable.count.php
* @return int The custom count as an integer.
* </p>
* <p>
* The return value is cast to an integer.
* @since 5.1.0
*/
public function count()
{
return count($this->entityCollection);
}
//end of Countable
//begin of Iterator
/**
* Return the current element
* @link http://php.net/manual/en/iterator.current.php
* @return mixed|AbstractEntity Can return any type.
* @since 5.0.0
*/
public function current()
{
return current($this->entityCollection);
}
/**
* Move forward to next element
* @link http://php.net/manual/en/iterator.next.php
* @return void Any returned value is ignored.
* @since 5.0.0
*/
public function next()
{
next($this->entityCollection);
}
/**
* Return the key of the current element
* @link http://php.net/manual/en/iterator.key.php
* @return mixed scalar on success, or null on failure.
* @since 5.0.0
*/
public function key()
{
return key($this->entityCollection);
}
/**
* Checks if current position is valid
* @link http://php.net/manual/en/iterator.valid.php
* @return boolean The return value will be casted to boolean and then evaluated.
* Returns true on success or false on failure.
* @since 5.0.0
*/
public function valid()
{
return (!is_null($this->key()));
}
/**
* Rewind the Iterator to the first element
* @link http://php.net/manual/en/iterator.rewind.php
* @return void Any returned value is ignored.
* @since 5.0.0
*/
public function rewind()
{
reset($this->entityCollection);
}
//end of Iterator
}