From: Roland Haeder Date: Fri, 23 May 2014 23:02:25 +0000 (+0200) Subject: Possible implementation for next(). X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=5687a636c1b62e9790ba6fb067ab86969de3d867;p=core.git Possible implementation for next(). Signed-off-by: Roland Häder --- diff --git a/inc/classes/main/decorator/cache/.htaccess b/inc/classes/main/decorator/cache/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/decorator/cache/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/iterator/io/class_FileIoIterator.php b/inc/classes/main/iterator/io/class_FileIoIterator.php index 12cf82ea..736280a3 100644 --- a/inc/classes/main/iterator/io/class_FileIoIterator.php +++ b/inc/classes/main/iterator/io/class_FileIoIterator.php @@ -22,6 +22,16 @@ * 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 * @@ -53,19 +63,61 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato 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 () { - // Default is null - $current = null; - - $this->partialStub('Please implement this method.'); - // Return it - return $current; + return $this->currentBlock; } /** @@ -84,7 +136,37 @@ class FileIoIterator extends BaseIterator implements SeekableWritableFileIterato * @return void */ public function next () { - $this->partialStub('Please implement this method.'); + // 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->getBlockInstance()->isBlockSeparatorFound($data)) { + // Then read the block + $data .= $this->read($length); + } // END - if + + /* + * Init back-buffer which is the data that has been found beyond the + * separator. + */ + $this->initBackBuffer(); + + // Separate data + $dataArray = explode($this->getBlockInstance()->getBlockSeparator(), $data); + + // Left part is the actual block, right one the back-buffer data + $this->setCurrentBlock($dataArray[0]); + $this->setBackBuffer($dataArray[1]); } /**