made a optimization when a loop iterator also implements Countable
authorfabien <fabien@93ef8e89-cb99-4229-a87c-7fa0fa45744b>
Sun, 8 Nov 2009 08:22:36 +0000 (08:22 +0000)
committerfabien <fabien@93ef8e89-cb99-4229-a87c-7fa0fa45744b>
Sun, 8 Nov 2009 08:22:36 +0000 (08:22 +0000)
git-svn-id: http://svn.twig-project.org/trunk@120 93ef8e89-cb99-4229-a87c-7fa0fa45744b

lib/Twig/runtime.php
test/fixtures/tags/for/objects.test
test/fixtures/tags/for/objects_countable.test [new file with mode: 0644]
test/unit/integrationTest.php

index f9a06f9..3eaab71 100644 (file)
@@ -185,7 +185,7 @@ function twig_iterator_to_array($seq)
   }
   elseif (is_object($seq) && $seq instanceof Traversable)
   {
-    return iterator_to_array($seq);
+    return $seq instanceof Countable ? $seq : iterator_to_array($seq);
   }
   else
   {
index e812eb6..5e328ca 100644 (file)
@@ -3,6 +3,10 @@
 --TEMPLATE--
 {% for item in items %}
   * {{ item }}
+  * {{ loop.index }}/{{ loop.index0 }}
+  * {{ loop.revindex }}/{{ loop.revindex0 }}
+  * {{ loop.first }}/{{ loop.last }}/{{ loop.length }}
+
 {% endfor %}
 
 {% for key, value in items|items %}
@@ -25,7 +29,15 @@ class ItemsIterator implements Iterator
 return array('items' => new ItemsIterator())
 --EXPECT--
   * bar
+  * 1/0
+  * 2/1
+  * 1//2
+
   * foo
+  * 2/1
+  * 1/0
+  * /1/2
+
 
   * foo/bar
   * bar/foo
diff --git a/test/fixtures/tags/for/objects_countable.test b/test/fixtures/tags/for/objects_countable.test
new file mode 100644 (file)
index 0000000..ef88b5e
--- /dev/null
@@ -0,0 +1,35 @@
+--TEST--
+"for" tag iterates over iterable and countable objects
+--TEMPLATE--
+{% for item in items %}
+  * {{ item }}
+{% endfor %}
+
+{% for key, value in items|items %}
+  * {{ key }}/{{ value }}
+{% endfor %}
+
+{% for key in items|keys %}
+  * {{ key }}
+{% endfor %}
+--DATA--
+class ItemsIteratorCountable implements Iterator, Countable
+{
+  protected $values = array('foo' => 'bar', 'bar' => 'foo');
+  public function current() { return current($this->values); }
+  public function key() { return key($this->values); }
+  public function next() { return next($this->values); }
+  public function rewind() { return reset($this->values); }
+  public function valid() { return false !== current($this->values); }
+  public function count() { return count($this->values); }
+}
+return array('items' => new ItemsIterator())
+--EXPECT--
+  * bar
+  * foo
+
+  * foo/bar
+  * bar/foo
+
+  * foo
+  * bar
index 688b6d8..43785b4 100644 (file)
@@ -35,7 +35,7 @@ class Foo
   }
 }
 
-$t = new LimeTest(50);
+$t = new LimeTest(51);
 $fixturesDir = realpath(dirname(__FILE__).'/../fixtures/');
 
 foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixturesDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file)