*
  • {@link ezcCacheStackLruMetaData}
  • *
  • {@link ezcCacheStackLfuMetaData}
  • * * * Private to not expose internal APIs, yet. Might become public in future * releases. * * @package Cache * @version 1.4beta1 * * @access private */ abstract class ezcCacheStackBaseMetaData implements ezcCacheStackMetaData { /** * Replacement data. * * * array( * '' => , * '' => , * '' => , * // ... * ) * * * @var array(string=>int) */ protected $replacementData = array(); /** * Storage-item assignement. * * * array( * '' => array( * '' => true, * '' => true, * '' => true, * // ... * ), * '' => array( * '' => true, * '' => true, * '' => true, * // ... * ), * // ... * ) * * * @var array(string=>array(string=>bool)) */ protected $storageData = array(); /** * No-parameter constructor. * */ public function __construct() { } /** * Adds the given $itemId to the storage identified by $storageId. * * This method adds the given $itemId to the storage identified by * $storageId. It must also add the $itemId to the replacement data or * update its status there, if the item is already in there. * * The method calls the abstract {@link self::addItemToReplacementData()} * method to make the item be reflected in the replacement data. * * @param string $storageId * @param string $itemId */ public function addItem( $storageId, $itemId ) { $this->storageData[$storageId][$itemId] = true; // Abstract call $this->addItemToReplacementData( $itemId ); } /** * Adds the given $itemId to the replacement data. * * This method is called by {@link self::addItem()} in order to add the * given $itemId to the replacement data in the correct way. When this * method is called, the item has already been added to the storage data. * The removal from the replacement data happens automatically in {@link * self::removeItem()} by unsetting the key $itemId in * {self::$replacementData}. * * If the entry for $itemId already exists, it must be updated to reflect a * touching of the data (store/restore). * * @param string $itemId */ abstract public function addItemToReplacementData( $itemId ); /** * Removes the given $itemId from the storage identified by $storageId. * * Removes the given $itemId from the storage identified by $storageId in * {@link self::$storageData} and also removes the key from {@link * self::$metaData}. * * @param string $storageId * @param string $itemId */ public function removeItem( $storageId, $itemId ) { // Remove from storage if ( isset( $this->storageData[$storageId] ) ) { // No error if not set unset( $this->storageData[$storageId][$itemId] ); // Remove empty storage if ( count( $this->storageData[$storageId] ) === 0 ) { unset( $this->storageData[$storageId] ); } } // Check for complete removal foreach ( $this->storageData as $storage => $items ) { if ( isset( $items[$itemId] ) ) { // Item is available in other storage return; } } // No storage has the item, savely unset it unset( $this->replacementData[$itemId] ); } /** * Returns if the given $itemId is available in the storage with $storageId. * * Returns if the $itemId is availalke in the storage that is identified by * $storageId. * * @param string $storageId * @param string $itemId * @return bool */ public function hasItem( $storageId, $itemId ) { return isset( $this->storageData[$storageId][$itemId] ); } /** * Returns if the given $storageId has reached the given $limit of items. * * Returns if the storage identified by $storageId has $limit or more items * stored. * * @param string $storageId * @param int $limit * @return bool */ public function reachedItemLimit( $storageId, $limit ) { return ( isset( $this->storageData[$storageId] ) && count( $this->storageData[$storageId] ) >= $limit ); } /** * Returns an array of item IDs ordered in replacement order. * * This method sorts {@link asort()} the {@link self::$replacementData} and * returns it. The data is ordered by the replacement value in ascending * order. * * @return array(string=>int) */ public function getReplacementItems() { asort( $this->replacementData ); return $this->replacementData; } /** * Returns the data data as an array. * * @return array */ public function getState() { return array( 'replacementData' => $this->replacementData, 'storageData' => $this->storageData, ); } /** * Sets the intrnal data from the given array $data. * * The $data array was previously generated by {@link self::getState()}. * * @param array $data */ public function setState( array $data ) { $this->replacementData = $data['replacementData']; $this->storageData = $data['storageData']; } } ?>