X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fiterator%2Fio%2Fclass_FileIoIterator.php;h=5be1266347c17bf9fac6252a198e914e6e06f07a;hp=f2158c63eaf94a790caed9ebbb7ab3a08cc3ce4b;hb=55a804571db8f1fade4c0cd3149ea847a3a7002d;hpb=1fbd0c9e1a2548a025ef31b979e2aee55e0caa1f diff --git a/inc/classes/main/iterator/io/class_FileIoIterator.php b/inc/classes/main/iterator/io/class_FileIoIterator.php index f2158c63..5be12663 100644 --- a/inc/classes/main/iterator/io/class_FileIoIterator.php +++ b/inc/classes/main/iterator/io/class_FileIoIterator.php @@ -22,16 +22,6 @@ * along with this program. If not, see . */ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterator { - /** - * Back-buffer - */ - private $backBuffer = ''; - - /** - * Currently loaded block (will be returned by current()) - */ - private $currentBlock = ''; - /** * Protected constructor * @@ -46,78 +36,27 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato * Creates an instance of this class * * @param $pointerInstance An instance of a InputOutputPointer class - * @param $blockInstance An instance of a CalculatableBlock class * @return $iteratorInstance An instance of a Iterator class */ - public final static function createFileIoIterator (InputOutputPointer $pointerInstance, CalculatableBlock $blockInstance) { + public final static function createFileIoIterator (InputOutputPointer $pointerInstance) { // Get new instance $iteratorInstance = new FileIoIterator(); // Set the instance here $iteratorInstance->setPointerInstance($pointerInstance); - // Set the block instance here - $iteratorInstance->setBlockInstance($blockInstance); - // Return the prepared instance return $iteratorInstance; } - /** - * Initializes the back-buffer by setting it to an empty string. - * - * @return void - */ - private function initBackBuffer () { - // Simply call the setter - $this->setBackBuffer(''); - } - - /** - * Setter for backBuffer field - * - * @param $backBuffer Characters to "store" in back-buffer - * @return void - */ - private function setBackBuffer ($backBuffer) { - // Cast to string (so no arrays or objects) - $backBuffer = (string) $backBuffer; - - // ... and set it - $this->backBuffer = $backBuffer; - } - - /** - * Getter for backBuffer field - * - * @return $backBuffer Characters "stored" in back-buffer - */ - private function getBackBuffer () { - return $this->backBuffer; - } - - /** - * Setter for currentBlock field - * - * @param $currentBlock Characters to set a currently loaded block - * @return void - */ - private function setCurrentBlock ($currentBlock) { - // Cast to string (so no arrays or objects) - $currentBlock = (string) $currentBlock; - - // ... and set it - $this->currentBlock = $currentBlock; - } - /** * Gets currently read data * * @return $current Currently read data */ public function current () { - // Return it - return $this->currentBlock; + // Call pointer instance + return $this->getPointerInstance()->current(); } /** @@ -134,56 +73,10 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato * Advances to next "block" of bytes * * @return void - * @todo This method will load large but empty files in a whole */ public function next () { - // Is there nothing to read? - if (!$this->valid()) { - // Nothing to read - return; - } // END - if - - // First calculate minimum block length - $length = $this->getBlockInstance()->caluclateMinimumBlockLength(); - - // Short be more than zero! - assert($length > 0); - - // Wait until a entry/block separator has been found - $data = $this->getBackBuffer(); - while ((!$this->getPointerInstance()->isEndOfFileReached()) && (!$this->getBlockInstance()->isBlockSeparatorFound($data))) { - // Then read the block - $data .= $this->read($length); - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('data()=' . strlen($data)); - } // END - if - - // EOF reached? - if ($this->getPointerInstance()->isEndOfFileReached()) { - // Set whole data as current block - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('Calling setCurrentBlock(' . strlen($data) . ') ...'); - $this->setCurrentBlock($data); - - // Then abort here silently - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('EOF reached.'); - return; - } // END - if - - /* - * Init back-buffer which is the data that has been found beyond the - * separator. - */ - $this->initBackBuffer(); - - // Separate data - $dataArray = explode(self::getBlockSeparator(), $data); - - // This array must contain two elements - //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('dataArray=' . print_r($dataArray, TRUE)); - assert(count($dataArray) == 2); - - // Left part is the actual block, right one the back-buffer data - $this->setCurrentBlock($dataArray[0]); - $this->setBackBuffer($dataArray[1]); + // Call pointer instance + $this->getPointerInstance()->next(); } /** @@ -203,35 +96,8 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato * @return $isValid Whether the next entry is valid */ public function valid () { - // First calculate minimum block length - $length = $this->getBlockInstance()->caluclateMinimumBlockLength(); - - // Short be more than zero! - assert($length > 0); - - // Get current seek position - $seekPosition = $this->key(); - - // Then try to read it - $data = $this->read($length); - - // If some bytes could be read, all is fine - $isValid = ((is_string($data)) && (strlen($data) > 0)); - - // Get header size - $headerSize = $this->getBlockInstance()->getHeaderSize(); - - // Is the seek position at or beyond the header? - if ($seekPosition >= $headerSize) { - // Seek back to old position - $this->seek($seekPosition); - } else { - // Seek directly behind the header - $this->seek($headerSize); - } - - // Return result - return $isValid; + // Call pointer instance + return $this->getPointerInstance()->valid(); } /**