| 
									
										
										
										
											2010-08-26 19:14:53 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * PHPExcel | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2012-03-03 21:29:01 +00:00
										 |  |  |  * Copyright (c) 2006 - 2012 PHPExcel | 
					
						
							| 
									
										
										
										
											2010-08-26 19:14:53 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License along with this library; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category   PHPExcel | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  |  * @package	PHPExcel | 
					
						
							| 
									
										
										
										
											2012-03-03 21:29:01 +00:00
										 |  |  |  * @copyright  Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  |  * @license	http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL | 
					
						
							|  |  |  |  * @version	##VERSION##, ##DATE##
 | 
					
						
							| 
									
										
										
										
											2010-08-26 19:14:53 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * PHPExcel_HashTable | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category   PHPExcel | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  |  * @package	PHPExcel | 
					
						
							| 
									
										
										
										
											2012-03-03 21:29:01 +00:00
										 |  |  |  * @copyright  Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel) | 
					
						
							| 
									
										
										
										
											2010-08-26 19:14:53 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | class PHPExcel_HashTable | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * HashTable elements | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @var array | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public $_items = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * HashTable key map | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @var array | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public $_keyMap = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Create a new PHPExcel_HashTable | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param	PHPExcel_IComparable[] $pSource	Optional source array to create HashTable from | 
					
						
							| 
									
										
										
										
											2012-11-26 18:01:15 +00:00
										 |  |  | 	 * @throws	PHPExcel_Exception | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	public function __construct($pSource = null) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2012-01-25 22:07:35 +00:00
										 |  |  | 		if ($pSource !== NULL) { | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  | 			// Create HashTable
 | 
					
						
							|  |  |  | 			$this->addFromSource($pSource); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Add HashTable items from source | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param	PHPExcel_IComparable[] $pSource	Source array to create HashTable from | 
					
						
							| 
									
										
										
										
											2012-11-26 18:01:15 +00:00
										 |  |  | 	 * @throws	PHPExcel_Exception | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	public function addFromSource($pSource = null) { | 
					
						
							|  |  |  | 		// Check if an array was passed
 | 
					
						
							|  |  |  | 		if ($pSource == null) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} else if (!is_array($pSource)) { | 
					
						
							| 
									
										
										
										
											2012-11-26 18:01:15 +00:00
										 |  |  | 			throw new PHPExcel_Exception('Invalid array parameter passed.'); | 
					
						
							| 
									
										
										
										
											2010-11-22 18:00:22 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		foreach ($pSource as $item) { | 
					
						
							|  |  |  | 			$this->add($item); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Add HashTable item | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param	PHPExcel_IComparable $pSource	Item to add | 
					
						
							|  |  |  | 	 * @throws	Exception | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function add(PHPExcel_IComparable $pSource = null) { | 
					
						
							|  |  |  | 		$hash = $pSource->getHashCode(); | 
					
						
							|  |  |  | 		if (!isset($this->_items[$hash])) { | 
					
						
							|  |  |  | 			$this->_items[$hash] = $pSource; | 
					
						
							|  |  |  | 			$this->_keyMap[count($this->_items) - 1] = $hash; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Remove HashTable item | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param	PHPExcel_IComparable $pSource	Item to remove | 
					
						
							|  |  |  | 	 * @throws	Exception | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function remove(PHPExcel_IComparable $pSource = null) { | 
					
						
							|  |  |  | 		$hash = $pSource->getHashCode(); | 
					
						
							|  |  |  | 		if (isset($this->_items[$hash])) { | 
					
						
							|  |  |  | 			unset($this->_items[$hash]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			$deleteKey = -1; | 
					
						
							|  |  |  | 			foreach ($this->_keyMap as $key => $value) { | 
					
						
							|  |  |  | 				if ($deleteKey >= 0) { | 
					
						
							|  |  |  | 					$this->_keyMap[$key - 1] = $value; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if ($value == $hash) { | 
					
						
							|  |  |  | 					$deleteKey = $key; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			unset($this->_keyMap[count($this->_keyMap) - 1]); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Clear HashTable | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function clear() { | 
					
						
							|  |  |  | 		$this->_items = array(); | 
					
						
							|  |  |  | 		$this->_keyMap = array(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Count | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @return int | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function count() { | 
					
						
							|  |  |  | 		return count($this->_items); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Get index for hash code | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param	string	$pHashCode | 
					
						
							|  |  |  | 	 * @return	int	Index | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getIndexForHashCode($pHashCode = '') { | 
					
						
							|  |  |  | 		return array_search($pHashCode, $this->_keyMap); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Get by index | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param	int	$pIndex | 
					
						
							|  |  |  | 	 * @return	PHPExcel_IComparable | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getByIndex($pIndex = 0) { | 
					
						
							|  |  |  | 		if (isset($this->_keyMap[$pIndex])) { | 
					
						
							|  |  |  | 			return $this->getByHashCode( $this->_keyMap[$pIndex] ); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Get by hashcode | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param	string	$pHashCode | 
					
						
							|  |  |  | 	 * @return	PHPExcel_IComparable | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function getByHashCode($pHashCode = '') { | 
					
						
							|  |  |  | 		if (isset($this->_items[$pHashCode])) { | 
					
						
							|  |  |  | 			return $this->_items[$pHashCode]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return null; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * HashTable to array | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @return PHPExcel_IComparable[] | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function toArray() { | 
					
						
							|  |  |  | 		return $this->_items; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-08-26 19:14:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Implement PHP __clone to create a deep clone, not just a shallow copy. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	public function __clone() { | 
					
						
							|  |  |  | 		$vars = get_object_vars($this); | 
					
						
							|  |  |  | 		foreach ($vars as $key => $value) { | 
					
						
							|  |  |  | 			if (is_object($value)) { | 
					
						
							|  |  |  | 				$this->$key = clone $value; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |