helly           Wed Sep 14 23:38:04 2005 EDT

  Added files:                 (Branch: PHP_5_1)
    /php-src/ext/spl/examples   recursivearrayiterator.inc 
    /php-src/ext/spl/internal   recursivefilteriterator.inc 
                                splobjectstorage.inc 
    /php-src/ext/spl/tests      observer_002.phpt 
  Log:
  - MFH: Add new files
  

http://cvs.php.net/co.php/php-src/ext/spl/examples/recursivearrayiterator.inc?r=1.1&p=1
Index: php-src/ext/spl/examples/recursivearrayiterator.inc
+++ php-src/ext/spl/examples/recursivearrayiterator.inc

http://cvs.php.net/co.php/php-src/ext/spl/internal/recursivefilteriterator.inc?r=1.1&p=1
Index: php-src/ext/spl/internal/recursivefilteriterator.inc
+++ php-src/ext/spl/internal/recursivefilteriterator.inc
<?php

/** @file recursivefilteriterator.inc
 * @ingroup SPL
 * @brief class RecursiveFilterIterator
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/**
 * @brief   Iterator to filter recursive iterators
 * @author  Marcus Boerger
 * @version 1.0
 * @since PHP 6.0
 *
 * This extended FilterIterator allows a recursive iteration using 
 * RecursiveIteratorIterator that only shows those elements which
 * are accepted. It is of course better to filter before doing the 
 * recursion since it allows to prevent recursion into children that 
 * get declined later anyway.
 */
class RecursiveFilterIterator extends FilterIterator implements 
RecursiveIterator
{
        /** @param $it the RecursiveIterator to filter
         */
        function __construct(RecursiveIterator $it)
        {
                parent::__construct($it);
        }
        
        /** @return whether the current element has children
         */
        function hasChildren()
        {
                return $this->it->hasChildren();
        }

        /** @return the ParentIterator for the current elements children
         */
        function getChildren()
        {
                return new RecursiveFilterIterator($this->it->getChildren());
        }
}

?>
http://cvs.php.net/co.php/php-src/ext/spl/internal/splobjectstorage.inc?r=1.1&p=1
Index: php-src/ext/spl/internal/splobjectstorage.inc
+++ php-src/ext/spl/internal/splobjectstorage.inc
<?php

/** @file splobjectstorage.inc
 * @ingroup SPL
 * @brief class SplObjectStorage
 * @author  Marcus Boerger
 * @date    2003 - 2005
 *
 * SPL - Standard PHP Library
 */

/**
 * @brief   Object storage
 * @author  Marcus Boerger
 * @version 1.0
 * @since PHP 6.0
 *
 * This container allows to store objects uniquly without the need to compare
 * them one by one. This is only possible internally. The code represenation
 * here therefore has a complexity of O(n) while the actual implementation has
 * complexity O(1).
 */
class SplObjectStorage implements Iterator, Countable
{
        private $storage = array();
        private $index = 0;

        /** Rewind to top iterator as set in constructor
         */
        function rewind()
        {
                rewind($this->storage);
        }
        
        /** @return whether iterator is valid
         */
        function valid()
        {
                return key($this->storage) !== false;
        }
        
        /** @return current key
         */
        function key()
        {
                return $this->index;
        }
        
        /** @return current object
         */
        function current()
        {
                return current($this->storage);
        }
        
        /** Forward to next element
         */
        function next()
        {
                next($this->storage);
                $this->index++;
        }

        /** @return number of objects in storage
         */
        function count()
        {
                return count($this->storage);
        }

        /** @obj object to look for
         * @return whether $obj is contained in storage
          */
        function contains($obj)
        {
                if (is_object($obj))
                {
                        foreach($this->storage as $object)
                        {
                                if ($object === $obj)
                                {
                                        return true;
                                }
                        }
                }
                return false;
        }

        /** @param $obj new object to attach to storage if not yet contained
         */
        function attach($obj)
        {
                if (is_object($obj) && !$this->contains($obj))
                {
                        $this->storage[] = $obj;
                }
        }

        /** @param $obj object to remove from storage
         */
        function detach($obj)
        {
                if (is_object($obj))
                {
                        foreach($this->storage as $idx => $object)
                        {
                                if ($object === $obj)
                                {
                                        unset($this->storage[$idx]);
                                        $this->rewind();
                                        return;
                                }
                        }
                }
        }
}

?>
http://cvs.php.net/co.php/php-src/ext/spl/tests/observer_002.phpt?r=1.1&p=1
Index: php-src/ext/spl/tests/observer_002.phpt
+++ php-src/ext/spl/tests/observer_002.phpt
--TEST--
SPL: SplObjectStorage
--FILE--
<?php

class MyObjectStorage extends SplObjectStorage
{
        function rewind()
        {
                echo __METHOD__ . "()\n";
                parent::rewind();
        }

        function valid()
        {
                echo __METHOD__ . "(" . (parent::valid() ? 1 : 0) . ")\n";
                return parent::valid();
        }

        function key()
        {
                echo __METHOD__ . "(" . parent::key() . ")\n";
                return parent::key();
        }

        function current()
        {
                echo __METHOD__ . "(" . parent::current()->getName() . ")\n";
                return parent::current();
        }

        function next()
        {
                echo __METHOD__ . "()\n";
                parent::next();
        }
}

class ObserverImpl implements Observer
{
        protected $name = '';

        function __construct($name = 'obj')
        {
                $this->name = '$' . $name;
        }

        function update(Subject $subject)
        {
                echo $this->name . '->' . __METHOD__ . '(' . 
$subject->getName() . ");\n";
        }
        
        function getName()
        {
                return $this->name;
        }
}

class SubjectImpl implements Subject
{
        protected $name = '';
        protected $observers;

        function __construct($name = 'sub')
        {
                $this->observers = new MyObjectStorage;
                $this->name = '$' . $name;
        }

        function attach(Observer $observer)
        {
                echo $this->name . '->' . __METHOD__ . '(' . 
$observer->getName() . ");\n";
                $this->observers->attach($observer);
        }
        
        function detach(Observer $observer)
        {
                echo $this->name . '->' . __METHOD__ . '(' . 
$observer->getName() . ");\n";
                $this->observers->detach($observer);
        }
        
        function count()
        {
                return $this->observers->count();
        }
        
        function notify()
        {
                echo $this->name . '->' . __METHOD__ . "();\n";
                foreach($this->observers as $key => $observer)
                {
                        $observer->update($this);
                }
        }

        function getName()
        {
                return $this->name;
        }
        
        function contains($obj)
        {
                return $this->observers->contains($obj);
        }
}

$sub = new SubjectImpl;

$ob1 = new ObserverImpl("ob1");
$ob2 = new ObserverImpl("ob2");
$ob3 = new ObserverImpl("ob3");

var_dump($sub->contains($ob1));
$sub->attach($ob1);
var_dump($sub->contains($ob1));
$sub->attach($ob1);
$sub->attach($ob2);
$sub->attach($ob3);
var_dump($sub->count());

$sub->notify();

$sub->detach($ob3);
var_dump($sub->count());

$sub->notify();

$sub->detach($ob2);
$sub->detach($ob1);
var_dump($sub->count());

$sub->notify();

$sub->attach($ob3);
var_dump($sub->count());

$sub->notify();

?>
===DONE===
<?php exit(0); ?>
--EXPECT--
bool(false)
$sub->SubjectImpl::attach($ob1);
bool(true)
$sub->SubjectImpl::attach($ob1);
$sub->SubjectImpl::attach($ob2);
$sub->SubjectImpl::attach($ob3);
int(3)
$sub->SubjectImpl::notify();
MyObjectStorage::rewind()
MyObjectStorage::valid(1)
MyObjectStorage::current($ob1)
MyObjectStorage::key(0)
$ob1->ObserverImpl::update($sub);
MyObjectStorage::next()
MyObjectStorage::valid(1)
MyObjectStorage::current($ob2)
MyObjectStorage::key(1)
$ob2->ObserverImpl::update($sub);
MyObjectStorage::next()
MyObjectStorage::valid(1)
MyObjectStorage::current($ob3)
MyObjectStorage::key(2)
$ob3->ObserverImpl::update($sub);
MyObjectStorage::next()
MyObjectStorage::valid(0)
$sub->SubjectImpl::detach($ob3);
int(2)
$sub->SubjectImpl::notify();
MyObjectStorage::rewind()
MyObjectStorage::valid(1)
MyObjectStorage::current($ob1)
MyObjectStorage::key(0)
$ob1->ObserverImpl::update($sub);
MyObjectStorage::next()
MyObjectStorage::valid(1)
MyObjectStorage::current($ob2)
MyObjectStorage::key(1)
$ob2->ObserverImpl::update($sub);
MyObjectStorage::next()
MyObjectStorage::valid(0)
$sub->SubjectImpl::detach($ob2);
$sub->SubjectImpl::detach($ob1);
int(0)
$sub->SubjectImpl::notify();
MyObjectStorage::rewind()
MyObjectStorage::valid(0)
$sub->SubjectImpl::attach($ob3);
int(1)
$sub->SubjectImpl::notify();
MyObjectStorage::rewind()
MyObjectStorage::valid(1)
MyObjectStorage::current($ob3)
MyObjectStorage::key(0)
$ob3->ObserverImpl::update($sub);
MyObjectStorage::next()
MyObjectStorage::valid(0)
===DONE===

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to