Version 1
[yaffs-website] / vendor / symfony-cmf / routing / PagedRouteCollection.php
diff --git a/vendor/symfony-cmf/routing/PagedRouteCollection.php b/vendor/symfony-cmf/routing/PagedRouteCollection.php
new file mode 100644 (file)
index 0000000..ae02b6e
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+
+/*
+ * This file is part of the Symfony CMF package.
+ *
+ * (c) 2011-2015 Symfony CMF
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Cmf\Component\Routing;
+
+/**
+ * Provides a route collection which avoids having all routes in memory.
+ *
+ * Internally, this does load multiple routes over time using a
+ * PagedRouteProviderInterface $route_provider.
+ */
+class PagedRouteCollection implements \Iterator, \Countable
+{
+    /**
+     * @var PagedRouteProviderInterface
+     */
+    protected $provider;
+
+    /**
+     * Stores the amount of routes which are loaded in parallel and kept in
+     * memory.
+     *
+     * @var int
+     */
+    protected $routesBatchSize;
+
+    /**
+     * Contains the current item the iterator points to.
+     *
+     * @var int
+     */
+    protected $current = -1;
+
+    /**
+     * Stores the current loaded routes.
+     *
+     * @var \Symfony\Component\Routing\Route[]
+     */
+    protected $currentRoutes;
+
+    public function __construct(PagedRouteProviderInterface $pagedRouteProvider, $routesBatchSize = 50)
+    {
+        $this->provider = $pagedRouteProvider;
+        $this->routesBatchSize = $routesBatchSize;
+    }
+
+    /**
+     * Loads the next routes into the elements array.
+     *
+     * @param int $offset The offset used in the db query.
+     */
+    protected function loadNextElements($offset)
+    {
+        // If the last batch was smaller than the batch size, this means there
+        // are no more routes available.
+        if (isset($this->currentRoutes) && count($this->currentRoutes) < $this->routesBatchSize) {
+            $this->currentRoutes = array();
+        } else {
+            $this->currentRoutes = $this->provider->getRoutesPaged($offset, $this->routesBatchSize);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function current()
+    {
+        return current($this->currentRoutes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function next()
+    {
+        $result = next($this->currentRoutes);
+        if (false === $result) {
+            $this->loadNextElements($this->current + 1);
+        }
+        ++$this->current;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function key()
+    {
+        return key($this->currentRoutes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function valid()
+    {
+        return key($this->currentRoutes);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rewind()
+    {
+        $this->current = 0;
+        $this->currentRoutes = null;
+        $this->loadNextElements($this->current);
+    }
+
+    /**
+     * Gets the number of Routes in this collection.
+     *
+     * @return int The number of routes
+     */
+    public function count()
+    {
+        return $this->provider->getRoutesCount();
+    }
+}