Make QRegion not need to be friends with QVector
[profile/ivi/qtbase.git] / src / gui / painting / qdatabuffer_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 QtGui 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 QDATABUFFER_P_H
43 #define QDATABUFFER_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 for the convenience
50 // of other Qt classes.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55
56 #include "QtCore/qbytearray.h"
57
58 #include <stdlib.h>
59
60 QT_BEGIN_NAMESPACE
61
62 template <typename Type> class QDataBuffer
63 {
64 public:
65     QDataBuffer(int res)
66     {
67         capacity = res;
68         if (res)
69             buffer = (Type*) malloc(capacity * sizeof(Type));
70         else
71             buffer = 0;
72         siz = 0;
73     }
74
75     ~QDataBuffer()
76     {
77         if (buffer)
78             free(buffer);
79     }
80
81     inline void reset() { siz = 0; }
82
83     inline bool isEmpty() const { return siz==0; }
84
85     inline int size() const { return siz; }
86     inline Type *data() const { return buffer; }
87
88     inline Type &at(int i) { Q_ASSERT(i >= 0 && i < siz); return buffer[i]; }
89     inline const Type &at(int i) const { Q_ASSERT(i >= 0 && i < siz); return buffer[i]; }
90     inline Type &last() { Q_ASSERT(!isEmpty()); return buffer[siz-1]; }
91     inline const Type &last() const { Q_ASSERT(!isEmpty()); return buffer[siz-1]; }
92     inline Type &first() { Q_ASSERT(!isEmpty()); return buffer[0]; }
93     inline const Type &first() const { Q_ASSERT(!isEmpty()); return buffer[0]; }
94
95     inline void add(const Type &t) {
96         reserve(siz + 1);
97         buffer[siz] = t;
98         ++siz;
99     }
100
101     inline void pop_back() {
102         Q_ASSERT(siz > 0);
103         --siz;
104     }
105
106     inline void resize(int size) {
107         reserve(size);
108         siz = size;
109     }
110
111     inline void reserve(int size) {
112         if (size > capacity) {
113             if (capacity == 0)
114                 capacity = 1;
115             while (capacity < size)
116                 capacity *= 2;
117             buffer = (Type*) realloc(buffer, capacity * sizeof(Type));
118         }
119     }
120
121     inline void shrink(int size) {
122         capacity = size;
123         if (size)
124             buffer = (Type*) realloc(buffer, capacity * sizeof(Type));
125         else {
126             free(buffer);
127             buffer = 0;
128         }
129     }
130
131     inline void swap(QDataBuffer<Type> &other) {
132         qSwap(capacity, other.capacity);
133         qSwap(siz, other.siz);
134         qSwap(buffer, other.buffer);
135     }
136
137     inline QDataBuffer &operator<<(const Type &t) { add(t); return *this; }
138
139 private:
140     int capacity;
141     int siz;
142     Type *buffer;
143 };
144
145 QT_END_NAMESPACE
146
147 #endif // QDATABUFFER_P_H