Make the Grantlee::Node::render method const.
[grantlee:grantlee.git] / templates / defaulttags / cycle.h
1 /*
2   This file is part of the Grantlee template system.
3
4   Copyright (c) 2009,2010 Stephen Kelly <steveire@gmail.com>
5
6   This library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Lesser General Public
8   License as published by the Free Software Foundation; either version
9   2.1 of the Licence, or (at your option) any later version.
10
11   This library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with this library.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21 #ifndef CYCLENODE_H
22 #define CYCLENODE_H
23
24 #include "node.h"
25
26 using namespace Grantlee;
27
28 class CycleNodeFactory : public AbstractNodeFactory
29 {
30   Q_OBJECT
31 public:
32   CycleNodeFactory();
33
34   Node* getNode( const QString &tagContent, Parser *p ) const;
35
36 };
37
38 /**
39 Cycles endlessly over elements.
40 */
41 template <typename T>
42 class RingIterator
43 {
44 public:
45   RingIterator<T>()
46   {
47
48   }
49
50   RingIterator<T>( const QList<T> &list )
51       : m_begin( list.constBegin() ), m_it( list.constBegin() ), m_end( list.constEnd() )
52   {
53     Q_ASSERT( !list.isEmpty() );
54   }
55
56   /**
57     Returns the next element in the list, or the first element if already
58     at the last element.
59   */
60   T next() {
61     Q_ASSERT( m_it != m_end );
62
63     const T t = *m_it++;
64     if ( m_it == m_end )
65       m_it = m_begin;
66     return t;
67   }
68
69 private:
70   typename QList<T>::const_iterator m_begin;
71   typename QList<T>::const_iterator m_it;
72   typename QList<T>::const_iterator m_end;
73 };
74
75 typedef RingIterator<FilterExpression> FilterExpressionRotator;
76
77 Q_DECLARE_METATYPE( FilterExpressionRotator )
78
79 class CycleNode : public Node
80 {
81   Q_OBJECT
82 public:
83   CycleNode( const QList<FilterExpression> &list, const QString &name, QObject *parent = 0 );
84
85   void render( OutputStream *stream, Context *c ) const;
86
87 private:
88   const QList<FilterExpression> m_list;
89   FilterExpressionRotator m_variableIterator;
90   const QString m_name;
91 };
92
93 #endif
94