source: trunk/tools/porting/src/smallobject.h@ 769

Last change on this file since 769 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

File size: 4.7 KB
RevLine 
[2]1/****************************************************************************
2**
[561]3** Copyright (C) 2001-2004 Roberto Raggi
[651]4** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
[561]5** All rights reserved.
6** Contact: Nokia Corporation ([email protected])
[2]7**
8** This file is part of the qt3to4 porting application of the Qt Toolkit.
9**
10** $QT_BEGIN_LICENSE:LGPL$
11** Commercial Usage
12** Licensees holding valid Qt Commercial licenses may use this file in
13** accordance with the Qt Commercial License Agreement provided with the
14** Software or, alternatively, in accordance with the terms contained in
15** a written agreement between you and Nokia.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
[561]25** In addition, as a special exception, Nokia gives you certain additional
26** rights. These rights are described in the Nokia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
[2]28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file. Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
[561]37** If you have questions regarding the use of this file, please contact
38** Nokia at [email protected].
[2]39** $QT_END_LICENSE$
40**
41****************************************************************************/
42
43#ifndef SMALLOBJECT_H
44#define SMALLOBJECT_H
45
46#include <QList>
47
48#include <assert.h>
49#include <stdlib.h>
50#include <string.h>
51
52QT_BEGIN_NAMESPACE
53
54struct block_t
55{
56 static int N;
57
58 block_t *chain;
59 char *data;
60 char *ptr;
61 char *end;
62
63 inline void init(int block_size = 256)
64 {
65 ++N;
66 chain = 0;
67 data = (char*) malloc(block_size);
68 ptr = data;
69 end = data + block_size;
70 }
71
72 inline void init0(int block_size)
73 {
74 init();
75 memset(data, '0', block_size);
76 }
77
78 inline void destroy()
79 {
80 --N;
81 if (chain) {
82 chain->destroy();
83 free(chain);
84 }
85
86 free(data);
87 }
88
89 inline void *allocate(size_t size, block_t **right_most)
90 {
91 const unsigned int block_size = 1 << 16;
92 if (end < ptr + size) {
93 assert( size < block_size );
94
95 if (!chain) {
96 chain = (block_t*) malloc(sizeof(block_t));
97 Q_ASSERT(chain);
98 chain->init(block_size);
99 }
100
101 return chain->allocate(size, right_most);
102 }
103
104 char *r = ptr;
105 ptr += size;
106