1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the QtDeclarative module of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
42 #ifndef QRECYCLEPOOL_P_H
43 #define QRECYCLEPOOL_P_H
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.
58 #define QRECYCLEPOOLCOOKIE 0x33218ADF
60 template<typename T, int Step>
61 class QRecyclePoolPrivate
65 : recyclePoolHold(true), outstandingItems(0), cookie(QRECYCLEPOOLCOOKIE),
66 currentPage(0), nextAllocated(0)
74 struct PoolType : public T {
76 QRecyclePoolPrivate<T, Step> *pool;
77 PoolType *nextAllocated;
85 char array[Step * sizeof(PoolType)];
86 qint64 q_for_alignment_1;
87 double q_for_alignment_2;
92 PoolType *nextAllocated;
95 static inline void dispose(T *);
96 inline void releaseIfPossible();
99 template<typename T, int Step = 1024>
103 inline QRecyclePool();
104 inline ~QRecyclePool();
107 template<typename T1>
108 inline T *New(const T1 &);
109 template<typename T1>
112 static inline void Delete(T *);
115 QRecyclePoolPrivate<T, Step> *d;
118 template<typename T, int Step>
119 QRecyclePool<T, Step>::QRecyclePool()
120 : d(new QRecyclePoolPrivate<T, Step>())
124 template<typename T, int Step>
125 QRecyclePool<T, Step>::~QRecyclePool()
127 d->recyclePoolHold = false;
128 d->releaseIfPossible();
131 template<typename T, int Step>
132 T *QRecyclePool<T, Step>::New()
134 T *rv = d->allocate();
139 template<typename T, int Step>
140 template<typename T1>
141 T *QRecyclePool<T, Step>::New(const T1 &a)
143 T *rv = d->allocate();
148 template<typename T, int Step>
149 template<typename T1>
150 T *QRecyclePool<T, Step>::New(T1 &a)
152 T *rv = d->allocate();
157 template<typename T, int Step>
158 void QRecyclePool<T, Step>::Delete(T *t)
161 QRecyclePoolPrivate<T, Step>::dispose(t);
164 template<typename T, int Step>
165 void QRecyclePoolPrivate<T, Step>::releaseIfPossible()
167 if (recyclePoolHold || outstandingItems)
170 Page *p = currentPage;
172 Page *n = p->nextPage;
180 template<typename T, int Step>
181 T *QRecyclePoolPrivate<T, Step>::allocate()
186 nextAllocated = rv->nextAllocated;
187 } else if (currentPage && currentPage->free) {
188 rv = (PoolType *)(currentPage->array + (Step - currentPage->free) * sizeof(PoolType));
191 Page *p = (Page *)qMalloc(sizeof(Page));
192 p->nextPage = currentPage;
196 rv = (PoolType *)currentPage->array;
205 template<typename T, int Step>
206 void QRecyclePoolPrivate<T, Step>::dispose(T *t)
208 PoolType *pt = static_cast<PoolType *>(t);
209 Q_ASSERT(pt->pool && pt->pool->cookie == QRECYCLEPOOLCOOKIE);
211 QRecyclePoolPrivate<T, Step> *This = pt->pool;
212 pt->nextAllocated = This->nextAllocated;
213 This->nextAllocated = pt;
214 --This->outstandingItems;
215 This->releaseIfPossible();
220 #endif // QRECYCLEPOOL_P_H