diff options
author | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2014-03-09 22:37:41 +0100 |
---|---|---|
committer | Emiel Bruijntjes <emiel.bruijntjes@copernica.com> | 2014-03-09 22:37:41 +0100 |
commit | 49d88d98a0656233f15923d31ea67a1ed229e514 (patch) | |
tree | 04bb753e4d5434c46bd90048e52d22260052334d /src/classbase.cpp | |
parent | bdca5b0454534413f10d13211885c086fafff35a (diff) |
work in progress on iterators
Diffstat (limited to 'src/classbase.cpp')
-rw-r--r-- | src/classbase.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/classbase.cpp b/src/classbase.cpp index fe08bd1..8926b3e 100644 --- a/src/classbase.cpp +++ b/src/classbase.cpp @@ -359,6 +359,30 @@ zend_object_value ClassBase::createObject(zend_class_entry *entry TSRMLS_DC) } /** + * Function to create a new iterator to iterate over an object + * @param entry The class entry + * @param object The object to iterate over + * @param by_ref ????? + * @return zend_object_iterator* Pointer to the iterator + */ +zend_object_iterator *ClassBase::getIterator(zend_class_entry *entry, zval *object, int by_ref) +{ + std::cout << "call to getIterator" << std::endl; + + // by-ref is not possible (copied from SPL) + if (by_ref) throw Php::Exception("Foreach by ref is not possible"); + + // retrieve the traversable object + Traversable *traversable = dynamic_cast<Traversable*>(cpp_object(object)); + + // create an iterator + auto *iterator = traversable->getIterator(); + + // return the implementation + return iterator->implementation(); +} + +/** * Destructor */ ClassBase::~ClassBase() @@ -436,6 +460,10 @@ void ClassBase::initialize(const std::string &prefix) // we need a special constructor entry.create_object = &ClassBase::createObject; + // and a special function for retrieving the iterator (but only if this is + // a traversable class) + if (traversable()) entry.get_iterator = &ClassBase::getIterator; + // register the class _entry = zend_register_internal_class(&entry TSRMLS_CC); |