Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / src / declarative / qml / ftw / qrecyclepool_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the QtDeclarative module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QRECYCLEPOOL_P_H
43 #define QRECYCLEPOOL_P_H
44
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55
56 QT_BEGIN_NAMESPACE
57
58 #define QRECYCLEPOOLCOOKIE 0x33218ADF
59
60 template<typename T, int Step>
61 class QRecyclePoolPrivate
62 {
63 public:
64     QRecyclePoolPrivate()
65     : recyclePoolHold(true), outstandingItems(0), cookie(QRECYCLEPOOLCOOKIE),
66       currentPage(0), nextAllocated(0)
67     {
68     }
69
70     bool recyclePoolHold;
71     int outstandingItems;
72     quint32 cookie;
73
74     struct PoolType : public T {
75         union {
76             QRecyclePoolPrivate<T, Step> *pool;
77             PoolType *nextAllocated;
78         };
79     };
80
81     struct Page {
82         Page *nextPage;
83         unsigned int free;
84         union {
85             char array[Step * sizeof(PoolType)];
86             qint64 q_for_alignment_1;
87             double q_for_alignment_2;
88         };
89     };
90
91     Page *currentPage;
92     PoolType *nextAllocated;
93
94     inline T *allocate();
95     static inline void dispose(T *);
96     inline void releaseIfPossible();
97 };
98
99 template<typename T, int Step = 1024>
100 class QRecyclePool
101 {
102 public:
103     inline QRecyclePool();
104     inline ~QRecyclePool();
105
106     inline T *New();
107     template<typename T1>
108     inline T *New(const T1 &);
109     template<typename T1>
110     inline T *New(T1 &);
111
112     static inline void Delete(T *);
113
114 private:
115     QRecyclePoolPrivate<T, Step> *d;
116 };
117
118 template<typename T, int Step>
119 QRecyclePool<T, Step>::QRecyclePool()
120 : d(new QRecyclePoolPrivate<T, Step>())
121 {
122 }
123
124 template<typename T, int Step>
125 QRecyclePool<T, Step>::~QRecyclePool()
126 {
127     d->recyclePoolHold = false;
128     d->releaseIfPossible();
129 }
130
131 template<typename T, int Step>
132 T *QRecyclePool<T, Step>::New()
133 {
134     T *rv = d->allocate();
135     new (rv) T;
136     return rv;
137 }
138
139 template<typename T, int Step>
140 template<typename T1>
141 T *QRecyclePool<T, Step>::New(const T1 &a)
142 {
143     T *rv = d->allocate();
144     new (rv) T(a);
145     return rv;
146 }
147
148 template<typename T, int Step>
149 template<typename T1>
150 T *QRecyclePool<T, Step>::New(T1 &a)
151 {
152     T *rv = d->allocate();
153     new (rv) T(a);
154     return rv;
155 }
156
157 template<typename T, int Step>
158 void QRecyclePool<T, Step>::Delete(T *t)
159 {
160     t->~T();
161     QRecyclePoolPrivate<T, Step>::dispose(t);
162 }
163
164 template<typename T, int Step>
165 void QRecyclePoolPrivate<T, Step>::releaseIfPossible()
166 {
167     if (recyclePoolHold || outstandingItems)
168         return;
169
170     Page *p = currentPage;
171     while (p) {
172         Page *n = p->nextPage;
173         qFree(p);
174         p = n;
175     }
176
177     delete this;
178 }
179
180 template<typename T, int Step>
181 T *QRecyclePoolPrivate<T, Step>::allocate()
182 {
183     PoolType *rv = 0;
184     if (nextAllocated) {
185         rv = nextAllocated;
186         nextAllocated = rv->nextAllocated;
187     } else if (currentPage && currentPage->free) {
188         rv = (PoolType *)(currentPage->array + (Step - currentPage->free) * sizeof(PoolType));
189         currentPage->free--;
190     } else {
191         Page *p = (Page *)qMalloc(sizeof(Page));
192         p->nextPage = currentPage;
193         p->free = Step;
194         currentPage = p;
195
196         rv = (PoolType *)currentPage->array;
197         currentPage->free--;
198     }
199
200     rv->pool = this;
201     ++outstandingItems;
202     return rv;
203 }
204
205 template<typename T, int Step>
206 void QRecyclePoolPrivate<T, Step>::dispose(T *t)
207 {
208     PoolType *pt = static_cast<PoolType *>(t);
209     Q_ASSERT(pt->pool && pt->pool->cookie == QRECYCLEPOOLCOOKIE);
210
211     QRecyclePoolPrivate<T, Step> *This = pt->pool;
212     pt->nextAllocated = This->nextAllocated;
213     This->nextAllocated = pt;
214     --This->outstandingItems;
215     This->releaseIfPossible();
216 }
217
218 QT_END_NAMESPACE
219
220 #endif // QRECYCLEPOOL_P_H